Fundamentos do PHP
Processando formulários HTML com PHP
Aprenda sobre processando formulários html com php
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
GETePOSTpara envio de dados. - Como o PHP acessa os dados enviados através das superglobais
$_GETe$_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:
- O Formulário HTML: Onde o usuário insere os dados.
- 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ãoGETePOST.
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 scriptprocessa_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=valorapós um ponto de interrogação (?).- Ex:
processa_contato.php?nome=Joao&email=joao@exemplo.com
- Ex:
- 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çãoPOSTé 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 defilter_varpara mais detalhes).empty(): Verifica se uma variável está vazia (consideranull,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 umheader("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
actionemethodno elemento<form>, e o atributonamepara cada campo de entrada. - Métodos GET vs. POST: As diferenças e quando usar cada um, priorizando
POSTpara dados sensíveis e modificações no servidor. - Superglobais: Como
$_GETe$_POSTsão arrays associativos que contêm os dados enviados, e por que$_REQUESTdeve ser evitado. - Boas Práticas: A necessidade crítica de validar e sanitizar os dados de entrada usando funções como
trim(),htmlspecialchars()efilter_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. 💪