Como codificar um formulário de inscrição com confirmação de e-mail

Neste tutorial, vamos criar um formulário de inscrição de usuário que adiciona um usuário a um banco de dados e envia um e-mail de confirmação no qual o usuário deve clicar antes de sua conta ser ativada.

Crie um formulário de inscrição do zero

Nesta seção, passaremos pelas etapas necessárias para criar um formulário de inscrição personalizado do zero. Em primeiro lugar, anexei todos os arquivos de código para você baixar, para que você possa acompanhar o tutorial.

Vamos examinar rapidamente os arquivos importantes.

  • index.php: É o arquivo principal usado para criar e exibir o formulário de inscrição. Ele também lida com o envio do formulário.
  • confirmar.php: É usado para lidar com a parte de confirmação.
  • signup_template.html: É o modelo de arquivo HTML usado para criar o corpo do e-mail em HTML.
  • signup_template.txt: É o modelo de arquivo de texto simples usado para criar o corpo do e-mail de texto simples.
  • inc/php/config.php: Contém as informações de conexão com o banco de dados.

O restante dos arquivos são arquivos auxiliares.

Abra o PHPMyAdmin ou qualquer programa que você use para gerenciar seu banco de dados MySQL e crie um novo banco de dados. Você pode nomeá-lo como quiser, mas nós o nomearemos email_signup. Agora, precisamos criar o esquema que conterá nossas informações de usuário e informações de confirmação. Para isso, criaremos duas tabelas: users e confirm.

