Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvidas sobre cadastro de produtos - continuação da discussão

Veja como fiz. O problema que consigo gerar o sql mas ele não executa. Insere somente o produto principal com o id certinho. Mas a grade não gera.

Se eu copiar a sql que imprimo e executar direto no banco da certinho. Mas pelo php só gera o retorno de "Erro grade".


if(insereProduto($conexao,$produto)){
    $id = localizaIdProduto($conexao);
    if(insereGradeProduto($conexao,$id,$_POST["min"],$_POST["max"])){
        echo "Sucesso grade.";
    }else{
        echo "Erro grade.";
    }
    $_SESSION["success"]="Produto cadastrado com sucesso";
}else{
    $_SESSION["danger"]="Erro ao cadastrar produto";
}

function localizaIdProduto($conexao){
    $query = "SELECT MAX(id) id from PRODUTOS";
    $consulta = mysqli_query($conexao,$query);
    $resultado = mysqli_fetch_assoc($consulta);
    return $resultado['id'];
}

function insereGradeProduto($conexao,$id,$min,$max){
    $query = "";
    for($i=$min;$i<=$max;$i++){
        $query.="INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES ({$id},{$i});";
    }
    echo $query;
    return mysqli_query($conexao, $query);
}
8 respostas

Será que tem a ver com o sql ficar dessa forma?

INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,33);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,34);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,35);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,36);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,37);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,38);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,39);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,40);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,41);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,42);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,43);INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES (45,44);
solução!

Era isso mesmo. Mudei a sql pra ser uma só. Parece que que não executa várias querys de uma vez só. Desculpem a abrição de tópicos. Mas eu pergunto quando não consigo pensar mais, mas vou pelejando até dar certo. Obrigado a todos. Só pra constar a minha solução:

function insereGradeProduto($conexao,$id,$min,$max){
    $query="";
    $query.="INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES";
    for($i=$min;$i<$max;$i++){
        $query.="({$id},{$i}),";
    }
    $query.="({$id},{$i});";
    return mysqli_query($conexao,$query);
}

Oi Bruno, ali onde tem "erro grade", você pode imprimir o erro que realmente aconteceu na conexão com o banco usando o código:

echo mysqi_error($conexao);

Meu chute é que talvez a query esteja ficando grande já que ela pode crescer infinitamente no seu loop. Querendo ou não, há um limite no tamanho da query que o cliente e o servidor suporta e esses valores podem ser diferentes.

Imprime o erro como eu disse acima pra gente ver o que pode estar acontecendo.

Puxa, cheguei atrasado e não vi a solução, desculpa Bruno, fico feliz que tenha resolvido.

Obrigado. Acabei que descobri uma forma mais simples ainda do php que retorna o último ID inserido de campos AUTO_INCREMENT . Achei importante compartilhar. Segue abaixo:

    $id = mysqli_insert_id($conexao);

Ótimo! Obrigado!

Tenho uma dica quanto a isso. Como o MySQL sabe qual é o próximo ID, você não precisa capturar esse valor a não ser que precise dele pra fazer alguma coisa. A única coisa que precisa fazer é verificar se criou o campo id como auto_increment.

Isso mesmo. Como esse tópico é continuação de um anterior que já havia sido respondido, a dúvida era como pegar o id para usar em uma tabela com registros "filhos". Igual você disse, eu só uso esse valor porque eu preciso imediatamente dele para outro registro. Abraço.

Entendi, bons estudos! Qualquer coisa, estamos por aqui!