Skip to content

Instantly share code, notes, and snippets.

@kamikaze-lab
Created February 5, 2015 22:40
Show Gist options
  • Save kamikaze-lab/d49bd6efb1489ea043d4 to your computer and use it in GitHub Desktop.
Save kamikaze-lab/d49bd6efb1489ea043d4 to your computer and use it in GitHub Desktop.
Login sencillo utilizando PHP y PDO utilizando el patron Singleton

Un login con PHP

Crearemos un login sencillo utilizando PHP y PDO utilizando el patron Singleton

  1. Objetivo y descripción
  2. Dependencias
  3. Puesta en marcha
  4. Referencias
  5. Créditos y autor

Crearemos una clase donde tendremos la conexión a la base de datos y donde deberemos crear el método prepare de PDO para poder hacer consultas.

Crearemos otra clase donde tendremos la lógica de nuestra aplicación, desde ésta llamaremos a nuestra clase conexión haciendo uso de Singleton.

Como podremos ver no necesitamos asegurar los datos introducidos en el formulario ya que la extensión PDO se encarga de hacer esa faena al vuelo gracias al método prepare, con todo lo anterior podemos empezar.

  • PHP - PHP is a popular general-purpose scripting language that is especially suited to web development.
  • MYSQL - The world's most popular open source database.

Con algún web server instalado

Asegúrate de tener corriendo un web server como Nginx o Apache, aquí puedes encontrar un guía excelente para instalar uno si cuentas con una Mac �Install Web Server

Vamos a crear una carpeta que llamaremos login_pdo en nuestro servidor local, en windows suele ser htdocs y en linux www, ahora iremos creando las carpetas y archivos necesarios para hacer funcionar nuestro sistema de login.

Creamos una carpeta nueva dentro de login_pdo llamada conexion y dentro creamos un archivo llamado conexion.class.php, lo abrimos y dentro podemos colocar el código con el que tendremos lista la conexión a nuestra base de datos.

<?php
class Conexion{
	    
    private static $instancia;
    private $dbh;
 
    private function __construct()
    {
        try {
 
            $this->dbh = new PDO('mysql:host=localhost;dbname=snippet', 'root', 'tupass');
            $this->dbh->exec("SET CHARACTER SET utf8");
 
        } catch (PDOException $e) {
 
            print "Error!: " . $e->getMessage();
 
            die();
        }
    }
 
    public function prepare($sql)
    {
 
        return $this->dbh->prepare($sql);
 
    }
 
    public static function singleton_conexion()
    {
 
        if (!isset(self::$instancia)) {
            $miclase = __CLASS__;
            self::$instancia = new $miclase;
 
        }
 
        return self::$instancia;
        
    }
 
 
     // Evita que el objeto se pueda clonar
    public function __clone()
    {
 
        trigger_error('La clonación de este objeto no está permitida', E_USER_ERROR);
 
    }
}
?>

Ahora ya tenemos nuestra conexión lista para ser usada desde donde necesitemos, en nuestro caso será en la clase login que pasamos a crear a continuación, pero primero debemos crear la base de datos usuarios y la tabla users para hacer uso de la misma.

CREATE DATABASE IF NOT EXISTS 'usuarios';
CREATE TABLE IF NOT EXISTS 'users'(
	id int not null primary key auto_increment,
	nombre varchar(100) not null,
	password varchar(100) not null
);
INSERT INTO users values
	(null, ‘rich’, 123456),
	(null, ‘tona’, 12345),
	(null, ‘mario’, 747378),
	(null, ‘diego’, ‘diego123’);

Creamos una carpeta en la raíz de la aplicación y le llamamos class_login, dentro creamos un nuevo archivo llamado login.class.php y ponemos el siguiente código.

<?php
    require_once 'conexion/conexion.class.php';
    session_start();
    class Login
    {
     
        private static $instancia;
        private $dbh;
     
        private function __construct()
        {
     
            $this->dbh = Conexion::singleton_conexion();
     
        }
     
        public static function singleton_login()
        {
     
            if (!isset(self::$instancia)) {
     
                $miclase = __CLASS__;
                self::$instancia = new $miclase;
     
            }
     
            return self::$instancia;
     
        }
    
        public function login_users($nick,$password)
        {
            
            try {
                
                $sql = "SELECT * from users WHERE nombre = ? AND password = ?";
                $query = $this->dbh->prepare($sql);
                $query->bindParam(1,$nick);
                $query->bindParam(2,$password);
                $query->execute();
                $this->dbh = null;
     
                //si existe el usuario
                if($query->rowCount() == 1)
                {
                     
                     $fila  = $query->fetch();
                     $_SESSION['nombre'] = $fila['nombre'];                 
                     return TRUE;
        
                }
                
            }catch(PDOException $e){
                
                print "Error!: " . $e->getMessage();
                
            }        
            
        }
    
 
        // Evita que el objeto se pueda clonar
        public function __clone()
        {
     
            trigger_error('La clonación de este objeto no está permitida', E_USER_ERROR);
     
        }
 
    }