1
CREATE TABLE `users` (
2
  `id` int(11) NOT NULL auto_increment,
3
  `username` varchar(50) NOT NULL default '',
4
  `password` varchar(128) NOT NULL default '',
5
  `email` varchar(250) NOT NULL default '',
6
  `active` binary(1) NOT NULL default '0',
7
  PRIMARY KEY  (`id`)
8
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

A instrução MySQL acima criará uma tabela chamada users com as seguintes colunas:

  • eu ia: Uma coluna inteira de incremento automático que serve como a chave primária para cada registro do usuário.
  • nome de usuário: É uma coluna de string que armazena o nome de usuário de cada usuário. É definido como varchar(50)o que significa que pode conter até 50 caracteres.
  • senha: Uma coluna de string que armazena a senha com hash de cada usuário. É definido como varchar(128)o que significa que pode conter até 128 caracteres.
  • e-mail: Uma coluna de string que armazena o endereço de e-mail de cada usuário. É definido como varchar(250)o que significa que pode conter até 250 caracteres.
  • ativo: Uma coluna binária que armazena se a conta do usuário foi ativada ou não. É definido como binary(1)o que significa que ele pode armazenar um único bit.

Em seguida, vamos criar o confirm mesa.

1
CREATE TABLE `confirm` (
2
  `id` int(11) NOT NULL auto_increment,
3
  `userid` varchar(128) NOT NULL default '',
4
  `key` varchar(128) NOT NULL default '',
5
  `email` varchar(250) default NULL,
6
  PRIMARY KEY  (`id`)
7
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

A instrução MySQL acima criará uma tabela chamada confirm com as seguintes colunas:

  • eu ia: Uma coluna inteira de incremento automático que serve como a chave primária para cada registro do usuário.
  • ID do usuário: É uma coluna de string que armazena o ID do usuário que está sendo confirmado. É definido como varchar(128)o que significa que pode conter até 128 caracteres.
  • chave: uma coluna de string que armazena a chave de confirmação que é enviada para o endereço de e-mail do usuário. É definido como varchar(128)o que significa que pode conter até 128 caracteres.
  • e-mail: Uma coluna de string que armazena o endereço de e-mail do usuário que está sendo confirmado. É definido como varchar(250)o que significa que pode conter até 250 caracteres.

Conecte-se ao banco de dados MySQL com mysqli

Nesta seção, veremos como se conectar com o banco de dados MySQL usando a extensão mysqli.

Vamos puxar rapidamente e entender o código do inc/php/config.php arquivo.

1

2
//connect to the database

3
$mysqli = new mysqli('localhost', 'root', 'root', 'email_signup');
4

5
//check if connection was successful

6
if ($mysqli->connect_errno) {
7
    die("Failed to connect to MySQL: " . $mysqli->connect_error);
8
}

Em primeiro lugar, criamos um novo mysqli objeto e use-o para se conectar ao banco de dados. Se a conexão falhar, será gerada uma mensagem de erro com o motivo da falha.

Configurando o Symfony Mailer para enviar e-mails

Symfony Mailer é uma biblioteca popular para enviar e-mails de aplicativos PHP e é amplamente aceita pela comunidade PHP. É uma biblioteca rica em recursos no sentido de cobrir quase todos os aspectos do envio de e-mails, desde a configuração de diferentes transportes até a personalização da mensagem que está sendo enviada. Além disso, se você já ouviu falar da biblioteca Swift Mailer, ela é a predecessora da biblioteca Symfony Mailer—Symfony Mailer é a versão nova e aprimorada.

Nesta seção, mostrarei como instalar e configurar a biblioteca Symfony Mailer. A instalação é bastante direta, pois já está disponível como um pacote do Composer. Antes de prosseguirmos, verifique se você instalou o Composer porque precisaremos dele para instalar a biblioteca Symfony Mailer.

Depois de instalar o Composer, pegue a biblioteca Symfony Mailer usando o seguinte comando.

1
$composer require symfony/mailer

Essa é a parte da instalação, mas como você deve usá-la? É só incluir o autoload.php arquivo criado pelo Composer em seu aplicativo, conforme o trecho a seguir.

1
<?php
2
require_once './vendor/autoload.php';
3
?>

Criar o formulário de inscrição

Vá em frente e abra o index.php arquivo que contém o seguinte código que cria o formulário de inscrição.

1
 method="post" action="">
2
    
3
        
4
            
  • 5
                     for="username">Username:
    
    6
                     type="text" name="username" />
    
    7
                
    
    8
                
  • 9
                     for="password">Password:
    
    10
                     type="password" name="password" />
    
    11
                
    
    12
                
  • 13
                     for="email">Email:
    
    14
                     type="text" name="email" />  
    
    15
                
    
    16
                
  • 17
                     type="submit" value="Signup Now" class="large blue button" name="signup" />          
    
    18
                
    
    19
            
    
    20
        
    
    21
    
    

    É um código de formulário HTML que cria um formulário de inscrição de usuário com campos de nome de usuário, senha e e-mail. Quando o usuário clica no Inscreva-se agora botão, os dados do formulário serão enviados ao servidor como uma solicitação POST.

    Salvando informações no banco de dados

    Uma vez que o formulário é enviado, o mesmo index.php arquivo lida com o envio do formulário. Vamos tentar entender o que está acontecendo no trecho a seguir.

    1
    if (isset($_POST['signup'])) {
    
    2
        //cleanup the variables
    
    
    3
        //prevent mysql injection
    
    
    4
        $username = mysqli_real_escape_string($mysqli, $_POST['username']);
    
    5
        $password = mysqli_real_escape_string($mysqli, $_POST['password']);
    
    6
        $email = mysqli_real_escape_string($mysqli, $_POST['email']);
    
    7
        
    
    8
        //quick/simple validation
    
    
    9
        if(empty($username)){ $action['result'] = 'error'; array_push($text,'You forgot your username'); }
    
    10
        if(empty($password)){ $action['result'] = 'error'; array_push($text,'You forgot your password'); }
    
    11
        if(empty($email)){ $action['result'] = 'error'; array_push($text,'You forgot your email'); }
    
    12
        
    
    13
        if ($action['result'] != 'error') {
    
    14
            $password = md5($password);   
    
    15
                
    
    16
            //add to the database
    
    
    17
            $add = $mysqli->query("INSERT INTO `users` VALUES(NULL,'$username','$password','$email',0)");
    
    18
            
    
    19
            if ($add) {
    
    20
                //get the new user id
    
    
    21
                $userid = $mysqli->insert_id;
    
    22
                
    
    23
                //create a random key
    
    
    24
                $key = $username . $email . date('mY');
    
    25
                $key = md5($key);
    
    26
                
    
    27
                //add confirm row
    
    
    28
                $confirm = $mysqli->query("INSERT INTO `confirm` VALUES(NULL,'$userid','$key','$email')");    
    
    29
                
    
    30
                ...
    
    31
                ...
    
    32
                ...
    
    33
    
    
    34
            } else {
    
    35
                $action['result'] = 'error';
    
    36
                array_push($text,'User could not be added to the database. Reason: ' . mysql_error());
    
    37
            }
    
    38
        }
    
    39
        
    
    40
        $action['text'] = $text;
    
    41
    }
    

    Em primeiro lugar, ele verifica se o formulário foi enviado, verificando se o signup chave está presente no $_POST variedade.

    Depois disso, higienizamos os dados inseridos no formulário usando o mysqli_real_escape_string função. Esta função ajuda a prevenir ataques de injeção de SQL.

    Em seguida, realizamos algumas verificações para garantir que o usuário inseriu o nome de usuário, a senha e o e-mail. Se algum deles estiver ausente, um erro será adicionado a uma matriz de erros.

    Se não houver erros, iremos em frente e inseriremos os dados do usuário no banco de dados. Ele hashes a senha usando o md5 função antes de inseri-la no banco de dados. Observe que usamos o md5 função apenas para fins de exemplo, sugiro que você use métodos mais seguros para criptografar o campo de senha. Se a inserção for bem-sucedida, obtém o ID do usuário recém-adicionado e gera uma chave aleatória com base nos detalhes do usuário e na data atual. Em seguida, adiciona uma linha ao confirm tabela com o ID do usuário, chave e e-mail.

    Enviando um e-mail com o Symfony Mailer

    Finalmente, vamos passar pelo seguinte trecho do index.php arquivo que é responsável por enviar um e-mail.

    1
    //include the swift class
    
    
    2
    require_once './vendor/autoload.php';
    
    3
    
    
    4
    //put info into an array to send to the function
    
    
    5
    $info = array(
    
    6
        'username' => $username,
    
    7
        'email' => $email,
    
    8
        'key' => $key
    
    9
    );
    
    10
    
    
    11
    //send the email
    
    
    12
    if(send_email($info)){
    
    13
        //email sent
    
    
    14
        $action['result'] = 'success';
    
    15
        array_push($text,'Thanks for signing up. Please check your email for confirmation!');
    
    16
    } else {
    
    17
        $action['result'] = 'error';
    
    18
        array_push($text,'Could not send confirm email');
    
    19
    
    
    20
    }
    

    No trecho acima, ele chama o send_email função, que na verdade envia um e-mail. Vamos puxar o código do send_email função do inc/php/functions.php arquivo.

    1
    function send_email($info){
    
    2
        //format each email
    
    3
        $body = format_email($info,'html');
    
    4
        $body_plain_txt = format_email($info,'txt');
    
    5
        
    
    6
        $transport = new SendmailTransport();
    
    7
        $mailer = new Mailer($transport);
    
    8
        $email = (new Email());
    
    9
        $email->from('[email protected]');
    
    10
        $email->to($info['email']);
    
    11
        $email->subject('Welcome to Site Name');
    
    12
        $email->text($body_plain_txt);
    
    13
        $email->html($body);
    
    14
        $result = $mailer->send($email);
    
    15
        
    
    16
        return $result;
    
    17
    }
    

    Como você pode ver, é uma função bastante direta que envia um e-mail com a ajuda da biblioteca Symfony Mailer. É importante observar que usamos o format_email função personalizada para preparar o corpo do e-mail para as versões de texto simples e HTML.

    É assim que funciona o envio do formulário. Na próxima seção, discutiremos como funciona a parte de confirmação.

    Mostrar a confirmação do formulário

    Vamos extrair o trecho importante do confirmar.php arquivo para entender como funciona.

    1
    ...
    
    2
    ...
    
    3
    $email = mysqli_real_escape_string($_GET['email']);
    
    4
    $key = mysqli_real_escape_string($_GET['key']);
    
    5
    
    
    6
    //check if the key is in the database
    
    
    7
    $check_key = $mysqli->query("SELECT * FROM `confirm` WHERE `email` = '".$email."' AND `key` = '".$key."' LIMIT 1");
    
    8
    
    
    9
    if($check_key->num_rows != 0) {
    
    
    10
               
    
    
    11
       //get the confirm info
    
    
    12
       $confirm_info = $check_key->fetch_assoc();
    
    
    13
       
    
    
    14
       //confirm the email and update the users database
    
    
    15
       $update_users = $mysqli->query("UPDATE `users` SET `active` = 1 WHERE `id` = '".$confirm_info['userid']."' LIMIT 1");
    
    
    16
    
    
    
    17
       //delete the confirm row
    
    
    18
       $delete = $mysqli->query("DELETE FROM `confirm` WHERE `id` = '".$confirm_info['id']."' LIMIT 1");
    
    
    19
       
    
    
    20
       if($update_users){
    
    
    21
                       
    
    
    22
           $action['result'] = 'success';
    
    
    23
           $action['text'] = 'User has been confirmed. Thank-You!';
    
    
    24
       
    
    
    25
       }else{
    
    
    26
    
    
    
    27
           $action['result'] = 'error';
    
    
    28
           $action['text'] = 'The user could not be updated Reason: '.mysql_error();;
    
    
    29
       
    
    
    30
       }
    
    31
    
    
    32
    }else{
    
    
    33
    
    
    
    34
       $action['result'] = 'error';
    
    
    35
       $action['text'] = 'The key and email is not in our database.';
    
    
    36
    
    
    
    37
    }
    
    38
    ...
    
    39
    ...
    

    Basicamente, é usado para verificar o e-mail e a chave de confirmação de um usuário, armazenados no banco de dados, em relação ao que foi passado pela URL. Em primeiro lugar, ele seleciona uma linha do confirm tabela no banco de dados, procurando por uma correspondência email e key. Se não houver correspondência, um erro será retornado. Se houver uma correspondência, ele busca as informações de confirmação do banco de dados e atualiza o users tabela para definir o usuário como ativo. Em seguida, ele exclui a linha de confirmação do confirm tabela, pois não é mais necessário.

    Conclusão

    E com isso, chegamos ao final deste tutorial.

    Cobrimos muitas áreas diferentes neste tutorial. Baixamos e incluímos um script de terceiros para lidar com o envio de e-mails, implementamos validação de formulário simples e criamos um sistema de modelo super simples para estilizar nossos e-mails. Se você é novo no MySQL, abordamos as três funções mais comuns, então você não deve ter problemas para concluir os tutoriais mais avançados.

    [ad_2]

    Deixe uma resposta