[RESOLVIDO] Form Dentro do While PHP

Bom dia.
Dentro de um while, tem uma sequência de código html que se repete por causa do while abrir antes dela e a chave fechar em outra super tag após o código html.
O problema é que dois submits das duas últimas linhas funcionam, mas o primeiro não.

Você não pode ter o seguinte trecho de código html

<form>
 <form></form> // problem
 <form></form> // problem
</form>

ai está o problema do seu código html, cada form é exclusivo, não pode ter essa codificação.

Como não sei o proposito o problema foi dito, agora precisa saber porque você fez assim!?

2 curtidas

Agora
Resolveu. Muito obrigado.

Antes
O que me sugere: fechar ela antes do segundo form?

Você precisa definir o que o seu <form> precisa conter dentro, ele só não pode conter<form> dentro de <form> !!!

A idéia é fechar antes do segundo form, mas, verifique também todas estrutura HTML do seu arquivo não pode fechar em lugar errado. OK!

2 curtidas

O ideal mesmo é você não sobrecarregar o html com tantos forms apenas para mandar um campo, além do mais, apesar do method poder usar get, o ideal é usar post, mas enfim, um jeito bem mais simples e intuitivo na minha opinião seria no td onde tem form você deixar…

<td>
    <input type="button" name="comprar" value="Comprar" onclick="comprar(<?php echo $id; ?>)">
</td>

E lá no fim do html, antes do body colocar uma função js…

        <script>
        function comprar(id) {
            window.location.href = 'carrinho.php?id_txt=' + id;
        }
        </script>
    </body>
</html>

Isso terá o mesmo efeito do form usando get, evita conflito de form dentro de form, e você ainda reaproveita código da função, se quiser mudar a regra muda somente nela e não em cada form como antes… boa sorte!

Agora se me permite algumas dicas de manutenção de código e até boas práticas: evite misturar tanto html com php usando regras de banco no meio do html, já que você precisa ir no banco pode fazer sua query logo no começo da página assim:

<?php
include 'conecta.php';

$sql = "SELECT * FROM produtos";
        
if (isset($_POST['buscar'])){
    $sql = "SELECT * FROM produtos WHERE nome LIKE '%{$_POST['buscar']}%';";
}

$consulta = mysqli_query($conexao, $sql) or die("Erro.");
$linhas = mysqli_fetch_all($consulta, MYSQLI_ASSOC);
mysqli_free_result($consulta);
mysqli_close($conexao);
?>

Depois no html olha um jeito legal de misturar sem tanta lógica de php no meio:

<?php foreach ($linhas as $linha): ?>
    <tr id="dados">
        <td><?=$linha['id']?></td>
        <td><img id="foto" src="<?=$linha['imagem']?>"/></td>
        <td><?=$linha['nome']?></td>
        <td class="quantidade"><?=$linha['descricao']?></td>
        <td>R$ <?=number_format($linha['preco'], 2, ',', '.')?></td>
        <td class="quantidade"><?=$linha['quantidade']?></td>
        <td><?=$linha['data']?></td>
        <td>
            <input type="button" name="comprar" value="Comprar" onclick="comprar(<?=$linha['id']?>)">
        </td>
    </tr>
<?php endforeach; ?>

Algumas explicações:

Mudei um pouco sua query, de forma que você perceba como pode otimizar sua lógica e economizar chamadas de função (mysqli_query), atente-se também a forma que montei a query dentro do if com o $_POST, essa sintaxe é permitida em php… (obs: sua query ainda está vulnerável a sql injection, pesquise mais a respeito no futuro, não mostrarei nada agora para não te travar no aprendizado…)

A função mysqli_fetch_all pega tudo da base de uma vez, sem precisar de um while, for, etc, perceba que não há mysql_fetch_assoc nesse modelo que te mostrei…

Sempre que abrir uma conexão com o banco (recurso externo), não esqueça de fechá-la o quanto antes após o uso, por isso inclui o mysqli_close

O foreach tem a mesma função do while, for, etc, a vantagem que ele foi feito para interagir diretamente com array, como a variável $linhas em tese terá todos os produtos, o foreach irá percorrê-lo normalmente, se o array estiver vazio ele simplesmente não trabalha…

Mudei um pouco a forma como incluir as variáveis no html, a meu ver é desnecessário gastar memória como $id = $linha[‘id’] etc, mas vai de cada um obviamente…

O comando <?= é um atalho para <?php echo… e já vem ativado para versões do php >=5.4 encurtando a sintaxe (se sua versão de php for <=5.3 você precisa habilitar o short_open_tag no php.ini e reiniciar o servidor apache/nginx etc, pesquise a respeito)

A função number_format por si só já mostra como formatar dinheiro/moeda, onde o 2 indicado já representa as duas casas decimais após ponto, a virgula significa qual será o ponto decimal da formatação e o ponto será o milhar caso o preço ultrapasse os 999,99 reais…

E pra finalizar, o foreach tem um terminador diferente sendo o endforeach (while tem seu endwhile, for tem seu endfor, if tem seu endif, etc…) isso é uma sintaxe do php indicada para misturar php com html de forma a facilitar leitura, evitando usar <?php } ?> afinal se isso estiver muitas vezes no código é facil se perder… no mais vai brincando, aprendendo mais sobre a linguagem e usando seus melhores recursos…

Desculpe o post longo, mas são pontos que se você começar a corrigí-los/aplicá-los o quanto antes, só terá a ganhar com isso e a equipe que você entrar agradece, bons estudos!

1 curtida