Recebendo dados: GET e POST
Nesta aula, você aprenderá a receber dados enviados por formulários HTML utilizando os métodos GET e POST em PHP. Abordaremos as superglobais $_GET e $_POST, a criação de formulários HTML, as diferenças entre os métodos e práticas iniciais de segurança.
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()ehtmlspecialchars()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
- PHP Manual: $_GET
- PHP Manual: $_POST
- MDN: Métodos de requisição HTTP
- MDN: Enviando e recebendo dados de formulário
- OWASP: Cross-Site Scripting (XSS)
- PHP Manual: htmlspecialchars
- PHP Manual: filter_var
Exercícios
- 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.
- Modifique o exercício anterior para usar método POST e exiba os dados após o formulário.
- 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.
- 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.
- Explique a diferença entre GET e POST e cite um exemplo de uso adequado para cada.
<?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><?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><?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><?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>