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

Dúvida sobre lista de produtos e loop infinito

Qual é a diferença entre

include("includes/conexao.php");
$querySelecao = "SELECT * FROM produtos";
$queryResultado = mysqli_query($conexao, $querySelecao);
echo mysqli_error($conexao);

$acessandoProduto = mysqli_fetch_assoc($queryResultado);

while($acessandoProduto) {
  echo $acessandoProduto['nome'];
  echo $acessandoProduto['valor'];
}

E

include("includes/conexao.php");
$querySelecao = "SELECT * FROM produtos";
$queryResultado = mysqli_query($conexao, $querySelecao);
echo mysqli_error($conexao);

while($acessandoProduto = mysqli_fetch_assoc($queryResultado);) {
  echo $acessandoProduto['nome'];
  echo $acessandoProduto['valor'];
}

Porque o primeiro retorna loop infinito e o outro não?

6 respostas

Oi, Raphael! Tudo bem?

Então, a função mysqli_fetch_assoc() nos retorna o resultado da próxima linha do resultado da execução de nossa query SQL. Dessa forma, a primeira vez que rodamos essa função, temos a primeira linha, na segunda temos a segunda linha...

Como você fez no primeiro código, está definindo que a variável $acessandoProduto é igual à primeira linha do resultado da query SQL. Assim, com o while, você apenas está verificando se esse resultado é verdadeiro. A questão é que ele sempre vai ser, porque não está mudando!

Com o segundo código, a cada loop do while a variável $acessandoProduto muda para a próxima linha do retorno da query SQL. Quando não há mais linhas, o retorno é falso e o while acaba.

Deu pra entender mais ou menos, Raphael? Dá um feedback aqui! Abraços e bons estudos!

Eu não entendi muito bem. É o laço que muda o valor da variável no segundo caso?

Eu realmente não saquei o mecanismo que faz a variável assumir o valor da próxima linha.

fetch_assoc retorna um array, exemplo:

Array
(
    [name] => Mathews
    [age] => 23
)

Toda vez que o While for executado, uma linha é removida desse Array, ou seja, se ele rodar 3x irá dar false, pois o meu Array possui apenas dois resultados.

Então sua variável $acessandoProduto irá receber o valor false, fazendo com que saia do While.


Caso não tenha entendido, faça isto:

var_dump('antes', mysqli_fetch_assoc($queryResultado));

while($acessandoProduto = mysqli_fetch_assoc($queryResultado);) {
  echo $acessandoProduto['nome'];
  echo $acessandoProduto['valor'];
}

var_dump('depois', mysqli_fetch_assoc($queryResultado));

Agora eu entendi o funcionamento do mysqli_fetch_assoc, que é retornar um array contendo as linhas.

Só restou uma dúvida. Quem é que faz a remoção da linha, para então partir para a próxima?

solução!

Perceba que mysqli_fetch_assoc é um método. Toda a lógica é encapsulada por este método, sendo ele o responsável por fazer a remoção.


Você sabia que é possível fazer new mysqli e usa-lo de forma Object Oriented | Orientado a Objetos?

Caso queira obter mais informações: https://secure.php.net/manual/pt_BR/book.mysqli.php

Recomendo fortemente que comece a criar o hábito de ler a documentação do PHP e das tecnologias que estiver aprendendo.

Digo isto, pois eu não tenho muito este costume, entretanto, quando eu pesquiso na documentação, a possibilidade de encontrar a solução é quase 100% :)

Valeuzão pela ajuda e pela dica. Boa noite.