Nesta aula, vamos explorar como receber dados enviados por formulários HTML no PHP, utilizando as superglobais $_GET e $_POST. Esses arrays associativos são fundamentais para capturar informações do usuário e processá-las no servidor. Além disso, discutiremos a criação de formulários HTML, as diferenças entre os métodos GET e POST e algumas práticas iniciais de segurança para evitar vulnerabilidades comuns.

Dominar o recebimento de dados é essencial para construir aplicações web interativas, como sistemas de login, cadastro, pesquisas e muito mais. Vamos começar!

$_GET e $_POST

As superglobais $_GET e $_POST são arrays associativos que contêm os dados enviados por um formulário ou diretamente pela URL. A diferença principal está na forma como os dados são transmitidos:

  • $_GET: os dados são enviados na URL após o ponto de interrogação (ex.: ?nome=João&idade=25). É visível para o usuário e tem limite de tamanho (cerca de 2000 caracteres).
  • $_POST: os dados são enviados no corpo da requisição HTTP, não aparecendo na URL. Não há limite prático de tamanho e é mais seguro para dados sensíveis.

Para acessar um valor, usamos a chave correspondente, por exemplo: $_GET['nome'] ou $_POST['email']. Se a chave não existir, o PHP emitirá um aviso. Por isso, é recomendável verificar a existência com isset() ou usar o operador de coalescência nula (??).

<?php
// Supondo que o formulário tenha um campo 'nome'
$nome = $_POST['nome'] ?? 'Visitante';
echo "Olá, $nome!";
?>

Formulários HTML

Para enviar dados ao servidor, criamos um formulário HTML com os atributos action (URL de destino) e method (GET ou POST). Cada campo deve ter um atributo name que servirá como chave no array $_GET ou $_POST.

<form action="processa.php" method="POST">
    <label for="nome">Nome:</label>
    <input type="text" name="nome" id="nome" required>
    <br>
    <label for="email">E-mail:</label>
    <input type="email" name="email" id="email" required>
    <br>
    <button type="submit">Enviar</button>
</form>

No PHP, podemos processar os dados no arquivo processa.php:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nome = $_POST['nome'] ?? '';
    $email = $_POST['email'] ?? '';
    echo "Nome: $nome, E-mail: $email";
}
?>

Métodos

Os métodos GET e POST têm características distintas que influenciam a escolha:

  • GET: ideal para buscas e consultas, pois os parâmetros ficam na URL e podem ser bookmarked. Não use para alterar dados no servidor (efeitos colaterais). Exemplo: pesquisa.php?q=php.
  • POST: usado para envio de formulários que modificam dados (cadastro, login, upload). Os dados não ficam visíveis na URL e não há limite de tamanho.

Podemos verificar o método usado com $_SERVER['REQUEST_METHOD']. Além disso, é possível enviar dados via GET diretamente na URL sem formulário: <a href="pagina.php?id=10">Link</a>.

<?php
// Exemplo de uso de GET para paginação
$pagina = $_GET['pagina'] ?? 1;
echo "Exibindo página $pagina";
?>

Segurança inicial

Ao receber dados do usuário, devemos tomar cuidados básicos para evitar ataques como XSS (Cross-Site Scripting) e injeção de SQL. Algumas práticas:

  • Validar e sanitizar: use funções como filter_var() e htmlspecialchars() para limpar entradas.
  • Nunca confie nos dados: assuma que todo dado recebido é malicioso até prova contrária.
  • Use prepared statements para consultas ao banco de dados (veremos em aulas futuras).
<?php
// Sanitização de entrada
$nome = htmlspecialchars($_POST['nome'] ?? '', ENT_QUOTES, 'UTF-8');
$email = filter_var($_POST['email'] ?? '', FILTER_SANITIZE_EMAIL);

// Validação
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'E-mail inválido';
}
?>

Boas práticas

Sempre verifique se o formulário foi submetido antes de processar os dados, usando $_SERVER['REQUEST_METHOD']. Prefira POST para ações que alteram estado e GET para consultas. Utilize htmlspecialchars() ao exibir dados do usuário para prevenir XSS. Mantenha validações tanto no cliente (HTML5) quanto no servidor.

Referências

Exercícios

  1. Crie um formulário HTML que envie os campos 'nome' e 'idade' via método GET para a mesma página. No PHP, exiba os valores recebidos.
  2. ✓ Resposta:
    <?php
    $nome = $_GET['nome'] ?? '';
    $idade = $_GET['idade'] ?? '';
    echo "Nome: $nome, Idade: $idade";
    ?>
    <form action="" method="GET">
        Nome: <input type="text" name="nome"><br>
        Idade: <input type="number" name="idade"><br>
        <button type="submit">Enviar</button>
    </form>
  3. Modifique o exercício anterior para usar método POST e exiba os dados após o formulário.
  4. ✓ Resposta:
    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $nome = $_POST['nome'] ?? '';
        $idade = $_POST['idade'] ?? '';
        echo "Nome: $nome, Idade: $idade";
    }
    ?>
    <form action="" method="POST">
        Nome: <input type="text" name="nome"><br>
        Idade: <input type="number" name="idade"><br>
        <button type="submit">Enviar</button>
    </form>
  5. Crie um script PHP que receba via GET um parâmetro 'cor' e exiba um fundo colorido. Se não houver parâmetro, use branco.
  6. ✓ Resposta:
    <?php
    $cor = $_GET['cor'] ?? 'white';
    ?>
    <!DOCTYPE html>
    <html>
    <head><title>Cor</title></head>
    <body style="background-color: <?= htmlspecialchars($cor) ?>">
        <h1>Fundo colorido</h1>
    </body>
    </html>
  7. Implemente um formulário de login que valide se o campo 'usuario' não está vazio e exiba uma mensagem de boas-vindas. Use POST e sanitize a saída.
  8. ✓ Resposta:
    <?php
    $mensagem = '';
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $usuario = trim($_POST['usuario'] ?? '');
        if ($usuario === '') {
            $mensagem = 'Usuário não pode estar vazio.';
        } else {
            $usuarioSeguro = htmlspecialchars($usuario, ENT_QUOTES, 'UTF-8');
            $mensagem = "Bem-vindo, $usuarioSeguro!";
        }
    }
    ?>
    <form action="" method="POST">
        Usuário: <input type="text" name="usuario"><br>
        <button type="submit">Entrar</button>
    </form>
    <p><?= $mensagem ?></p>
  9. Explique a diferença entre GET e POST e cite um exemplo de uso adequado para cada.
  10. ✓ Resposta: GET envia dados na URL, visível e com limite de tamanho, adequado para consultas e buscas (ex.: pesquisa em site). POST envia dados no corpo da requisição, não aparece na URL, sem limite prático, adequado para formulários que alteram dados (ex.: cadastro de usuário).