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
$_POSToufilter_inputpara obter os dados. - Validar se
nomenão está vazio. - Validar se
emailé um e-mail válido comFILTER_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
$nome = trim($_POST['nome'] ?? '')obtém o nome do POST, remove espaços extras e evita erro se não existir.filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)retorna o e-mail se válido,falsese inválido, ounullse não enviado.- As condições
ifverificam cada campo e adicionam mensagens ao array$erros. - Se
$errosestiver vazio,$sucessoviratrue. - No HTML, o
foreachpercorre$errose exibe cada mensagem escapada. - Se
$sucesso, exibe os dados também escapados. - 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. PrefiraFILTER_VALIDATE_EMAIL. - Não usar
htmlspecialcharsna exibição: um nome como<b>João</b>seria renderizado como negrito, podendo ser usado para injeção. - Confundir
falsecom string vazia:filter_inputretornafalsepara e-mail inválido, mas''também é falsy. Compare com=== falsee verifiquenull.
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