HTML form: GET, POST, action e name com um exemplo PHP

O HTML <form> agrupa controles de entrada em um formulário enviado a um servidor. action seleciona o endereço de processamento e method seleciona o método de envio. GET coloca os valores na query da URL e POST coloca-os no corpo da requisição, mas o POST por si só não criptografa os dados.

Os papéis de action, method e name

action é o endereço que o navegador solicita. Se omitido, o formulário é enviado para o endereço do documento atual. O método padrão é get, adequado para pesquisas e recuperações que não alteram o estado. Criação e atualizações geralmente usam post, com autenticação, autorização e validação de solicitação do lado do servidor.

O id de um controle o identifica no documento e associa seu rótulo; name é a chave de dados enviada. Entradas comuns sem nome são omitidas, assim como controles desativados e botões de rádio ou caixas de seleção não marcados. Não aninhe um formulário dentro de outro.

Prepare o formulário completo de prática

Para verificar o servidor de recebimento também, abrir apenas um arquivo HTML não é suficiente. Crie uma pasta de prática vazia em um ambiente local com PHP 8.x instalado e salve ambos os arquivos abaixo nessa pasta. Este exemplo exibe valores recebidos; ele não armazena dados, envia e-mails ou modifica contas.

O primeiro arquivo é index.html. O segundo botão de envio usa formmethod para que os mesmos inputs possam ser comparados usando GET e POST.

<!doctype html>
<html lang="pt">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Prática de formulários GET e POST</title>
</head>
<body>
  <h1>Comparar métodos de requisição</h1>
  <form action="receive.php" method="get">
    <p>
      <label for="query">Termo de busca</label>
      <input type="text" id="query" name="q" maxlength="80" required>
    </p>
    <p>
      <label for="note">Nota</label>
      <textarea id="note" name="note" maxlength="300"></textarea>
    </p>
    <button type="submit">Verificar com GET</button>
    <button type="submit" formmethod="post">Verificar com POST</button>
    <button type="reset">Redefinir</button>
  </form>
</body>
</html>

O segundo arquivo é receive.php. Ele lê strings da coleção de inputs para o método de requisição e rejeita arrays ou comprimentos inválidos. A saída é escapada para seu contexto em HTML.

<?php
declare(strict_types=1);
header('Content-Type: text/html; charset=UTF-8');
$method = $_SERVER['REQUEST_METHOD'];
if ($method !== 'GET' && $method !== 'POST') {
    header('Allow: GET, POST');
    http_response_code(405);
    exit('Método de requisição não suportado.');
}
$input = $method === 'POST' ? $_POST : $_GET;
$q = $input['q'] ?? '';
$note = $input['note'] ?? '';
if (!is_string($q) || !is_string($note) || trim($q) === '' ||
    strlen($q) > 320 || strlen($note) > 1200) {
    http_response_code(400);
    exit('Confira as strings do termo de busca e da nota.');
}
function h(string $text): string {
    return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<!doctype html>
<html lang="pt">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Resultado recebido</title>
</head>
<body>
  <h1>Resultado recebido</h1>
  <p>Método de requisição: <?= h($method) ?></p>
  <p>Termo de busca: <?= h($q) ?></p>
  <p>Nota: <?= h($note) ?></p>
  <p><a href="index.html">Voltar ao formulário</a></p>
</body>
</html>

HTML maxlength e a verificação de comprimento do servidor usam medidas diferentes. Este exemplo de servidor limita os bytes com strlen; ele não reproduz uma política completa de contagem de caracteres. Valide entradas importantes de acordo com as regras reais de aplicação do servidor.

Execute o exemplo e compare GET com POST

Na pasta que contém ambos os arquivos, execute este comando e abra http://127.0.0.1:8000/index.html. Se o php não for encontrado, verifique o caminho de instalação e a configuração do PATH. O servidor embutido do PHP é para desenvolvimento local e prática, não para produção.

php -S 127.0.0.1:8000
  1. Submissões com um termo de pesquisa vazio são bloqueadas pela validação obrigatória.
  2. Digite HTML como o termo de pesquisa e Practice como a nota, depois envie com GET. A consulta da URL contém q e note, e a resposta mostra GET como o método.
  3. Volte ao formulário e digite os mesmos valores, depois envie com POST. Os valores de entrada não são adicionados à URL, e a resposta mostra POST. As ferramentas de desenvolvedor podem mostrar o corpo no painel Network.
  4. Envie <b>Practice</b> na nota. A resposta mostra as tags como texto, sem negrito. Depois, encerre o servidor com Ctrl+C no terminal.

Verifique os métodos de envio, segurança e falhas comuns

O conteúdo do POST permanece visível nas ferramentas de desenvolvedor e para o servidor; HTTPS é necessário para proteger os dados em trânsito. Consultas GET podem permanecer em endereços, histórico ou registros, então não coloque valores sensíveis, como senhas, nelas. As verificações HTML required e maxlength ajudam os usuários, mas não substituem a validação no servidor.

Formulários de upload de arquivos geralmente precisam de method="post" e enctype="multipart/form-data". A codificação padrão é application/x-www-form-urlencoded. O manuseio real de arquivos também exige verificações de tamanho, tipo e local de armazenamento, além deste exercício de entrada de string.

Para uma resposta 404, verifique o caminho de ação relativo e o nome do arquivo. Para valores ausentes, verifique o nome e se o servidor lê a coleção para o método de requisição correto. Defina explicitamente type="button" para botões de ação comuns para evitar envio acidental. Resetar restaura os padrões originais, em vez de sempre deixar os campos vazios. Consulte a referência de formulário MDN e o tutorial de formulários PHP.