Funções do Nosso Formulário
O formulário de exemplo abaixo possui as seguintes funcionalidades:
- Validação de formulário
- Envio de mensagem por e-mail
- Prevenir SPAM
- Impedir envio duplo
Nossos Arquivos e Pastas para Nosso Formulário
├── config │ └── app.php ├── css │ └── style.css ├── inc │ ├── cabecalho.php │ ├── footer.php │ ├── get.php │ ├── header.php │ ├── mail.php │ ├── post.php │ └── rodape.php └── index.php
Criei a seguinte estrutura de arquivos e pastas:
config, css e inc são pastas.
Dentro da pasta inc estão os arquivos que vamos incluir dentro de index.php usando a função require_once.
footer.php é o nosso rodapé, header.php nosso cabeçalho, get.php nosso formulário, mail.php código para enviar email, post.php é o código php que tratará o formulário e index.php nossa página principal.
Conteúdo de Cada Arquivo
Criei os arquivos colocando o seguinte conteúdo em cada um:
header.php
O arquivo header.php contém a parte do cabeçalho do formulário de contato:
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/style.css">
<title>Formulario de Contato em PHP</title>
</head>
<body>
<main>
footer.php
O arquivo footer.php contém as tags HTML finais do cabeçalho:
</main> </body> </html>
get.php
O arquivo get.php mostra o formulário de contato:
<?php if (isset($message)) : ?>
<div class="alert alert-success">
<?= $message ?>
</div>
<?php endif ?>
<form action="index.php" method="post">
<header>
<h1>Envie uma Mensagem</h1>
</header>
<div>
<label for="name">Name:</label>
<input type="text" value="<?= $inputs['name'] ?? '' ?>" name="name" id="name" placeholder="Full
name">
<small><?= $errors['name'] ?? '' ?></small>
</div>
<div>
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="<?= $inputs['email'] ?? '' ?>"
placeholder="Email address">
<small><?= $errors['email'] ?? '' ?></small>
</div>
<div>
<label for="subject">Subject:</label>
<input type="subject" name="subject" id="subject" value="<?= $inputs['subject'] ?? '' ?>"
placeholder="Enter a subject">
<small><?= $errors['subject'] ?? '' ?></small>
</div>
<div>
<label for="message">Message:</label>
<textarea id="message" name="message" rows="5"><?= $inputs['message'] ?? '' ?></textarea>
<small><?= $errors['message'] ?? '' ?></small>
</div>
<label for="nickname" aria-hidden="true" class="user-cannot-see"> Nickname
<input type="text" name="nickname" id="nickname" class="user-cannot-see" tabindex="-1"
autocomplete="off">
</label>
<button type="submit">Enviar Messagem</button>
</form>
Como funciona? Vamos pegar algumas partes para explicar.
O arquivo get.php mostra o formulário de contato:
<?php if (isset($message)) : ?>
<div class="alert alert-success">
<?= $message ?>
</div>
<?php endif ?>
Segundo, preencha os campos de entrada com dados do array $inputs. Se o campo tiver dados inválidos, mostre a mensagem de erro do array $errors.
Terceiro, adicione um honeypot ao formulário:
<label for="nickname" aria-hidden="true" class="user-cannot-see"> Nickname
<input type="text" name="nickname" id="nickname" class="user-cannot-see" tabindex="-1"
autocomplete="off">
</label>
Já falamos sobre honeypot aqui: Termos: O que é Honeypot para Desenvolvimento Web?
post.php
<?php
// check the honeypot
$honeypot = filter_input(INPUT_POST, 'nickname', FILTER_SANITIZE_STRING);
if ($honeypot) {
header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed');
exit;
}
// validate name
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$inputs['name'] = $name;
if (!$name || trim($name) === '') {
$errors['name'] = 'Please enter your name';
}
// validate email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$inputs['email'] = $email;
if ($email) {
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
if (!$email) {
$errors['email'] = 'Please enter a valid email';
}
} else {
$errors['email'] = 'Please enter an email';
}
// validate subject
$subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_STRING);
$inputs['subject'] = $subject;
if (!$subject || trim($subject) === '') {
$errors['subject'] = 'Please enter the subject';
}
// validate message
$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
$inputs['message'] = $message;
if (!$message || trim($message) === '') {
$errors['message'] = 'Please enter the message';
}
O post.php verifica o honeypot e retorna o código de status HTTP 405 se detectar o spambot. Caso contrário, ele limpa e valida os campos de entrada, incluindo nome, email, assunto e mensagem.
Já falamos sobre spambots também: O que é Spambot em Informática?
app.php
O app.php armazena as informações de configuração, por exemplo, o endereço de e-mail do destinatário
<?php
return [
'mail' => [
'to_email' => 'webmaster@phptutorial.net'
]
];
mail.php
O mail.php obtém o endereço de e-mail do destinatário do arquivo de configuração app.php. Ele envia para a mensagem inserida no formulário de contato usando a função mail():
<?php
// get email from the config file
$config = require_once __DIR__ . '/../config/app.php';
$recipient_email = $config['mail']['to_email'];
// contact information
$contact_name = $inputs['name'];
$contact_email = $inputs['email'];
$message = $inputs['message'];
$subject = $inputs['subject'];
// Email header
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=utf-8';
$headers[] = "To: $recipient_email";
$headers[] = "From: $contact_email";
$header = implode('\r\n', $headers);
mail($recipient_email, $subject, $message, $header);
index.php
O arquivo index.php contém a lógica principal:
<?php
session_start();
$errors = [];
$inputs = [];
$request_method = strtoupper($_SERVER['REQUEST_METHOD']);
if ($request_method === 'GET') {
// show the message
if (isset($_SESSION['message'])) {
$message = $_SESSION['message'];
unset($_SESSION['message']);
} elseif (isset($_SESSION['inputs']) && isset($_SESSION['errors'])) {
$errors = $_SESSION['errors'];
unset($_SESSION['errors']);
$inputs = $_SESSION['inputs'];
unset($_SESSION['inputs']);
}
// show the form
require_once __DIR__ . '/inc/get.php';
} elseif ($request_method === 'POST') {
// check the honeypot and validate the field
require_once __DIR__ . '/inc/post.php';
if (!$errors) {
// send an email
require_once __DIR__ . '/inc/mail.php';
// set the message
$_SESSION['message'] = 'Thanks for contacting us! We will be in touch with you shortly.';
} else {
$_SESSION['errors'] = $errors;
$_SESSION['inputs'] = $inputs;
}
header('Location: index.php', true, 303);
exit;
}
Como funciona?
Primeiro, mostre o formulário de contato se o método de solicitação HTTP for GET. Além disso, obtenha os dados $message, $errors e $inputs do $_SESSION.
Segundo, manipule o envio do formulário se o método de solicitação HTTP for POST, envie um e-mail se não houver erro e redirecione para o formulário de contato. Observe que usamos a técnica PRG (Post-Redirect-Get) para evitar o problema de envio duplo.