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

Substituir while por for

Gostaria de saber se consigo substituir o while pelo for na listagem dos produtos. Tentei usar o for mas não deu certo.

<?php
    include 'cabecalho.php';
    include 'conexao.php';

$resultado = mysqli_query($conexao, "select * from produtos");
while($produto = mysqli_fetch_assoc($resultado)) {
    echo $produto['nome'] . "<br>";
}

?>
  <?php
    include 'rodape.php';
?>
8 respostas

Oi Marcelo, não vou dizer que é impossível, mas o trabalho com certeza não vale a pena. O for é muito bom quando você sabe quantas vezes este laço vai ser executado.

Perceba que o * dentro do select é um valor indefinido, você não consegue determinar ao certo quantos elementos virão.

Outro ponto é que a condição de execução do while é muito mais simples do que a do for. Ná prática, neste contexto, é incomum encontrar tal situação usando for. Mas a pergunta é pra saber como faria ou você pretende usar o for mesmo sendo bem mais complexo para o caso?

Minha pergunta era mais por curiosidade de como usar nesse caso. Você diz que é bom quando se sabe quantas vezes o laço será executado, mas nesse caso não seria o tamanho da query?

Não Marcelo, seria a quantidade de items retornados do banco de dados, que é um valor dinamico.

Eu não entendi o que quis dizer com "tamanho da query", pode me explicar?

No while enquanto tiver resultados na variável $produtos ele vai exibindo no echo correto?

Enquanto o valor da variavel $produto não for algo avaliado como FALSE, sim.

No for não poderia usar:

for($i = 0; $i < sizeof($produto); $i++)

Para saber o tamanho do array retornado? Se estou falando alguma coisa errada me corrija porque ainda estou me familiarizando com essas estruturas.

solução!

Sim, mas neste caso, voce esta verificando o tamanho de um produto. Mas e dos outros? A ideia gira em torno da funcao mysqli_fetch_assoc que percorre todos os resultados da tabela do banco de dados.

Executa o while a primeira vez e retorna o primeiro resultado, executa a segunda vez e retorna o segundo resultado. Evitando até mesmo o uso de contador.

No for, voce necessariamente um contador. O que eu acho que você poderia fazer é.

for($i = 0; $i < count(mysqli_fetch_assoc($resultado); $produto = mysqli_fetch_assoc($resultado); $i++))

Mas é uma complexidade desnecessaria e ainda por cima, torna o contador uma variavel de controle praticamente sem utilidade. No fim, ele conta por contar e não controla nenhum fluxo (o qual seria seu proposito).

Outro problema é que o contador vai chegar a um valor maior do que o tamanho do array de produto, parando a execução sem que todos os resutados sejam apresentados. Um problema que chega a ser imperceptivel e demoraria dias descobrir a causa.

Entendi. Minha dúvida era mesmo para saber se poderia fazer essa substituição, mas pelo que disse não seria o caso do uso do FOR.