Entendendo as Superglobais do PHP: $_POST
Aprenda o que é $_POST no PHP, como ler dados de formulários com segurança, diferenças em relação ao $_GET e como lidar com formulários completos.
As superglobais do PHP são variáveis integradas que estão sempre disponíveis em todos os escopos de um script — você nunca precisa declará-las com global nem passá-las como argumentos. Elas expõem informações essenciais, como entrada do usuário, detalhes do servidor e variáveis de ambiente. Uma das mais utilizadas é $_POST, o array que o PHP preenche com os dados enviados no corpo de uma requisição HTTP POST.
Este capítulo explica o que é $_POST, como ler valores de forma segura, como ele difere do $_GET e como lidar com um formulário real de ponta a ponta. Para uma visão mais ampla dos arrays relacionados, consulte superglobais do PHP.
O Que É $_POST?
$_POST é um array associativo que coleta os dados de formulários enviados com method="post". O navegador coloca cada campo no corpo da requisição (não na URL), e o PHP analisa esse corpo em $_POST antes que seu script seja executado. As chaves são os atributos name dos controles do formulário, e os valores são o que o usuário digitou.
Como os dados trafegam no corpo da requisição, $_POST é a escolha certa para dados sensíveis ou de grande volume (senhas, textos longos, uploads de arquivos), para ações que alteram o estado do servidor e sempre que você não quiser que os valores apareçam na URL ou no histórico do navegador.
$_POST vs $_GET
Ambos os arrays carregam entrada do usuário, mas correspondem a métodos HTTP diferentes e possuem características distintas.
$_POST | $_GET | |
|---|---|---|
| Localização dos dados | Corpo da requisição | String de consulta da URL (?key=value) |
| Visível na URL | Não | Sim |
| Favorito / cacheável | Não | Sim |
| Uso típico | Login, criar/atualizar, uploads | Busca, filtros, paginação |
| Limite de tamanho | Grande (configurável no servidor) | Limitado pelo comprimento da URL |
Use POST quando a requisição altera dados ou contém informações sensíveis; use GET para leituras seguras e repetíveis. Consulte $_GET para o equivalente, ou $_REQUEST se precisar de ambos.
Como Ler um Valor
Acesse um valor pelo nome do campo, da mesma forma que faria com qualquer chave de array:
$username = $_POST['username'];$_POST só é preenchido após o envio de um formulário com POST. No primeiro carregamento da página, ele é um array vazio, portanto, ler uma chave inexistente gera um aviso. Sempre verifique se uma chave existe primeiro — use isset() ou o operador de coalescência nula do PHP 7+ para fornecer um valor padrão:
<?php
// Safe: never errors, falls back to an empty string
$username = $_POST['username'] ?? '';
if ($username === '') {
echo "Username is required.";
} else {
echo "Hello, " . htmlspecialchars($username);
}
?>O operador de coalescência nula ?? retorna o valor do lado direito sempre que o lado esquerdo estiver indefinido ou for null, que é exatamente o caso antes de o formulário ser enviado.
Segurança: Nunca Confie na Entrada do Usuário
Tudo em $_POST vem do cliente e pode ser falsificado. Duas regras mantêm você seguro:
- Escape na saída. Passe qualquer valor por
htmlspecialchars()antes de exibi-lo em uma página para evitar cross-site scripting (XSS). - Valide e sanitize na entrada. Use
filter_var()para verificar formatos (e-mail, inteiro, URL) e use prepared statements para consultas ao banco de dados para evitar injeção de SQL — nunca concatene valores de$_POSTdiretamente em SQL.
<?php
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email address.";
}
?>Exemplo: Um Formulário de Contato Completo
O formulário abaixo envia três campos para contact.php usando o método POST. Cada controle tem um name único, que se torna sua chave em $_POST.
<form action="contact.php" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" />
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
<label for="message">Message:</label>
<textarea id="message" name="message"></textarea>
<input type="submit" value="Submit" />
</form>Em contact.php, primeiro confirme que a requisição realmente usou POST (para que o mesmo arquivo também possa servir o formulário vazio), depois leia, valide e faça o escape de cada valor:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
$errors = [];
if ($name === '') { $errors[] = "Name is required."; }
if ($email === false) { $errors[] = "A valid email is required."; }
if ($message === '') { $errors[] = "Message cannot be empty."; }
if (!$errors) {
// Safe to use the data — e.g. send an email or save to the database
echo "Thanks, " . htmlspecialchars($name) . "! Your message was received.";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error) . "<br>";
}
}
}
?>Verificar $_SERVER['REQUEST_METHOD'] é a forma padrão de determinar se o usuário está visualizando o formulário ou enviando-o. Para um guia mais detalhado, consulte tratamento de formulários em PHP e validação de formulários em PHP.
Lendo Múltiplos Valores
Quando vários controles compartilham um nome terminado em [] (checkboxes, multi-selects), o PHP os transforma em um array aninhado:
<input type="checkbox" name="colors[]" value="red">
<input type="checkbox" name="colors[]" value="green"><?php
$colors = $_POST['colors'] ?? []; // e.g. ['red', 'green']
foreach ($colors as $color) {
echo htmlspecialchars($color) . "\n";
}
?>Observe que um checkbox desmarcado não envia nada — portanto, colors pode estar completamente ausente, razão pela qual o padrão ?? [] é importante.
Conclusão
$_POST é o principal recurso para receber dados de formulários enviados no corpo da requisição. Ler a partir dele é tão simples quanto indexar um array, mas o código em produção deve sempre proteger contra chaves ausentes com ?? ou isset(), validar a entrada com filter_var() e fazer o escape da saída com htmlspecialchars(). Combinados com prepared statements para qualquer trabalho com banco de dados, esses hábitos permitem que você aceite entrada do usuário sem expor sua aplicação a XSS ou injeção de SQL.