Fundamentos do PHP

0/25 aulas0%
teoria

Processando formulários HTML com PHP

Aprenda sobre processando formulários html com php

30 min
Aula 1 de 5

Processando Formulários HTML com PHP

Olá, futuro desenvolvedor PHP! 👋 Nesta aula, vamos mergulhar em um dos aspectos mais fundamentais da interação web: o processamento de formulários HTML. Formulários são a porta de entrada para a coleta de dados de usuários, seja para um login, um cadastro, um comentário ou uma pesquisa. Aprender a processá-los com PHP é essencial para construir aplicações web dinâmicas e interativas.

1. Introdução: A Ponte entre o Usuário e o Servidor 🌉

Imagine que você está em um site e precisa preencher um formulário para criar uma conta. Você digita seu nome, email, senha e clica em "Enviar". O que acontece nos bastidores? É exatamente isso que vamos explorar!

Quando um usuário preenche e envia um formulário HTML, o navegador empacota as informações e as envia para um servidor web. O PHP, rodando nesse servidor, é o responsável por "desempacotar" esses dados, lê-los, validá-los e, finalmente, processá-los (salvar em um banco de dados, enviar um email, etc.).

Nesta aula, você aprenderá:

  • Como criar formulários HTML que se comunicam com scripts PHP.
  • A diferença entre os métodos GET e POST para envio de dados.
  • Como o PHP acessa os dados enviados através das superglobais $_GET e $_POST.
  • A importância da sanitização básica para a segurança.

Vamos começar! 🚀

2. Entendendo a Interação: HTML e PHP Juntos

Para que o PHP possa processar um formulário, precisamos de duas partes principais:

  1. O Formulário HTML: Onde o usuário insere os dados.
  2. O Script PHP: Onde os dados são recebidos e processados.

2.1. O Formulário HTML (<form>)

O elemento <form> é a base de qualquer formulário. Ele possui dois atributos cruciais:

  • action: Especifica a URL para onde os dados do formulário serão enviados quando ele for submetido. Geralmente, é o caminho para o seu script PHP que fará o processamento.
  • method: Define o método HTTP a ser usado para enviar os dados. Os dois métodos mais comuns são GET e POST.

Cada campo de entrada dentro do formulário (como <input>, <textarea>, <select>) deve ter um atributo name. Este name é a chave que o PHP usará para acessar o valor desse campo.