?>

Como vemos llamamos a la clase conexión con un require_once, a continuación empezamos una sesión con sesion_start() y creamos el método constructor en el cuál lo que hacemos es crear una instancia de nuestra clase conexión haciendo uso de singleton para poder tenerla disponible en toda nuestra clase, como se puede ver es realmente sencillo.

A continuación creamos un método que llamamos login_users para procesar el login de usuarios, como vemos simplemente comprobamos si el número de resultados es igual a 1, en ese caso las credenciales son correctas y creamos una sesión con el nombre del usuario y devolvemos true, es importante ver como cerramos la conexión con la base de datos con $this->dbh = null, también es una buena práctica hacer uso de estructuras try catch, si algo falla la sección catch será en la que podremos hacer lo que queramos en caso de alguna excepción.

Creamos un archivo en la raíz de la aplicación llamado index.php, dentro simplemente crearemos un formulario para poder probar nuestro login.

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="utf-8" />
    <title>Login con singleton y pdo</title>
    <style type="text/css">
        body{
            background: #d1e0e5;
        }
        .content{
             margin: 0 auto;
             width: 500px;
             height: 300px;
             margin-top: 9%;
             background: #000;
             color: #fff;
             border: 6px solid #dc2d29;
        }
        label{
            display: block;
        }
        .caja_login{
            margin: 30px 0px 0px 70px;
        }
        .caja_login input[type=text],input[type=password]{
            width: 280px;
            padding: 8px 6px;
            border-radius: 8px;
        }
        .caja_login input[type=submit]{
            padding: 5px 60px;
            text-align: center;
            border-radius: 4px;
            color: #fff;
            background: #dc2d29; 
            border: 1px solid #fff;
            margin-top: 10px;
        }
    </style>
</head>
 
<body>
<div class="content">
    <div class="caja_login">
    <h2>Login con PDO y php</h2>
    <form class="form" action="login.php" method="post">
        
        <label>Nick</label>
        <input type="text" name="nick" required="true" placeholder="Introduce tu nick" />
        
        <label>Password</label>
        <input type="password" name="password" required="true" placeholder="Introduce tu password" />
        
        <input type="submit" value="Login" />
        
    </form>
    </div>
</div>
</body>
</html>

Simplemente es la estructura de una página web y un formulario con algunos estilos, si nos fijamos el atributo action de nuestro formulario apunta a un archivo llamado login.php, este es para nosotros nuestro controlador, el que hace la comunicación entre la vista y la base de datos, con esto ya habremos terminado nuestro sistema de login, veamos.

Creamos un archivo en la raíz de la aplicación llamado login.php, dentro colocamos el siguiente código que será el encargado de hacer la comunicación con el método login_users para comprobar si los datos son correctos.

<?php
require_once 'class_login/login.class.php';
//accedemos al método singleton que es quién crea la instancia
//de nuestra clase y así podemos acceder sin necesidad de
//crear nuevas instancias, lo que ahorra consumo de recursos
$nuevoSingleton = Login::singleton_login();
 
if(isset($_POST['nick']))
{
    $nick = $_POST['nick'];
    $password = $_POST['password'];
    //accedemos al método usuarios y los mostramos
    $usuario = $nuevoSingleton->login_users($nick,$password);
    
    if($usuario == TRUE)
    {
        header("Location:home.php");
    }
}
?>

Como vemos creamos una instancia de nuestra clase login haciendo uso del patrón Singleton, a continuación comprobamos si se ha envíado el formulario y lo procesamos, si la respuesta del método login_users devuelve true, lo que significa que todo ha ido bien, redirigimos a home.php, que por así decirlo sería la zona privada de nuestra aplicación.

Creamos un archivo en la raíz de la aplicación llamado home.php, dentro colocamos el código.

<?php
<?php session_start() ?>
<?php if(isset($_SESSION['nombre']))
{
?>
    <h1>Bienvenido de nuevo <?php echo $_SESSION['nombre'] ?>.</h1>
<?php    
}else{
    header("Location: index.php");
}

Empezamos una sesión y comprobamos si existe, si es así damos la bienvenida al usuario que ha iniciado sesión correctamente, en otro caso mandamos al index de nuevo.

Listo! Terminamos el login, ahora solo falta integrarlo con tu sistema así como las validaciones en caso de error.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment