Médio PHP

Validação de formulário POST

Enunciado

Crie um formulário HTML com campos nome e email enviados via POST. Valide se ambos foram preenchidos e se o e-mail tem formato válido. Exiba mensagens de erro ou uma mensagem de sucesso com os dados escapados.

Requisitos

  • Usar $_POST ou filter_input para obter os dados.
  • Validar se nome não está vazio.
  • Validar se email é um e-mail válido com FILTER_VALIDATE_EMAIL.
  • Exibir erros ou sucesso usando htmlspecialchars().

Código inicial

<?php
// Seu código aqui
?>
<!DOCTYPE html>
<html>
<body>
<form method="post">
    Nome: <input type="text" name="nome"><br>
    E-mail: <input type="text" name="email"><br>
    <button type="submit">Enviar</button>
</form>
</body>
</html>

Saída esperada

Sucesso! Nome: João, E-mail: joao@email.com
Ver dica

Use filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL). Ele retorna false se o e-mail for inválido.

Mostrar solução
<?php
// Inicializa variáveis e array de erros
$nome = $email = '';
$erros = [];
$sucesso = false;

// Verifica se o formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Obtém e filtra os dados
    $nome = trim($_POST['nome'] ?? '');
    $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

    // Validações
    if ($nome === '') {
        $erros[] = 'O nome é obrigatório.';
    }
    if ($email === false || $email === null) {
        $erros[] = 'E-mail inválido.';
    }

    // Se não houver erros, sucesso
    if (empty($erros)) {
        $sucesso = true;
    }
}
?>
<!DOCTYPE html>
<html>
<body>
    <?php if ($erros): ?>
        <ul style="color: red;">
            <?php foreach ($erros as $erro): ?>
                <li><?= htmlspecialchars($erro) ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif; ?>

    <?php if ($sucesso): ?>
        <p>Sucesso! Nome: <?= htmlspecialchars($nome) ?>, E-mail: <?= htmlspecialchars($email) ?></p>
    <?php endif; ?>

    <form method="post">
        Nome: <input type="text" name="nome" value="<?= htmlspecialchars($nome) ?>"><br>
        E-mail: <input type="text" name="email" value="<?= htmlspecialchars($email ?? '') ?>"><br>
        <button type="submit">Enviar</button>
    </form>
</body>
</html>

Passo a passo

  1. $nome = trim($_POST['nome'] ?? '') obtém o nome do POST, remove espaços extras e evita erro se não existir.
  2. filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) retorna o e-mail se válido, false se inválido, ou null se não enviado.
  3. As condições if verificam cada campo e adicionam mensagens ao array $erros.
  4. Se $erros estiver vazio, $sucesso vira true.
  5. No HTML, o foreach percorre $erros e exibe cada mensagem escapada.
  6. Se $sucesso, exibe os dados também escapados.
  7. Os campos do formulário são preenchidos com os valores anteriores (escapados) para não perder o que foi digitado.

Por que funciona

O PHP preenche $_POST apenas em requisições POST. Usar filter_input com FILTER_VALIDATE_EMAIL garante que o e-mail siga o formato esperado. A separação entre validação e exibição mantém o código organizado e seguro.

Erros comuns

  • Validar e-mail com regex caseira: preg_match('/@/', $email) aceita @ sozinho. Prefira FILTER_VALIDATE_EMAIL.
  • Não usar htmlspecialchars na exibição: um nome como <b>João</b> seria renderizado como negrito, podendo ser usado para injeção.
  • Confundir false com string vazia: filter_input retorna false para e-mail inválido, mas '' também é falsy. Compare com === false e verifique null.

Outra forma de resolver

Usar filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) diretamente:

$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);

É equivalente, mas filter_input é preferível por acessar a superglobal de forma mais segura.

Saída esperada

Sucesso! Nome: João, E-mail: joao@email.com