<!-- Exemplo de um formulário HTML básico -->
<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulário de Contato</title>
    <style>
        body { font-family: sans-serif; margin: 20px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input[type="text"], input[type="email"], textarea {
            width: 300px;
            padding: 8px;
            margin-bottom: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        input[type="submit"] {
            background-color: #4CAF50;
            color: white;
            padding: 10px 15px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
 
    <h1>Entre em Contato</h1>
 
    <form action="processa_contato.php" method="POST">
        <label for="nome">Nome:</label>
        <input type="text" id="nome" name="nome" required>
 
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" required>
 
        <label for="mensagem">Mensagem:</label>
        <textarea id="mensagem" name="mensagem" rows="5" required></textarea>
 
        <input type="submit" value="Enviar Mensagem">
    </form>
 
</body>
</html>

Neste exemplo:

  • action="processa_contato.php": Indica que os dados serão enviados para o script processa_contato.php.
  • method="POST": Os dados serão enviados usando o método POST.
  • name="nome", name="email", name="mensagem": São as chaves que o PHP usará para acessar os valores digitados.

2.2. Métodos GET vs. POST 🧐

A escolha do método é importante e depende do propósito do formulário.

2.2.1. Método GET

  • Como funciona: Os dados do formulário são anexados à URL como pares chave=valor após um ponto de interrogação (?).
    • Ex: processa_contato.php?nome=Joao&email=joao@exemplo.com
  • Visibilidade: Os dados são visíveis na barra de endereços do navegador e no histórico.
  • Limitações: Há um limite no tamanho dos dados que podem ser enviados (geralmente cerca de 2048 caracteres).
  • Uso ideal: Para formulários de pesquisa, filtros, ou quando o formulário não altera o estado do servidor (ou seja, é "idempotente"). É bom para quando você quer que o usuário possa favoritar ou compartilhar o link com os parâmetros da busca.
  • Segurança: Não use GET para enviar informações sensíveis (senhas, dados de cartão de crédito) porque elas ficam expostas na URL e nos logs do servidor.

2.2.2. Método POST

  • Como funciona: Os dados do formulário são enviados no corpo da requisição HTTP, não na URL.
  • Visibilidade: Os dados não são visíveis na barra de endereços.
  • Limitações: Não há limite prático para o tamanho dos dados.
  • Uso ideal: Para envio de informações sensíveis, upload de arquivos, ou quando o formulário altera o estado do servidor (criação de um novo registro, atualização, exclusão).
  • Segurança: Mais seguro que GET para dados sensíveis, pois não expõe os dados na URL. No entanto, não é imune a interceptação se a conexão não for HTTPS.

Recomendação: Para a maioria dos formulários que coletam dados de usuários (cadastro, contato, login), use o método POST.

3. As Superglobais do PHP: $_GET e $_POST

O PHP oferece variáveis especiais, chamadas superglobais, que estão sempre disponíveis em qualquer escopo e contêm informações úteis sobre a requisição HTTP. Para dados de formulários, as mais importantes são $_GET e $_POST.

3.1. $_GET

É um array associativo que contém todos os dados enviados via método GET. As chaves do array correspondem aos atributos name dos campos do formulário.

<?php
// Exemplo: processa_busca.php
// Se a URL for: processa_busca.php?termo=php&categoria=programacao
 
if (isset($_GET['termo'])) {
    $termoBusca = $_GET['termo'];
    $categoria = $_GET['categoria'] ?? 'todas'; // Usando null coalescing operator para valor padrão
 
    echo "Você buscou por: " . $termoBusca . " na categoria: " . $categoria;
} else {
    echo "Nenhum termo de busca foi fornecido.";
}
?>

3.2. $_POST

É um array associativo que contém todos os dados enviados via método POST. Assim como $_GET, as chaves correspondem aos atributos name dos campos do formulário.

<?php
// Exemplo: processa_contato.php
// Este script receberia os dados do formulário HTML que mostramos acima.
 
if ($_SERVER["REQUEST_METHOD"] == "POST") { // Verifica se a requisição foi via POST
    // Acessando os dados enviados pelo formulário
    $nome = $_POST['nome'];
    $email = $_POST['email'];
    $mensagem = $_POST['mensagem'];
 
    echo "Dados recebidos:<br>";
    echo "Nome: " . $nome . "<br>";
    echo "Email: " . $email . "<br>";
    echo "Mensagem: " . $mensagem . "<br>";
} else {
    echo "Este script deve ser acessado via método POST de um formulário.";
}
?>

3.3. $_REQUEST (Cuidado! ⚠️)

Existe também a superglobal $_REQUEST, que é um array associativo que contém o conteúdo de $_GET, $_POST e $_COOKIE.

Por que ter cuidado? Embora possa parecer conveniente, o uso de $_REQUEST é geralmente desencorajado pela documentação oficial do PHP e por boas práticas de segurança. Ele não distingue a origem dos dados, o que pode levar a vulnerabilidades (por exemplo, um atacante pode tentar sobrescrever um valor POST com um valor GET malicioso).

Recomendação: Prefira sempre usar $_GET ou $_POST diretamente, de acordo com o método de envio do seu formulário. Isso torna seu código mais claro e seguro.

4. Código de Exemplo Oficial (e Boas Práticas) 🛠️

A documentação do PHP enfatiza a importância de validar e sanitizar os dados recebidos de formulários. Isso é crucial para a segurança e integridade da sua aplicação.

  • Validação: Garantir que os dados estão no formato correto, são do tipo esperado e atendem a quaisquer outras regras de negócio (ex: email válido, senha com X caracteres).
  • Sanitização: Remover ou escapar caracteres especiais que poderiam ser usados para ataques (ex: Cross-Site Scripting - XSS).

Vamos refatorar nosso processa_contato.php com algumas boas práticas:

Arquivo: formulario_contato.html (ou .php, se quiser misturar HTML e PHP no mesmo arquivo para exibir o formulário e processar)

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulário de Contato</title>
    <style>
        body { font-family: sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 500px; margin: 30px auto; background-color: #fff; padding: 20px 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { text-align: center; color: #0056b3; }
        label { display: block; margin-bottom: 8px; font-weight: bold; color: #555; }
        input[type="text"], input[type="email"], textarea {
            width: calc(100% - 22px); /* Ajuste para padding e border */
            padding: 10px;
            margin-bottom: 15px;
            border: 1px solid #ddd;
            border-radius: 5px;
            font-size: 16px;
        }
        input[type="submit"] {
            background-color: #007bff;
            color: white;
            padding: 12px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 18px;
            width: 100%;
        }
        input[type="submit"]:hover {
            background-color: #0056b3;
        }
        .error { color: red; font-size: 0.9em; margin-top: -10px; margin-bottom: 10px; }
        .success { color: green; font-size: 1.1em; text-align: center; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Entre em Contato</h1>
 
        <!-- Exemplo: Exibindo mensagens de erro ou sucesso na mesma página -->
        <?php
        if (isset($_GET['status'])) {
            if ($_GET['status'] == 'success') {
                echo '<p class="success">✅ Mensagem enviada com sucesso!</p>';
            } elseif ($_GET['status'] == 'error') {
                echo '<p class="error">❌ Erro ao enviar mensagem. Por favor, preencha todos os campos.</p>';
            }
        }
        ?>
 
        <form action="processa_contato.php" method="POST">
            <label for="nome">Nome:</label>
            <input type="text" id="nome" name="nome" required placeholder="Seu nome completo">
 
            <label for="email">Email:</label>
            <input type="email" id="email" name="email" required placeholder="seu.email@exemplo.com">
 
            <label for="mensagem">Mensagem:</label>
            <textarea id="mensagem" name="mensagem" rows="6" required placeholder="Digite sua mensagem aqui..."></textarea>
 
            <input type="submit" value="Enviar Mensagem">
        </form>
    </div>
</body>
</html>

Arquivo: processa_contato.php

<?php
// 1. Verifica se a requisição foi feita via método POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
 
    // 2. Inicializa um array para armazenar erros
    $erros = [];
 
    // 3. Coleta e sanitiza os dados
    // trim(): Remove espaços em branco do início e fim da string
    // htmlspecialchars(): Converte caracteres especiais em entidades HTML para prevenir XSS
    // FILTER_SANITIZE_EMAIL: Filtra o email para remover caracteres ilegais (PHP 5.2+)
    // FILTER_VALIDATE_EMAIL: Valida o email (PHP 5.2+)
 
    $nome = trim($_POST['nome'] ?? ''); // O operador ?? (null coalescing) garante que a variável exista, evitando warnings
    $email = trim($_POST['email'] ?? '');
    $mensagem = trim($_POST['mensagem'] ?? '');
 
    // 4. Validação básica
    if (empty($nome)) {
        $erros[] = "O campo Nome é obrigatório.";
    }
 
    if (empty($email)) {
        $erros[] = "O campo Email é obrigatório.";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { // Valida o formato do email
        $erros[] = "Por favor, insira um endereço de email válido.";
    }
 
    if (empty($mensagem)) {
        $erros[] = "O campo Mensagem é obrigatório.";
    }
 
    // Se não houver erros, processa os dados
    if (empty($erros)) {
        // Sanitização final para exibição ou armazenamento seguro
        $nomeSeguro = htmlspecialchars($nome, ENT_QUOTES, 'UTF-8');
        $emailSeguro = htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
        $mensagemSegura = htmlspecialchars($mensagem, ENT_QUOTES, 'UTF-8');
 
        // Aqui você faria o processamento real:
        // - Salvar no banco de dados
        // - Enviar um email
        // - etc.
        // Por exemplo, apenas exibimos os dados processados para fins de demonstração:
        echo "<h1>Dados Recebidos e Processados com Sucesso!</h1>";
        echo "<p><strong>Nome:</strong> " . $nomeSeguro . "</p>";
        echo "<p><strong>Email:</strong> " . $emailSeguro . "</p>";
        echo "<p><strong>Mensagem:</strong> " . nl2br($mensagemSegura) . "</p>"; // nl2br para quebrar linhas em HTML
 
        // Redireciona de volta para o formulário com uma mensagem de sucesso
        header("Location: formulario_contato.html?status=success");
        exit(); // Importante para garantir que o redirecionamento ocorra
    } else {
        // Se houver erros, exibe-os ou redireciona de volta ao formulário com os erros
        echo "<h1>Erros no Formulário:</h1>";
        echo "<ul>";
        foreach ($erros as $erro) {
            echo "<li>" . $erro . "</li>";
        }
        echo "</ul>";
        // Redireciona de volta para o formulário com uma mensagem de erro
        header("Location: formulario_contato.html?status=error");
        exit();
    }
 
} else {
    // Se alguém tentar acessar processa_contato.php diretamente sem submeter o formulário
    echo "Acesso inválido. Por favor, use o formulário para enviar dados.";
}
?>

Explicação do código PHP:

  • $_SERVER["REQUEST_METHOD"] == "POST": Esta é uma verificação importante para garantir que o script só seja executado quando uma requisição POST é feita, evitando acesso direto indesejado.
  • trim(): Remove espaços em branco do início e do fim das strings. Isso ajuda a padronizar os dados e evita que espaços extras sejam considerados parte do valor.
  • htmlspecialchars($string, ENT_QUOTES, 'UTF-8'): Esta função é crucial para a segurança. Ela converte caracteres especiais (<, >, &, ", ') em entidades HTML. Isso impede que código malicioso (como scripts JavaScript) seja injetado e executado no navegador de outros usuários (ataque XSS).
    • ENT_QUOTES: Garante que aspas simples e duplas sejam convertidas.
    • 'UTF-8': Define a codificação para evitar problemas com caracteres acentuados.
  • filter_var($email, FILTER_VALIDATE_EMAIL): Esta é uma função PHP de validação nativa e muito útil. Ela verifica se a string fornecida corresponde a um formato de e-mail válido. Existem outros filtros para URLs, inteiros, etc. (veja a documentação de filter_var para mais detalhes).
  • empty(): Verifica se uma variável está vazia (considera null, 0, "", [] como vazios). Ótimo para campos obrigatórios.
  • header("Location: ..."): Usado para redirecionar o navegador do usuário para outra página. É comum redirecionar após um POST bem-sucedido (Post/Redirect/Get pattern) para evitar que o usuário reenvie o formulário acidentalmente ao atualizar a página.
  • exit(): Deve ser chamado após um header("Location: ...") para garantir que o script pare de executar imediatamente e o redirecionamento ocorra.

5. Resumo e Próximos Passos 📚

Nesta aula, você aprendeu os fundamentos essenciais para processar formulários HTML com PHP:

  • HTML Form: A importância dos atributos action e method no elemento <form>, e o atributo name para cada campo de entrada.
  • Métodos GET vs. POST: As diferenças e quando usar cada um, priorizando POST para dados sensíveis e modificações no servidor.
  • Superglobais: Como $_GET e $_POST são arrays associativos que contêm os dados enviados, e por que $_REQUEST deve ser evitado.
  • Boas Práticas: A necessidade crítica de validar e sanitizar os dados de entrada usando funções como trim(), htmlspecialchars() e filter_var() para garantir a segurança e integridade da sua aplicação.

Com este conhecimento, você está apto a criar formulários básicos e processar seus dados de forma segura.

Próximos Passos:

  • Validação Avançada: Explore mais filtros com filter_var() e comece a construir suas próprias funções de validação mais complexas.
  • Persistência de Dados: Aprenda a armazenar os dados processados em um banco de dados (ex: MySQL com PDO ou MySQLi).
  • Upload de Arquivos: Descubra como lidar com uploads de arquivos usando $_FILES.
  • Proteção CSRF: Entenda e implemente a proteção contra Cross-Site Request Forgery (CSRF) para formulários que realizam ações críticas.

Continue praticando e explorando! A interação com formulários é a espinha dorsal de muitas aplicações web. 💪

© 2025 Escola All Dev. Todos os direitos reservados.

Processando formulários HTML com PHP - Fundamentos do PHP | escola.all.dev.br