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

Problemas ao realizar consulta no banco de dados

Olá a todos. Estou com mais um problema meu código que não sei a solução. Eu executo um insert e imediatamente eu executo um select. O problema é que o select funciona certinho, mas se eu o faço logo após o insert, o meu select não funciona mais. Pelo que andei pesquisando parece que o mysqli tem algum tipo de cache que impede meu select de funcionar, ele só funciona se executado antes. Mas preciso executar o select logo depois do insert pois preciso dos dados atualizados. Alguém sabe se tenho que executar algum método para que o select funcione de forma correta depois do insert?

7 respostas

Oi Bruno, pode postar aqui como está o seu código, para que possamos entender melhor o que pode estar acontecendo?

//não funciona mas precisa
 if(insereCompraProdutosGrade($conexao,$id_compra,$sequencia,$gradePreenchida,$caixas)){
$quant_total = buscaQuantTotalCompraProduto($conexao,$id_compra,$sequencia);
//funciona mas não precisa
$quant_total = buscaQuantTotalCompraProduto($conexao,$id_compra,$sequencia);
 if(insereCompraProdutosGrade($conexao,$id_compra,$sequencia,$gradePreenchida,$caixas)){

Bruno,

Qual erro acontece ?

O select é executado e não devolve o registro recém-inserido, ou o select nem chega a executar ?

Pode postar também o código das suas funções buscaQuantTotalCompraProduto e insereCompraProdutosGrade ?

o select executa mas devolve um resultado nulo quando eu o faço logo após a inserção

function insereCompraProdutosGrade($conexao,$id_compra,$sequencia,$grades,$caixas){
    $query = "";
    foreach ($grades as $grade):
        $query.="INSERT INTO compras_itens_grade (id_compra,id_sequencia,tamanho,quantidade,quantidade_total) VALUES
        ({$id_compra},{$sequencia},{$grade->tamanho},{$grade->quantidade},{$grade->quantidade}*{$caixas});";
    endforeach;
    return mysqli_multi_query($conexao,$query);
}
function buscaQuantTotalCompraItem($conexao,$id_compra,$sequencia){
    $query = "SELECT SUM(quantidade_total) total where id_compra={$id_compra} and id_sequencia{$sequencia}";
    $resultado = mysqli_query($conexao,$query);
    $linha = mysqli_fetch_assoc($resultado);
    return $linha['total'];
}
solução!

Oi Bruno,

Eu simulei aqui e vi que o problema ocorre por conta do insert utilizando a função mysqli_multi_query.

Se você fizer o insert utilizando a função mysqli_query, funciona normalmente o select.

Deve ser alguma coisa específica dessa função multi_query.

Para resolver o problema você precisa alterar o código para não utilizar a função mysqli_multi_query, ou então precisa fechar a conexão após realizar os inserts, que funciona também:

function insereCompraProdutosGrade($conexao,$id_compra,$sequencia,$grades,$caixas){
    $query = "";
    foreach ($grades as $grade):
        $query.="INSERT INTO compras_itens_grade (id_compra,id_sequencia,tamanho,quantidade,quantidade_total) VALUES
        ({$id_compra},{$sequencia},{$grade->tamanho},{$grade->quantidade},{$grade->quantidade}*{$caixas});";
    endforeach;

    #precisa fechar a conexao por conta do multi_query:
    mysqli_close($conexao);
    return mysqli_multi_query($conexao,$query);
}

Só lembrando que desse jeito você precisará abrir a conexão novamente, antes de fazer o select:

if(insereCompraProdutosGrade($conexao,$id_compra,$sequencia,$gradePreenchida,$caixas)){
$conexao = mysqli_connect(SEUS_DADOS_DE_CONEXAO);
$quant_total = buscaQuantTotalCompraProduto($conexao,$id_compra,$sequencia);

Bons estudos!

Beleza Rodrigo. Fazendo dessa forma que você disse por último resolveu. Fiz no menu arquivo de conexão duas funções para fechar e abrir a conexão e antes de inserir e pesquisar eu fecho e abro as conexões. Me parece que se não faço isso o resultado da inserção ainda fica "na memória" da conexão.

Muito obrigado pela ajuda.

E nas pesquisas que faço caio muito nos exemplos de conexão orientadas a objetos. E como estava fazendo meu sistema muito baseado nas primeiras aulas de PHP, vejo que está tudo procedural e me parece que não é mais utilizado como boa prática. Compensa refazer tudo em PDO?

Oi Bruno,

No curso é mostrado primeiramente estrutrado, para que o foco seja no PHP em si, e não nos outros detalhes.

Mas sim, compensa migrar depois para utilizar o PDO, para que o código fique mais organizado e fácil de trocar de banco de dados no futuro.

Bons estudos!