Sistema de LogIn con verificación de email y función de recuperar contraseña usando PHP

Introducción

Buenas estimados, en este tutorial vamos a aprender como crear un sistema de login con verificación de email y función de recuperar contraseña usando PHP. Se ha utilizado el enfoque de programación orientada a objetos POO y también hemos echo uso de la biblioteca PHP Mailer que es excelente para la gestión de los correos, vamos a ver el código:

Sistema de Login

Base de datos y tabla MYSQL

Importar y ejecutar el código SQL para crear esta tabla

CREATE TABLE IF NOT EXISTS `tbl_users` (
`userID` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(100) NOT NULL,
`userEmail` varchar(100) NOT NULL UNIQUE,
`userPass` varchar(100) NOT NULL,
`userStatus` enum('Y','N') NOT NULL DEFAULT 'N',
`tokenCode` varchar(100) NOT NULL,
PRIMARY KEY (`userID`)
)
      

Luego tenemos que crear los siguientes archivos:
» dbconfig.php
» class.user.php
» index.php
» signup.php
» verify.php
» home.php
» fpass.php
» resetpass.php
» logout.php

dbconfig.php

En este archivo tenemos un código simple de conexión usando la clase Database y una función de base de datos que conecta dbConnection

<?php
class Database
{
    private $host = "localhost";
    private $db_name = "test";
    private $username = "root";
    private $password = "";
    public $conn;
     
    public function dbConnection()
	{
     
	    $this->conn = null;    
        try
		{
            $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
			$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);	
        }
		catch(PDOException $exception)
		{
            echo "Error de conexion: " . $exception->getMessage();
        }
         
        return $this->conn;
    }
}
?>
	

class.user.php

Incluir al inicio del archivo el dbconfig.php para la conexión y al final configurar PhpMailer como se muestra en este código

<?php

require_once 'dbconfig.php';

class USER
{   
    private $conn;    
    public function __construct()
    {
        $database = new Database();
        $db = $database->dbConnection();
        $this->conn = $db;
    }
    
    public function runQuery($sql)
    {
        $stmt = $this->conn->prepare($sql);
        return $stmt;
    }
    
    public function lasdID()
    {
        $stmt = $this->conn->lastInsertId();
        return $stmt;
    }
    
    public function register($uname,$email,$upass,$code)
    {
        try
        {                           
            $password = md5($upass);
            $stmt = $this->conn->prepare("INSERT INTO tbl_users(userName,userEmail,userPass,tokenCode) 
            VALUES(:user_name, :user_mail, :user_pass, :active_code)");
            $stmt->bindparam(":user_name",$uname);
            $stmt->bindparam(":user_mail",$email);
            $stmt->bindparam(":user_pass",$password);
            $stmt->bindparam(":active_code",$code);
            $stmt->execute();   
            return $stmt;
        }
        catch(PDOException $ex)
        {
            echo $ex->getMessage();
        }
    }
    
    public function login($email,$upass)
    {
        try
        {
            $stmt = $this->conn->prepare("SELECT * FROM tbl_users WHERE userEmail=:email_id");
            $stmt->execute(array(":email_id"=>$email));
            $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
            
            if($stmt->rowCount() == 1)
            {
                if($userRow['userStatus']=="Y")
                {
                    if($userRow['userPass']==md5($upass))
                    {
                        $_SESSION['userSession'] = $userRow['userID'];
                        return true;
                    }
                    else
                    {
                        header("Location: index.php?error");
                        exit;
                    }
                }
                else
                {
                    header("Location: index.php?inactive");
                    exit;
                }   
            }
            else
            {
                header("Location: index.php?error");
                exit;
            }       
        }
        catch(PDOException $ex)
        {
            echo $ex->getMessage();
        }
    }
    
    
    public function is_logged_in()
    {
        if(isset($_SESSION['userSession']))
        {
            return true;
        }
    }
    
    public function redirect($url)
    {
        header("Location: $url");
    }
    
    public function logout()
    {
        session_destroy();
        $_SESSION['userSession'] = false;
    }
    
    function send_mail($email,$message,$subject)
    {                       
require 'mailer/PHPMailerAutoload.php';

$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->Host = "mail.tusitio.com";
$mail->Port = 25; /*25 465 587*/
$mail->SMTPAuth = true;
$mail->Username = "correo@tusitio.com";
$mail->Password = "password";
$mail->setFrom('demo@tusitio.com', 'Confirmacion de miembros');
$mail->addAddress($email);
$mail->Subject = $subject;
$mail->MsgHTML($message);
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
       
}
    }   
}	

Demostración

Queda disponible esta demo en este Link y también se puede incluyendo el sql y todos los archivos necesarios ingresando un pequeño aporte en PayPal

Sobre programación web

• Validación de formularios usando características de HTML5
• Método para insertar registros en MySQL usando PHP
• Obtener datos desde MySQL y mostrar el resultado en una tabla
• Los colores y sus códigos RGB
• Cómo evitar los comentarios spam
• Creando un login simple con jquery, php y mysql
• Conversor de Medidas Online
• Visualizar datos en una tabla parte II: Aplicando estilo css
• Un ejemplo de ABM usando Ajax - PHP - MySQL
• Usando jquery para modificar elementos del HTML
• Usar PDO para conectarse a MYSQL
• Cómo detectar el navegador usando JavaScript
• Cómo desarmar un notebook HP Compaq Presario C700
• Proyecto Intranet: Ordenes de servicio y ventas

Fotografía

• Michelles Jaque
• Beatriz Cabrera Zapata

Poesías

• Mini Poesías - Constanza Gonzales
• Sobre las decisiones - Constanza Gonzales

Últimas Publicaciones

• Enviar correos usando un formulario desde sitio web o localhost con PHPMailer
• Cómo crear un cuadro de búsqueda al estilo Google
• Sistema de LogIn con verificación de email y recuperación de contraseña usando PHP
• Demostración Jquery UI Selectable usando php y bases de datos mysql
• Subir, insertar, actualizar, borrar imágenes con PHP y MySQL
• Calculadora IMC usando JavaScript
• Select Dependientes con Ajax MySQL PHP
• Expresiones regulares en PHP
• Cómo convertir datos MySQL en formato JSON en PHP
• Visualizar datos en una tabla html con mysqli
• Siembras: Aplicación en Laravel 5.5

Newsletter



Gracias. Te mantendremos informado

Website Template por IdeasChile © Optimizado para Chrome - Firefox - Opera