W3docs

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 dadosCorpo da requisiçãoString de consulta da URL (?key=value)
Visível na URLNãoSim
Favorito / cacheávelNãoSim
Uso típicoLogin, criar/atualizar, uploadsBusca, filtros, paginação
Limite de tamanhoGrande (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 $_POST diretamente 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.

Prática

Prática
Para que serve o método 'POST' no PHP?
Para que serve o método 'POST' no PHP?
Was this page helpful?