Resumo : neste tutorial, você aprenderá como funcionam os formulários HTML e como processar dados de formulários em PHP.
Introdução ao processamento de formulários PHP
Para criar um formulário, você usa o <form>
elemento da seguinte forma:
<form action="form.php" method="post">
</form>
Linguagem de código: HTML, XML ( xml )
O <form>
elemento tem dois atributos importantes:
action
: especifica a URL que processa o envio do formulário. Neste exemplo, oform.php
irá processar o formulário.method
: especifica o método HTTP para enviar o formulário. Os métodos de formulário mais comumente usados sãoPOST
eGET
. Neste exemplo, o método de formulário épost
.
O método de formulário não diferencia maiúsculas de minúsculas. Isso significa que você pode usar post
ou POST
. Se você não especificar o atributo method, o elemento form usará o get
método por padrão.
Normalmente, um formulário possui um ou mais elementos de entrada, incluindo texto, senha, caixa de seleção , botão de opção , seleção , upload de arquivo , etc. Os elementos de entrada costumam ser chamados de campos de formulário.
Um elemento de entrada possui os seguintes atributos importantes name
,, type
e value
. O name
atributo será utilizado para acessar o value
em PHP.
Método HTTP POST
Se um formulário usar o POST
método, o navegador incluirá os dados do formulário no corpo da solicitação HTTP. Após enviar o formulário, você pode acessar os dados do formulário através do array associativo $_POST
em PHP.
Por exemplo, se um formulário tiver um elemento de entrada com o nome email
, você poderá acessar o valor email em PHP por meio do arquivo $_POST['email']
. Se o formulário não tiver entrada de email, $_POST
não terá nenhum elemento com a chave 'email'
.
Para verificar se os dados do formulário contêm o e-mail, use o isset()
seguinte:
<?php
if(isset($_POST['email']) {
// process email
}
Linguagem de código: HTML, XML ( xml )
O seguinte mostra um formulário com um elemento de entrada:
<form action="form.php" method="post">
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
</div>
<button type="submit">Submit</button>
</form>
Linguagem de código: HTML, XML ( xml )
No form.php
arquivo, você pode acessar o valor do email da seguinte forma:
<?php
if (isset($_POST['email'])) {
var_dump($_POST['email']);
}
Linguagem de código: HTML, XML ( xml )
Método HTTP GET
Ao enviar um formulário usando o GET
método, você pode acessar os dados do formulário em PHP por meio do array associativo $_GET
.
Ao contrário do POST
método, o GET
método anexa os dados do formulário na URL que processa o formulário. Suponha que a URL que processa o formulário seja http://localhost/form.php
. Ao inserir o e-mail como [email protected]
e enviar um formulário, você verá que o valor do e-mail é anexado ao URL assim:
http://localhost/form.php?email=hello%40tutorials.acervolima.com
Linguagem de código: texto simples ( texto simples )
Observe que @ está codificado como% 40 no URL.
Em PHP, você pode usar o isset()
para verificar se os dados do formulário contêm o email:
<?php
if(isset($_GET['email']) {
// process email
}
Linguagem de código: HTML, XML ( xml )
Se o formulário tiver vários elementos de entrada, o navegador anexará as entradas do formulário ao URL no seguinte formato:
http://localhost/form.php?name1=value1&name2=value2&name3=value3
Linguagem de código: texto simples ( texto simples )
O seguinte mostra o mesmo formulário que possui uma entrada de e-mail. No entanto, o formulário usa o método GET:
<form action="form.php" method="get">
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
</div>
<button type="submit">Submit</button>
</form>
Linguagem de código: HTML, XML ( xml )
E o seguinte mostra o form.php
arquivo:
<?php
if (isset($_GET['email'])) {
var_dump($_GET['email']);
}
Linguagem de código: HTML, XML ( xml )
Observe que ambos os arrays $_POST
e $_GET
são variáveis superglobais. Isso significa que você pode acessá-los em qualquer lugar do script.
HTTP GET ou POST
Em geral, você deve usar o GET
método quando o formulário recupera apenas dados do servidor. Por exemplo, um formulário de pesquisa que permite aos usuários pesquisar informações deve usar o GET
método.
Quando você tem um formulário que causa uma alteração no servidor, você deve usar o POST
método. Por exemplo, um formulário que permite aos usuários assinar um boletim informativo deve usar o POST
método.
Exemplo de formulário PHP
O seguinte index.php
contém um formulário que permite aos usuários assinar um boletim informativo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="css/style.css">
<title>PHP Form Demo</title>
</head>
<body>
<main>
<form action="subscribe.php" method="post">
<div>
<label for="name">Name:</label>
<input type="text" name="name" required="required" placeholder="Enter your name" />
</div>
<div>
<label for="name">Email:</label>
<input type="email" name="email" required="required" placeholder="Enter your email" />
</div>
<button type="submit">Subscribe</button>
</form>
</main>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
O formulário usa o POST
método e envia os dados para a subscribe.php
página. Possui dois elementos de entrada com type text
e email
.
Antes de enviar o formulário ao servidor, o navegador verifica se todos os campos obrigatórios estão preenchidos, no formato correto. Isso é conhecido como validação de formulário do lado do cliente.
Para validar dados no lado do cliente, você pode usar a validação de formulário HTML5 ou a validação JavaScript. No entanto, você nunca deve confiar na validação do lado do cliente como medida de segurança.
O objetivo da validação do lado do cliente é ajudar os usuários legítimos a inserir dados no formato correto. No entanto, isso não impede que usuários mal-intencionados insiram dados incorretos que possam prejudicar o aplicativo. Portanto, é obrigatório implementar a validação do lado do servidor.
A seguir mostra o código do subscribe.php
arquivo:
<?php
//---------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//---------------------------------------------
if (isset($_POST['name'], $_POST['email'])) {
$name = $_POST['name'];
$email = $_POST['email'];
// show the $name and $email
echo "Thanks $name for your subscription.<br>";
echo "Please confirm it in your inbox of the email $email.";
} else {
echo 'You need to provide your name and email address.';
}
Linguagem de código: PHP ( php )
Como funciona.
- Primeiro, verifique se o nome e o email estão no
$_POST
array usando aisset()
função. - Em segundo lugar, mostre uma mensagem de agradecimento.
Se você inserir o nome como John
e o e-mail como [email protected]
, verá a seguinte mensagem na subscribe.php
página:
Thanks John for your subscription.
Please confirm it in your inbox of the email [email protected]
Linguagem de código: texto simples ( texto simples )
Escapando da saída
A subscribe.php
página exibe diretamente os dados do formulário. Se hackers mal-intencionados inserirem intencionalmente dados incorretos, a página não funcionará corretamente.
Por exemplo, se o seguinte código JavaScript for inserido no name
campo e o formulário for enviado.
<script>alert('Hello');</script>
Linguagem de código: HTML, XML ( xml )
…você verá que a página exibe um alerta .
Imagine que o script não mostre apenas um alerta, mas carregue o código malicioso de outro servidor para o navegador do usuário, o risco é maior. Esse tipo de ataque é chamado de ataque de cross-site scripting (XSS) .
Portanto, antes de exibir a entrada do usuário em uma página da web, você deve sempre escapar dos dados. Para fazer isso, você usa a htmlspecialchars()
função:
<?php
//---------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//---------------------------------------------
if (isset($_POST['name'], $_POST['email'])) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
// show the $name and $email
echo "Thanks $name for your subscription.<br>";
echo "Please confirm it in your inbox of the email $email.";
} else {
echo 'You need to provide your name and email address.';
}
Linguagem de código: PHP ( php )
Observe que também mostraremos como higienizar e validar os dados do formulário no próximo tutorial .
Formulário de autoprocessamento PHP
Às vezes, você deseja incluir o formulário e a lógica para lidar com o envio de formulários em um único arquivo PHP. Este formulário é frequentemente referido como formulário de autoprocessamento.
Para criar um formulário de autoprocessamento, você pode usar o $_SERVER['REQUEST_METHOD']
que retorna o método de solicitação, por exemplo, GET
ou POST
.
Se $_SERVER['REQUEST_METHOD']
for GET, você mostra o formulário. E se $_SERVER['REQUEST_METHOD']
for POST, você o processa. Por exemplo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>PHP Form</title>
</head>
<body>
<main>
<?php if ($_SERVER['REQUEST_METHOD'] === 'GET') : ?>
<form action="<?php htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
<div>
<label for="name">Name:</label>
<input type="text" name="name" required="required" placeholder="Enter your name" />
</div>
<div>
<label for="name">Email:</label>
<input type="email" name="email" required="required" placeholder="Enter your email" />
</div>
<button type="submit">Subscribe</button>
</form>
<?php else : ?>
<?php
//---------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//---------------------------------------------
if (isset($_POST['name'], $_POST['email'])) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
// show the $name and $email
echo "Thanks $name for your subscription.<br>";
echo "Please confirm it in your inbox of the email $email.";
} else {
echo 'You need to provide your name and email address.';
}
?>
<?php endif ?>
</main>
</body>
</html>
Linguagem de código: PHP ( php )
No entanto, misturar PHP e HTML nem sempre é uma boa prática.
Para tornar o código mais organizado, você pode criar a seguinte estrutura de arquivos e diretórios:
.
├── css
│ └── style.css
├── inc
│ ├── header.php
│ ├── footer.php
│ ├── get.php
│ ├── post.php
│ └── .htaccess
└── index.php
Linguagem de código: texto simples ( texto simples )
O index.php
arquivo no diretório raiz incluirá os header.php
e footer.php
.
Se o método de solicitação for GET
, o index.php
arquivo carrega o formulário no get.php
arquivo. Caso contrário, carrega o código do post.php
arquivo para processar a POST
solicitação.
index.php
O seguinte mostra o index.php
arquivo:
<?php
require __DIR__ . '/inc/header.php';
$request_method = strtoupper($_SERVER['REQUEST_METHOD']);
if ($request_method === 'GET') {
require __DIR__ . '/inc/get.php';
} elseif ($request_method === 'POST') {
require __DIR__ . '/inc/post.php';
}
require __DIR__ . '/inc/footer.php';
Linguagem de código: HTML, XML ( xml )
cabeçalho.php
Eles header.php
contêm a primeira parte da página:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>PHP Form</title>
</head>
<body>
<main>
Linguagem de código: HTML, XML ( xml )
rodapé.php
O footer.php
arquivo contém as tags anexas da página:
</main>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
obter.php
O get.php
arquivo contém o formulário. O $_SERVER['PHP_SELF']
retorna o nome do arquivo do script atualmente em execução.
Por exemplo, se o script em execução for https://tutorials.acervolima.com/app/form/index.php
, o $_SERVER['PHP_SELF']
retorno será /app/form/index.php
.
No entanto, $_SERVER['PHP_SELF']
não é confiável e é vulnerável a ataques XSS. Portanto, você deve sempre escapar usando a htmlspecialchars()
função.
O seguinte mostra o get.php
arquivo:
<form action="<?php htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
<div>
<label for="name">Name:</label>
<input type="text" name="name" placeholder="Enter your name" />
</div>
<div>
<label for="name">Email:</label>
<input type="email" name="email" placeholder="Enter your email" />
</div>
<div>
<button type="submit">Subscribe</button>
</div>
</form>
Linguagem de código: HTML, XML ( xml )
post.php
O seguinte mostra o post.php
arquivo que trata do envio do formulário:
<?php
//-----------------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//-----------------------------------------------------
if (isset($_POST['name'], $_POST['email')) {
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
// show the $name and $email
echo "Thanks $name for your subscription.<br>";
echo "Please confirm it in your inbox of the email $email.";
} else {
echo 'You need to provide your name and email address.';
}
Linguagem de código: PHP ( php )
.htaccess
O arquivo .htaccess impede o acesso direto aos arquivos do inc
diretório. É relevante apenas para o servidor web Apache.
Deny from all
Linguagem de código: JavaScript ( javascript )
Ao usar o arquivo .htaccess, você não pode navegar no arquivo diretamente da pasta inc. Por exemplo:https://tutorials.acervolima.com/app/form/inc/get.php
Aqui está a versão final do formulário .
Resumo
- Use a
<form>
tag para criar um formulário HTML. - Especifique a URL que processa o envio do formulário no
action
atributo. - Use o método
GET
ouPOST
para omethod
atributo do formulário para envio. - Utilize o
$_GET
ou$_POST
para acessar os dados do formulário. - Use a
htmlspecialchars()
função para escapar da entrada do usuário antes de mostrá-la em uma página da web.