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.