PHP OO: Sistema Web: SystemRegPHP: Sistema de Registros con PHP, PDO y MySQL

En este artículo he creado paso a paso un sistema de registros donde el usuario que ingrese podrá registrarse; luego al entrar en el sistema podrá modificar sus datos de acceso y recuperar su cuenta con una contraseña proporcionada por el sistema. Todo esto utilizando la extensión PDO de PHP de la manera correcta, en 7 pasos y con imágenes!
Compartir:

SystemRegPHP: Sistema de Registro MySQL y PHP, utilizando PDO de forma segura!

Download SystemRegPHP

Primer Paso: En Primer lugar necesitaremos crear nuestra Base de Datos llamada 'pdo' y una tabla a la que llamaremos 'usuario'. Veamos como hacerlo:

Creando Base de datos conexionpdo

  • Entonces desde nuestro Gestor de Base de Datos 'phpMyAdmin', crearemos la base de datos llamada 'conexionpdo':

  • Como podemos ver hemos creado una base de datos llamada "conexionpdo" desde nuestro gestor phpMyAdmin, ahora procederemos a crear nuestra tabla llamada "usuario".

Creando la Tabla usuario

  • Para este proceso procedemos a entrar al área que nos brinda phpMyAdmin para escribir nuestras consultas a la base de datos, presionando el botón superior SQL:

  • Ahora procedemos a realizar la siguiente consulta para crear nuestra tabla "usuario":

CREATE TABLE `usuario` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(30) NOT NULL,
  `password` char(64) NOT NULL,
  `session_key` char(32) DEFAULT NULL,
  `group` tinyint(4) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL,
  `mail` varchar(30) DEFAULT NULL,
   PRIMARY KEY (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Segundo Paso: Creando nuestra classe Usuario 
  • Para este proceso crearemos una carpeta llamada Controladores en la cual creamos un archivo llamado Usuario.class.php que contiene la classe Usuario, donde aplicaremos algunos conceptos aprendidos en PHP OO, 
  • Esta class Usuario estará dentro de un archivo que lleva su nombre 'Usuario.class.php';
  • Lo que hace class Usuario, es lo siguiente:
    • Primero: Crea una conexión a la base de datos con la extensión PDO; utilizando el método init; 
    • Segundo: Utiliza 2 métodos que Obtienen datos según su userID y según su login, respectivamente (todo esto para facilitar las posteriores validaciones y alteración de campos más facilmente).
    • Tercero: Con otro método 'getlist' obtiene la lista de usuarios de la "tabla usuario"
    • Cuarto: con el método add, update, delete, adiciona, actualiza y elimina registros a la base de datos, respectivamente.
    • Quinto:  Luego con otros métodos: chequea, actualiza y valida usuarios. Todo esto explicado dentro de los bloques de comentario del código!.

Archivo Controladores/Usuario.class.php


<?php
/**
 * Project: SystemRegPHP
 * Author: MiSCapu
 * Date: 19/04/2017
 * Time: 15:16
 */

/**
 * @namespace SystemRegPHP: he creado este namespace que puede tener cualquier otro nombre (Nombre Opcional); es
 * importante crear un namespace para evitar posibles conflictos de nombres de classes, interfaces, constantes ó métodos
 * que se puedan utilizar a medida que el proyecto va creciendo. Este namespace actúa mas o menos como un directorio en
 * cualquier sistema operativo que no admite un archivo con el mismo nombre dentro de un mismo directorio; pero que nada
 * puede impedir el uso de un archivo con el mismo nombre en directorios distintos.
 */
namespace SystemRegPHP;

/**
 * @class Usuario: esta es una class abstract la cual no permite su instanciamiento, osea no será creado ningún objeto
 * instanciando la class Usuario.(no se usará la instrucción PHP "new").
 */
abstract class Usuario {
    /**
     * @var int const vidaUtilSession: es una constante que incluye el tiempo de vida de las sesiones en PHP, este
     * ejemplo puede resultar útil para definir cuando caduca por defecto la sesión de un usuario en un sistema de
     * logueo.
     * Le colocamos 3600 que significa que la vida de la session será de 3600 segundos (1 hora). Esto es opcional,
     * ustedes pueden aumentar o disminuir este valor.
     */
    const VidaUtilSession = 3600;               /* 1 hora /**
        * @var object $_db : representa al objeto de conexión a la base de datos usando la "classe PDO" y será
        * estatic ya que sólo la usaremos en ámbito local; lo que quiere decir que sólo servirá para la class
        * Usuario y la declaramos como static para que no desaparezca cuando acabe la función que la está usando.
        */
    private static $_db;
    /**
     * @var bool $_init : inicialización de flags o banderas los cuales se refieren a los bits que serán
     * almacenados en la base de datos al iniciar sesión; osea si existen habrá que realizar una previa
     * validación y si pasan esa validación, podrán ser útiles para ingresar al sistema.
     */
    private static $_init;
    /**
     * @var array $_definition: esta variable representará a cada uno de los datos de la base de datos 'systemregphp'
     * como el nombre de la tabla y sus campos.
     */
    private static $_definition = array(
        'table' => 'usuario',
        'id' => 'userID',
        'login' => 'login',
        'pass' => 'password',
        'key' => 'session_key',
        'fields' => array('group', 'name', 'mail')
    );

    /**
     * @var array $_error_list : variable que contiene una lista de posibles errores del sistema
     */
    private static $_error_list = array();

                    //---------------- FIN DE LA DEFINICIÓN DE VARIABLES ----------//

    /**
     * --------------------------INICIANDO MÉTODOS : CONECTANDONOS A LA BASE DE DATOS------------------
     * @method init: el cual inicia la conexión a la base de datos utilizando la extensión PDO
     * este método puede utilizar 3 tipos de servidores de base de datos:
     * mysql
     * mssql : Microsoft SQL Server
     * sybase
     *
     * @param string $controlador_bd : Contiene el nombre del Controlador de la base de datos o 'driver'.
     * @param string $host_bd : nombre del servidor host de la base de datos
     * @param string $nombre_bd : nombre de la base de datos
     * @param string $usuario_bd : nombre del usuario que puede accesar la base de datos.
     * @param string $contrasenia_bd : contraseña de acceso a la base de datos.
     *
     * @return bool : devuelve el valor de flag de inicializacion como true o false (bool)
     */
    static function init($db_drvr, $db_host, $db_name, $db_user, $db_pass) {
        /**
         * utilizamos el bloque try catch en esta parte para abrir una conexión que tenga acceso a nuestra base de
         * datos y si en caso no consiga obtener acceso, esta disparará inmediatamente una de las estrategias de
         * errores provenientes de la biblioteca PDO.
         */
        try {
            /**
             * switch es una sentencia que hace la misma cosa que if; en este caso switch hará una condición con:
             * @var string $controlador_bd : y comunicará al sistema que en caso 'case' el tipo de $controlador_bd sea
             * MySQL, entonces puede utilizar una conexión PDO con los datos de acceso respectivos incluídos en los
             * parámetros ($host_bd, $nombre_bd, etc) antes descritos para acceder a la base de datos.
             * Esto es opcional porque tambien podriamos haber utilizado 'if y elseif' para realizar el mismo proceso.
             */
            switch($db_drvr) {
                case 'mysql': self::$_db = new \PDO('mysql:host=' . $db_host . ';dbname=' . $db_name, $db_user, $db_pass); break;
                case 'mssql': self::$_db = new \PDO('mssql:host=' . $db_host . ';dbname=' . $db_name, $db_user, $db_pass); break;
                case 'sybase': self::$_db = new \PDO('sybase:host=' . $db_host . ';dbname=' . $db_name, $db_user, $db_pass); break;
                default: self::$_db = new \PDO('mysql:host=' . $db_host . ';dbname=' . $db_name, $db_user, $db_pass); break;
            }
            self::$_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        }
        catch(\PDOException $e) {
            die($e->getMessage());
        }
        /**
         * @var bool $session_check: variable que almacena la verificación true o false de la comparación de PHP
         * para el sistema.
         */

        $session_check = false;
        /**
         * Ahora vamos a utilizar if para condicionar las versiones de PHP que se estan usando:
         * decimos entonces: si "if" version_compare ---->(version_compare:function=>compara dos versiones php)
         * phpversion(), version 5.4.0 , operador de comparación >=  (phpversion() es nuestra actual version de PHP)
         * Osea que si nuestra actual version es mayor o igual que 5.4.0; entonces recibimos verdadero 'True', que es
         * la verificación de session que se almacenará en la variable $session_checkb y el script puede proceder.
         */
        if(version_compare(phpversion(), '5.4.0', '>=')) {
            if(session_status() === PHP_SESSION_ACTIVE) {
                $session_check = true;
            }
        }
        /**
         * Sino se cumple que la version de PHP es mayor o igual a 5.4.0 tendria que ocurrir lo siguiente:
         * si la constante session_id (encargada de obtener o definir el id de la session actual) no es vacía
         * @var bool $session_check es 'true' y el script puede proceder
         */
        else {
            if(!empty(session_id())) {
                $session_check = true;
            }
        }
        /**
         * si:
         * @var bool $session_check no existe, muestre un mensaje aquí referenciado
         */
        if(!$session_check) {
            die('La Session no se ha iniciado. Es necesaria la classe SystemRegPHP\Usuario.');
        }
        /**
         * Si no estan vacíos los campos de la 'table'(usuario) como userId, login y contrasenia; entonces puede
         * acceda a la variable $_init (la cual inicializa los flags) y hacerla 'true'; lo cual hace que el script puede
         * proceder
         */
        if(!empty(self::$_definition['table']) && !empty(self::$_definition['id']) && !empty(self::$_definition['login']) && !empty(self::$_definition['pass'])) {
            self::$_init = true;
        }
        /**
         * usamos return para invocar el control total del programa nuevamente en este bloque y accedemos a la
         * variable $_init que inicia el almacenamiento de datos de session;
         */
        return self::$_init;
    }
    /**
     *   -----------------------FIN DE LAS VALIDACIONES DE ACCESO A LA BASE DE DATOS MYSQL -------------------
     *
     */
    /** --------------------------METODOS PARA INTERACTUAR CON LA BASE DE DATOS "conexionpdo" ------------------
     * @function getById : función que va a realizar la obtención de los datos de usuario de "conexionpdo", de
     * acuerdo a su $userID sin considera su contraseña.
     *
     * @param string $UserID: es el id único para el usuario obtenido de MySQL
     */
    static function getByID($userID) {
        /**
         * @var bool usuario le asignamos false pues es una variable que inicialmente esta vacía
         */
        $user = false;
        /**
         * Si la variable $_init existe, se inicia:
         */
        if(self::$_init) {
            $res = self::$_db->prepare('SELECT * FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['id'] . '` = :id;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            $res->execute(array('id' => $userID));
            if($lot = $res->fetch()) {
                /**
                 * campos principales (menos password)
                 **/
                $user = array(
                    'id' => $lot[self::$_definition['id']],
                    'login' => $lot[self::$_definition['login']],
                    'key' =>  $lot[self::$_definition['key']],
                );
                /* otros campos */
                if(!empty(self::$_definition['fields'])) {
                    foreach(self::$_definition['fields'] as $field) {
                        $user[$field] = !empty($lot[$field]) ? $lot[$field] : '';
                    }
                }
            }
        }
        return $user;
    }

    /**
     * @function getByLogin : método que va a realizar la obtención de los datos de acuerdo a su login; sin considerar
     * la contraseña 'password'
     *
     * @param string $UserID: es el id único para el usuario obtenido de pdomysql

     * @return array|false Devuelve matriz de datos de usuario o false si se produjo un error.
     *
     */
    static function getByLogin($login) {
        $user = false;
        if(self::$_init) {
            $res = self::$_db->prepare('SELECT * FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['login'] . '` = :login;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            $res->execute(array('login' => $login));
            if($lot = $res->fetch()) {
                /* main fields, except password */
                $user = array(
                    'id' => $lot[self::$_definition['id']],
                    'login' => $lot[self::$_definition['login']],
                    'key' =>  $lot[self::$_definition['key']],
                );
                /* other fields */
                if(!empty(self::$_definition['fields'])) {
                    foreach(self::$_definition['fields'] as $field) {
                        $user[$field] = !empty($lot[$field]) ? $lot[$field] : '';
                    }
                }
            }
        }
        return $user;
    }

    /**
     * @method getList: Obtiene lista de usuarios.
     *
     * @return array Devuelve la matriz de datos de los usuarios.
     */
    static function getList() {
        $list = array();
        if(self::$_init) {
            $res = self::$_db->query('SELECT * FROM `' . self::$_definition['table'] . '` ORDER BY `' . self::$_definition['id'] . '`;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            while($lot = $res->fetch()) {
                /* main fields, except password */
                $user = array(
                    'id' => $lot[self::$_definition['id']],
                    'login' => $lot[self::$_definition['login']]
                );
                /* other fields */
                if(!empty(self::$_definition['fields'])) {
                    foreach(self::$_definition['fields'] as $field) {
                        $user[$field] = !empty($lot[$field]) ? $lot[$field] : '';
                    }
                }
                $list[] = $user;
            }
        }
        return $list;
    }

    /**
     * @method add: agrega un nuevo usuario.
     *
     * @param array $data           Tabla de datos de usuario con claves según definición.
     *
     * @return int|false Retorna un nuevo ID de usuario o falso si se produce un error.
     */
    static function add($data) {
        $result = false;
        self::$_error_list = array();
        if(self::$_init) {
            $user_data = array(
                'login' => !empty($data['login']) ? $data['login'] : '',
                'pass' => !empty($data['pass']) ? self::passwordHash($data['pass']) : ''
            );
            $sql_set = array(
                '`' . self::$_definition['login'] . '` = :login',
                '`' . self::$_definition['pass'] . '` = :pass'
            );

            if(!empty(self::$_definition['fields'])) {
                foreach(self::$_definition['fields'] as $field) {
                    $user_data[$field] = !empty($data[$field]) ? $data[$field] : null;
                    $sql_set[] = '`' . $field . '` = :' . $field;
                }
            }
            if(!empty($user_data['login']) && !empty($user_data['pass'])) {
                if(!self::loginExists($user_data['login'])) {
                    $res = self::$_db->prepare('INSERT INTO `' . self::$_definition['table'] . '` SET ' . implode(', ', $sql_set) . ';');
                    $res->setFetchMode(\PDO::FETCH_ASSOC);
                    if($res->execute($user_data)) {
                        $result = self::$_db->lastInsertId();
                    }
                    else {
                        self::$_error_list[] = 'Hubo un error en la base de datos!';
                    }
                }
                else {
                    self::$_error_list[] = 'Ese login ya existe, porfavor utilize otro!';
                }
            }
            else {
                self::$_error_list[] = 'El campo Login y el campo Contraseña no pueden quedarse vacíos!';
            }
        }
        return $result;
    }

    /**
     * @method update: Update de datos de usuario (exceptuando la contrasenia y el login).
     *
     * @param int $userID           Id de usuario.
     * @param array $data           Tabla de datos de usuario con claves de acuerdo a la definición. Algunos datos
     * podrían omitirse.
     *
     * @return boolean Retroan resultados de la actualización.
     */
    static function update($userID, $data) {
        $result = false;
        self::$_error_list = array();
        if(self::$_init) {
            $user_data = array('id' => $userID);
            $sql_set = array();
            if(!empty($data)) {
                foreach($data as $key => $val) {
                    if(in_array($key, self::$_definition['fields'])) {
                        $user_data[$key] = !empty($val) ? $val : null;
                        $sql_set[] = '`' . $key . '` = :' . $key;
                    }
                }
                $res = self::$_db->prepare('UPDATE `' . self::$_definition['table'] . '` SET ' . implode(', ', $sql_set) . ' WHERE `' . self::$_definition['id'] . '` = :id;');
                $res->setFetchMode(\PDO::FETCH_ASSOC);
                if($res->execute($user_data)) {
                    $result = true;
                }
                else {
                    self::$_error_list[] = 'DB error';
                }
            }
        }
        return $result;
    }

    /**
     * @method delete utiliza el parametro $UserID para eliminar un usuario.
     *
     * @param int $userID           Id de usuario.
     *
     * @return boolean Retorna el resultado de eliminar un usuario y todos sus datos.
     */
    static function delete($userID) {
        $result = false;
        self::$_error_list = array();
        if(self::$_init) {
            $res = self::$_db->prepare('DELETE FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['id'] . '` = :id;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            if($res->execute(array('id' => $userID))) {
                $result = true;
            }
            else {
                self::$_error_list[] = 'DB error';
            }
        }
        return $result;
    }

    /**
     * @method loginUpdate: actualiza el login del usuario.
     *
     * @param int $userID           Id de usuario.
     * @param string $login     Login del usuario.
     *
     * @return boolean Retorna los resultados de la actualizacion del usuario.
     */
    static function loginUpdate($userID, $login) {
        $result = false;
        self::$_error_list = array();
        if(self::$_init) {
            if(!empty($userID) && !empty($login)) {
                if(!self::loginExists($login, $userID)) {
                    $res = self::$_db->prepare('UPDATE `' . self::$_definition['table'] . '` SET `' . self::$_definition['login'] . '` = :login WHERE `' . self::$_definition['id'] . '` = :id;');
                    $res->setFetchMode(\PDO::FETCH_ASSOC);
                    if($res->execute(array('id' => $userID, 'login' => $login))) {
                        $result = true;
                    }
                    else {
                        self::$_error_list[] = 'Error en la Base de datos';
                    }
                }
                else {
                    self::$_error_list[] = 'Este login ya existe, porfavor utilize otro!';
                }
            }
            else {
                self::$_error_list[] = 'Usuario y Login son requeridos para actualizar sus datos!';
            }
        }
        return $result;
    }

    /**
     * @method loginExists chequea si el login existe. Omite la comprobación del usuario actual.
     *
     * @param string $login     Login del usuario.
     * @param int $userID       Id del usuario actual cuyo valor por defecto es 0.
     *
     * @return boolean Returns result of check.
     */
    static function loginExists($login, $userID = 0) {
        $result = false;
        if(self::$_init) {
            $res = self::$_db->prepare('SELECT `' . self::$_definition['id'] . '` FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['login'] . '` = :login AND `' . self::$_definition['id'] . '` <> :id;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            $res->execute(array('id' => $userID, 'login' => $login));
            if($res->rowCount() > 0) {
                $result = true;
            }
        }
        return $result;
    }

    /**
     * @method passwordHashCreate hash de la contrasenia de usuario.
     *
     * @param string $pass  contrasenia del Usuario.
     *
     * @return string Retorna hash del password de usuario.
     */
    static function passwordHash($pass) {
        $salt = md5(microtime(true));
        $hash = $salt . md5($pass . $salt);
        return $hash;
    }

    /**
     * @method passwordCheck: chequea la contraseña del usuario.
     *
     * @param string $pass          Contrasenia del usuaro.
     * @param string $hash          Hash de la contrasenia del usuario.
     *
     * @return string Retorna el resultado del chequeo.
     */
    static function passwordCheck($pass, $hash) {
        $result = false;
        $salt = substr($hash, 0, 32);
        if($hash == $salt . md5($pass . $salt)) {
            $result = true;
        }
        return $result;
    }

    /**
     * @method passwordUpdate: actualiza la contraseña del usuario.
     *
     * @param int $userID           id del usuario.
     * @param string $pass          Contrasenia del usuario.
     *
     * @return boolean              Retorna el resultado de la actualizacion de la contraseña del usuario.
     */
    static function passwordUpdate($userID, $pass) {
        $result = false;
        self::$_error_list = array();
        if(self::$_init) {
            if(!empty($userID) && !empty($pass)) {
                $res = self::$_db->prepare('UPDATE `' . self::$_definition['table'] . '` SET `' . self::$_definition['pass'] . '` = :pass WHERE `' . self::$_definition['id'] . '` = :id;');
                $res->setFetchMode(\PDO::FETCH_ASSOC);
                if($res->execute(array('id' => $userID, 'pass' => self::passwordHash($pass)))) {
                    $result = true;
                }
                else {
                    self::$_error_list[] = 'Error en la Base de Datos';
                }
            }
            else {
                self::$_error_list[] = 'Usuario y Contraseña son campos requeridos para actualizar su contraseña!';
            }
        }
        return $result;
    }

    /**
     * Get user password hash.
     *
     * @param int $userID           ID del usuario.
     *
     * @return string|false         Retorna la 'contrasenia' hash o 'false'.
     */
    static function passwordGet($userID) {
        $result = false;
        if(self::$_init) {
            $res = self::$_db->prepare('SELECT `' . self::$_definition['id'] . '`, `' . self::$_definition['pass'] . '` FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['id'] . '` = :id;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            $res->execute(array('id' => $userID));
            if($lot = $res->fetch()) {
                $result = $lot[self::$_definition['pass']];
            }
        }
        return $result;
    }

    /**
     * @method login: loguea al usuario en el sistema. Empieza una session de usuario.
     *
     * @param string $login     Login de usuario.
     * @param string $pass          Contrasenia del usuario.
     *
     * @return boolean Retorna el resultado del logueo del usuario.
     */
    static function login($login, $pass) {
        $result = false;
        if(self::$_init) {
            $res = self::$_db->prepare('SELECT `' . self::$_definition['id'] . '`, `' . self::$_definition['pass'] . '` FROM `' . self::$_definition['table'] . '` WHERE `' . self::$_definition['login'] . '` = :login;');
            $res->setFetchMode(\PDO::FETCH_ASSOC);
            $res->execute(array('login' => $login));
            if($lot = $res->fetch()) {
                if(self::passwordCheck($pass, $lot[self::$_definition['pass']])) {
                    session_regenerate_id();
                    $result = true;
                    $key = md5(microtime(true));
                    $_SESSION['user']['id'] = $lot[self::$_definition['id']];
                    $_SESSION['user']['key'] = $key;
                    $_SESSION['user']['time'] = time() + self::VidaUtilSession;
                    $res = self::$_db->prepare('UPDATE `' . self::$_definition['table'] . '` SET `' . self::$_definition['key'] . '` = :key WHERE `' . self::$_definition['id'] . '` = :id;');
                    $res->setFetchMode(\PDO::FETCH_ASSOC);
                    $res->execute(array('key' => $key, 'id' => $lot[self::$_definition['id']]));
                }
            }
        }
        return $result;
    }

    /**
     * @method logout: realiza el logout del usuario. Detiene la session de usuario.
     *
     * @return : retorna true
     */
    static function logout() {
        $_SESSION['user'] = null;
        session_regenerate_id();
        return true;
    }

    /**
     * @method recover: Establece una contrasenia de usuario de manera aleatoria.
     *
     * @param string $login     Login de usuario.
     *
     * @return string|false Retorna una nueva contrasenia o false si ha ocurrido algun error.
     */
    static function recover($login) {
        $result = false;
        if(self::$_init) {
            $pass = substr(md5(microtime(true)), 0, 6);
            $user = self::getByLogin($login);
            if(!empty($user['id'])) {
                if($result = self::passwordUpdate($user['id'], $pass)) {
                    $result = $pass;
                }
            }
        }
        return $result;
    }

    /**
     * Return list of latest errors.
     *
     * @return array Returns list of latest errors.
     */
    static function getError() {
        return self::$_error_list;
    }

    /**
     * @method check: chequea la session usuario.
     *
     * @return boolean Retorna el resultado del chequeo. Si false expulsa al usuario.
     */
    static function check() {
        $result = false;
        if(self::$_init) {
            $now = time();
            if(!empty($_SESSION['user']['id']) && !empty($_SESSION['user']['key'])) {
                if($now < $_SESSION['user']['time']) {
                    $now = time();
                    $user = self::getByID($_SESSION['user']['id']);
                    if($user['key'] == $_SESSION['user']['key']) {
                        $_SESSION['user']['time'] = time() + self::VidaUtilSession;
                        $result = true;
                    }
                }

                if(!$result) {
                    self::logout();
                }
            }
        }
        return $result;
    }

}

  • En este script hemos creado la class 'Usuario' que a través de sus métodos es la encargada de conectarnos a nuestra Base de datos llamada "conexionpdo" y realizar los procedimientos necesarios para conseguir que nuestro script trabaje de forma eficaz, consiguiendo los objetivos.
Tercer PasoConstruyendo nuestro formulario de Registro en HTML5 utilizando algunas dependencias bootstrap para realizar la maquetación y las validaciones respectivas.
  • Para este proceso crearemos un archivo llamado 'index.php', que es el que inicia nuestro sistema SystemRegPHP.
  • Este formulário lo que hace es logar al usuario, imprimiendo en pantalla mensajes de error en caso el usuario no se haya cadastrado ó el login y la contraseña no esten coincidiendo con los que tenemos en nuestra base de datos.
  • Este formulario a su vez será utilizado por el usuario de nuestro sistema para enviar informaciones a nuestra base de datos y conseguir logarse consiguiendo acceder al archivo 'micuenta.php' en caso se haya cadastrado correctamente en la página 'registrese.php';

Archivo index.php


<?php
/**
 * Project: SystemRegPHP
 * Author: MiSCapu
 * Date: 20/04/2017
 * Time: 19:42
 */
    /**
     * SystemRegPHP\Usuario
     * Área de Logueo
     */
    session_start();
    require_once('controladores/Usuario.class.php');

    /* Usando mi namespace SystemRegPHP y heredo la classe Usuario */
    use SystemRegPHP\Usuario as Usuario;

    /* Acceso a MySQL */
    $sql_driver = 'mysql';
    $sql_host = 'localhost';
    $sql_name = 'conexionpdo';
    $sql_user = 'root';
    $sql_pass = 'mignan22';
    Usuario::init($sql_driver, $sql_host, $sql_name, $sql_user, $sql_pass);

    /* Chequeando usuario actual */
    $user = false;
    if(Usuario::check()) {
        /* redirecciona para cuenta de usuario(área restrita para usuarios cadastrados) */
        header('Location: vistas/micuenta.php');
        exit();
    }

    /* Valores por defecto */
    $login = '';

    /* ------------------------------Rutina de login------------------------------------- */
    $login_error = array();
    /**
     * $_POST['enter']: es lo que manda nuestro formulario abajo codificado via post (línea 124)
     * si existe $_POST['enter'] puede pasar lo siguiente:
     * la @var string login no esta vacía? entonces asígnele el valor de $_POST['enter']; lo mismo para $password
    */
    if(isset($_POST['enter'])) {
        $login = !empty($_POST['login']) ? $_POST['login'] : '';
        $password = !empty($_POST['password']) ? $_POST['password'] : '';

        $error_flag = false;

        if(empty($login)) {
            /* login es requerido */
            $login_error['login'] = 'Login es requerido';
            $error_flag = true;
        }

        if(empty($password)) {
            /* password es requerido */
            $login_error['password'] = 'Contraseña es requerida';
            $error_flag = true;
        }

        /* todos los chequeos aprovados */
        if(!$error_flag) {
            if(Usuario::login($login, $password)) {
                /* redirecciona para el área de la cuenta del usuario (area restricta) */
                header('Location: vistas/micuenta.php');
                exit();
            }
            else {
                $login_error['general'] = 'Su login o su contraseña no estan correctos!';
            }
        }
    }

?>

<html>
<head>
    <title>SystemRegPHP: Área de Logueo de Usuarios</title>
    <link rel="stylesheet" href="src/assets/css/bootstrap.min.css"/>
</head>
<body>
<nav class="navbar navbar-default">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">SystemRegPHP</a>
        </div>

        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="index.php">Login <span class="sr-only">(current)</span></a></li>
                <li><a href="vistas/registrese.php">Registrese</a></li>
                <li><a href="vistas/recuperacuenta.php">Recupere su Cuenta</a></li>
            </ul>
        </div>
    </div>
</nav>

<div class="container">
    <h1>Login</h1>

    <div class="row">
        <div class="col-xs-12 col-sm-6 col-md-4 col-sm-offset-3 col-md-offset-4">
            <form action="" method="post">
                <div class="form-group">
                    <label for="login">Login</label>
                    <input type="text" class="form-control" name="login" id="login" placeholder="Login" value="<?php echo $login; ?>"/>
                    <?php if(!empty($login_error['login'])) { ?>
                        <br/>
                        <div class="alert alert-danger" role="alert"><?php echo $login_error['login']; ?></div>
                    <?php } ?>
                </div>
                <div class="form-group">
                    <label for="password">Contraseña</label>
                    <input type="password" class="form-control" name="password" id="password" placeholder="contraseña" value=""/>
                    <?php if(!empty($login_error['password'])) { ?>
                        <br/>
                        <div class="alert alert-danger" role="alert"><?php echo $login_error['password']; ?></div>
                    <?php } ?>
                </div>
                <button type="submit" name="enter" class="btn btn-primary">Login</button>
                <?php if(!empty($login_error['general'])) { ?>
                    <br/><br/>
                    <div class="alert alert-danger" role="alert"><?php echo $login_error['general']; ?></div>
                <?php } ?>
            </form>
        </div>
    </div>
</div>
</body>
</html>

Cuarto PasoConstruyendo nuestro formulario de Registro en HTML5, tambien utilizando algunas dependencias bootstrap para realizar la maquetación y las validaciones respectivas.
  • Para este paso creamos una carpeta llamada 'vistas' y dentro un archivo llamado 'registrese.php', el cual alberga el código HTML5 de nuestro formulario de registro.
  • Este formulario a su vez será utilizado por el usuario de nuestro sistema para informar sus datos de acceso que serán aloados en nuestra BD 'conexionpdo'; (método add del archivo Usuario.class.php)
  • Esta página mostrará 2 errores en caso:
  • en caso no existan datos para ingresar; osea cuando el usuario deja vacíos los campos de registro (todo esto en el método add del archivo Usuario.class.php)
  • y cuando el login introducido por el usuario ya exista en nuestra base de datos (método add del archivo Usuario.class.php), veamos:

Archivo vistas/registrese.php


<?php
/**
 * Project: SystemRegPHP
 * Author: MiSCapu
 * Date: 20/04/2017
 * Time: 22:59
 */
    /**
     * SystemRegPHP\Usuario --Área de Registro--
     */
    session_start();
    require_once('./../Controladores/Usuario.class.php');

    /* usando mi namespace SystemRegPHP y nuestra classe Usuario */
    use SystemRegPHP\Usuario as Usuario;

    /* Introduciendo datos ára tener acceso a MySQL */
    $sql_driver = 'mysql';
    $sql_host = 'localhost';
    $sql_name = 'conexionpdo';
    $sql_user = 'root';
    $sql_pass = '*****';
    Usuario::init($sql_driver, $sql_host, $sql_name, $sql_user, $sql_pass);

    /* Chequeando el usuario Actual */
    $user = false;
    if(Usuario::check()) {
        /* Redirecciono para micuenta.php */
        header('Location: micuenta.php');
        exit();
    }

    /* valores por defecto */
    $login = '';
    $password = '';
    $password_key = '';

    /* --------------------------------------Rutinas de Registro-------------------------------- */
    $registration_error = array();
    if(isset($_POST['registrtion'])) {
        $login = !empty($_POST['login']) ? $_POST['login'] : '';
        $password = !empty($_POST['password']) ? $_POST['password'] : '';
        $password_key = !empty($_POST['password_key']) ? $_POST['password_key'] : '';

        $error_flag = false;

        if(empty($login)) {
            /* Login es requerido */
            $registration_error['login'] = 'Un login es requerido para su acceso';
            $error_flag = true;
        }
        else if(Usuario::loginExists($login)) {
            /* Login ya existente :( */
            $registration_error['login'] = 'Ese Login infelizmente ya existe en nuestro sistema, elija otro!';
            $error_flag = true;
        }

        if(empty($password)) {
            /* Contraseña es requerida */
            $registration_error['password'] = 'Una Contraseña es requerida para su próximo acceso!';
            $error_flag = true;
        }
        else if($password != $password_key) {
            /* chequea la contraseña y dispara un error si no coinciden */
            $registration_error['password_key'] = 'Esa contraseña no coincide con la anterior, debe ser igual';
            $error_flag = true;
        }

        /* Pasó todos los chequeos, podemos darle el permiso de entrar a el archivo "micuenta.php" */
        if(!$error_flag) {
            $user_data = array(
                'login' => $login,
                'pass' => $password
            );
            $userID = Usuario::add($user_data);
            if(!empty($userID)) {
                /* registration done */
                /* login user and redirect to account */
                if(Usuario::login($login, $password)) {
                    /* redirect to user account */
                    header('Location: micuenta.php');
                    exit();
                }
            }
            else {
                $registration_error['general'] = implode('<br/>', Usuario::getError());
            }
        }
    }

?>

<html>
<head>
    <title>SystemRegPHP: Área de Registro</title>
    <link rel="stylesheet" href="./../src/assets/css/bootstrap.min.css"/>
</head>
<body>
<nav class="navbar navbar-default">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">SystemRegPHP</a>
        </div>

        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li><a href="./../index.php">Login</a></li>
                <li class="active"><a href="registrese.php">Registro <span class="sr-only">(Actual)</span></a></li>
                <li><a href="recuperacuenta.php">Recupere Su Cuenta</a></li>
            </ul>
        </div>
    </div>
</nav>

<div class="container">
    <h1>Registrese:</h1>

    <div class="row">
        <div class="col-xs-12 col-sm-6 col-md-4 col-sm-offset-3 col-md-offset-4">
            <form action="" method="post">
                <div class="form-group">
                    <label for="login">Login</label>
                    <input type="text" class="form-control" name="login" id="login" placeholder="Login" value="<?php echo $login; ?>"/>
                    <?php if(!empty($registration_error['login'])) { ?>
                        <br/>
                        <div class="alert alert-danger" role="alert"><?php echo $registration_error['login']; ?></div>
                    <?php } ?>
                </div>
                <div class="form-group">
                    <label for="password">Contraseña</label>
                    <input type="password" class="form-control" name="password" id="password" placeholder="Contraseña" value="<?php echo $password; ?>"/>
                    <?php if(!empty($registration_error['password'])) { ?>
                        <br/>
                        <div class="alert alert-danger" role="alert"><?php echo $registration_error['password']; ?></div>
                    <?php } ?>
                </div>
                <div class="form-group">
                    <label for="password_key">Confirme su Contraseña</label>
                    <input type="password" class="form-control" name="password_key" id="password_key" placeholder="Confirme su Contraseña" value="<?php echo $password_key; ?>"/>
                    <?php if(!empty($registration_error['password_key'])) { ?>
                        <br/>
                        <div class="alert alert-danger" role="alert"><?php echo $registration_error['password_key']; ?></div>
                    <?php } ?>
                </div>
                <button type="submit" name="registrtion" class="btn btn-primary">Registrese</button>
                <?php if(!empty($registration_error['general'])) { ?>
                    <br/><br/>
                    <div class="alert alert-danger" role="alert"><?php echo $registration_error['general']; ?></div>
                <?php } ?>
            </form>
        </div>
    </div>
</div>
</body>
</html>

    Quinto PasoAhora es el momento de crear nuestro archivo "micuenta.php"; el cual contiene 3 formularios uno al lado del otro; los cuales se encargan de realizar las actualizaciones de login y contraseña según lo que desee el usuario logado. Siguiendo la organización de nuestro Sistema, vamos a incluir este archivo en la carpeta vistas
    • El archivo micuenta.php contiene un script PHP, el cual incluye al archivo Usuario.class.php para tener acceso a la class Usuario ahí contenida.
    • Realiza mediante varios scripts la actualización de los datos del usuario ya anteriormente logado, veamos: 

    Archivo vistas/micuenta.php


    <?php
    /**
     * Project: SystemRegPHP
     * Author: MiScapu
     * Date: 20/04/2017
     * Time: 21:22
     */
        /**
         * SystemRegPHP\Usuario micuenta.php
         */
        session_start();
        require_once('./../Controladores/Usuario.class.php');
    
        /* usando el namespace SystemRegPHP y la classe Usuario */
        use SystemRegPHP\Usuario as Usuario;
    
        /* Ingresando los datos para accesar MySQL */
        $sql_driver = 'mysql';
        $sql_host = 'localhost';
        $sql_name = 'conexionpdo';
        $sql_user = 'root';
        $sql_pass = '*****';
        Usuario::init($sql_driver, $sql_host, $sql_name, $sql_user, $sql_pass);
    
        /* chequea al usuario actual */
        $user = false;
        if(Usuario::check()) {
            $user = Usuario::getByID($_SESSION['user']['id']);
        }
        else {
            /* redireccionando a index.php */
            header('Location: ../../index.php');
            exit();
        }
    
        /* rutina de datos para actualizar (si existen datos para actualizar $data_update es true)  */
        $data_error = array();
        $data_update = false;
        if(isset($_POST['update_data'])) {
            $user['name'] = !empty($_POST['name']) ? $_POST['name'] : '';
            $user['mail'] = !empty($_POST['mail']) ? $_POST['mail'] : '';
            if(Usuario::update($user['id'], $user)) {
                $data_update = true;
            }
            else {
                $data_error['general'] = implode('<br/>', Usuario::getError());
            }
        }
    
        /* actualizando login */
        $login_error = array();
        $login_update = false;
        if(isset($_POST['update_login'])) {
            $login = !empty($_POST['login']) ? $_POST['login'] : '';
            $password = !empty($_POST['password']) ? $_POST['password'] : '';
    
            $error_flag = false;
    
            if(empty($login)) {
                /* login is required */
                $login_error['login'] = 'Un Login es requerido';
                $error_flag = true;
            }
    
            if(empty($password)) {
                /* contraseña es requerida */
                $login_error['password'] = 'Una Contraseña es requerida';
                $error_flag = true;
            }
            else {
                $hash = Usuario::passwordGet($user['id']);
                if(!Usuario::passwordCheck($password, $hash)) {
                    $login_error['password'] = 'Esa Contraseña no es igual a la anterior!';
                    $error_flag = true;
                }
            }
    
            if(!$error_flag) {
                if(Usuario::loginUpdate($user['id'], $login)) {
                    $login_update = true;
                    $user['login'] = $login;
                }
                else {
                    $login_error['general'] = implode('<br/>', Usuario::getError());
                }
            }
        }
    
        /* Actualiza contraseña */
        $password_error = array();
        $password_update = false;
        if(isset($_POST['update_password'])) {
            $password = !empty($_POST['password']) ? $_POST['password'] : '';
            $password_new = !empty($_POST['password_new']) ? $_POST['password_new'] : '';
            $password_key = !empty($_POST['password_key']) ? $_POST['password_key'] : '';
    
            $error_flag = false;
    
            if(empty($password)) {
                /* contraseña es requerida */
                $password_error['password'] = 'Para Actualizar, ingrese su contraseña antigua!';
                $error_flag = true;
            }
            else {
                $hash = Usuario::passwordGet($user['id']);
                if(!Usuario::passwordCheck($password, $hash)) {
                    $password_error['password'] = 'Esa Contraseña no existe en nuestra base de datos!';
                    $error_flag = true;
                }
            }
            /**
             * Área de contraseña nueva
            */
            if(empty($password_new)) {
                /* contraseña es requerida */
                $password_error['password_new'] = 'Ingrese una nueva contraseña; sólo despues de haber ingresado su antigua contraseña en el campo anterior!';
                $error_flag = true;
            }
            else if($password_new != $password_key) {
                /* chequeando la contraseña para que sea igual a la anterior ¿$password_new === password_key?  */
                $password_error['password_key'] = 'Esta Contraseña debe coincidir con la anterior!';
                $error_flag = true;
            }
    
            if(!$error_flag) {
                if(Usuario::passwordUpdate($user['id'], $password_new)) {
                    $password_update = true;
                }
                else {
                    $password_error['general'] = implode('<br/>', Usuario::getError());
                }
            }
        }
    ?>
    
    <html>
    <head>
        <title>SystemRegPHP: Mi Cuenta</title>
        <link rel="stylesheet" href="./../src/assets/css/bootstrap.css"/>
    </head>
    <body>
    <nav class="navbar navbar-default">
        <div class="container-fluid">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">SystemRegPHP</a>
            </div>
    
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li><a href="#">Hola, <?php echo $user['name']; ?></a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="./../Controladores/logout.php">Salir</a></li>
                </ul>
            </div>
        </div>
    </nav>
    
    <div class="container">
        <h1>Account</h1>
    
        <div class="row">
            <div class="col-xs-12 col-sm-6 col-md-4">
                <div class="panel panel-default">
                    <div class="panel-heading">Datos de usuario</div>
                    <div class="panel-body">
                        <form action="" method="post">
                            <div class="form-group">
                                <label for="name">Nombre Completo</label>
                                <input type="text" class="form-control" name="name" id="name" placeholder="Su Nombre" value="<?php echo $user['name']; ?>"/>
                            </div>
                            <div class="form-group">
                                <label for="mail">E-mail</label>
                                <input type="text" class="form-control" name="mail" id="mail" placeholder="E-Mail" value="<?php echo $user['mail']; ?>"/>
                            </div>
                            <button type="submit" name="update_data" class="btn btn-primary">Actualize</button>
                            <?php if(!empty($data_error['general'])) { ?>
                                <br/><br/>
                                <div class="alert alert-danger" role="alert"><?php echo $data_error['general']; ?></div>
                            <?php } ?>
                            <?php if(!empty($data_update)) { ?>
                                <br/><br/>
                                <div class="alert alert-success" role="alert">Datos Actualizados correctamente!</div>
                            <?php } ?>
                        </form>
                    </div>
                </div>
            </div>
    
            <div class="col-xs-12 col-sm-6 col-md-4">
                <div class="panel panel-default">
                    <div class="panel-heading">Nuevo Login</div>
                    <div class="panel-body">
                        <form action="" method="post">
                            <div class="form-group">
                                <label for="login">Nuevo Login</label>
                                <input type="text" class="form-control" name="login" id="login" placeholder="Nuevo Login" value="<?php echo $user['login']; ?>"/>
                                <?php if(!empty($login_error['login'])) { ?>
                                    <br/>
                                    <div class="alert alert-danger" role="alert"><?php echo $login_error['login']; ?></div>
                                <?php } ?>
                            </div>
                            <div class="form-group">
                                <label for="password">Contraseña</label>
                                <input type="password" class="form-control" name="password" id="password" placeholder="Contraseña" value=""/>
                                <?php if(!empty($login_error['password'])) { ?>
                                    <br/>
                                    <div class="alert alert-danger" role="alert"><?php echo $login_error['password']; ?></div>
                                <?php } ?>
                            </div>
                            <button type="submit" name="update_login" class="btn btn-primary">Actualizar</button>
                            <?php if(!empty($login_error['general'])) { ?>
                                <br/><br/>
                                <div class="alert alert-danger" role="alert"><?php echo $login_error['general']; ?></div>
                            <?php } ?>
                            <?php if(!empty($login_update)) { ?>
                                <br/><br/>
                                <div class="alert alert-success" role="alert">Login Actualizado con suceso!</div>
                            <?php } ?>
                        </form>
                    </div>
                </div>
            </div>
    
            <div class="col-xs-12 col-sm-6 col-md-4">
                <div class="panel panel-default">
                    <div class="panel-heading">Nueva Contraseña</div>
                    <div class="panel-body">
                        <form action="" method="post">
                            <div class="form-group">
                                <label for="password">Contraseña Antigua</label>
                                <input type="password" class="form-control" name="password" id="password" placeholder="Su Contraseña Antigua" value=""/>
                                <?php if(!empty($password_error['password'])) { ?>
                                    <br/>
                                    <div class="alert alert-danger" role="alert"><?php echo $password_error['password']; ?></div>
                                <?php } ?>
                            </div>
                            <div class="form-group">
                                <label for="password_new">Nueva Contraseña</label>
                                <input type="password" class="form-control" name="password_new" id="password_new" placeholder="Su nueva Contraseña" value=""/>
                                <?php if(!empty($password_error['password_new'])) { ?>
                                    <br/>
                                    <div class="alert alert-danger" role="alert"><?php echo $password_error['password_new']; ?></div>
                                <?php } ?>
                            </div>
                            <div class="form-group">
                                <label for="password_key">Confirme su nueva Contraseña</label>
                                <input type="password" class="form-control" name="password_key" id="password_key" placeholder="Confirme su Contraseña" value=""/>
                                <?php if(!empty($password_error['password_key'])) { ?>
                                    <br/>
                                    <div class="alert alert-danger" role="alert"><?php echo $password_error['password_key']; ?></div>
                                <?php } ?>
                            </div>
                            <button type="submit" name="update_password" class="btn btn-primary">Actualizar</button>
                            <?php if(!empty($password_error['general'])) { ?>
                                <br/><br/>
                                <div class="alert alert-danger" role="alert"><?php echo $password_error['general']; ?></div>
                            <?php } ?>
                            <?php if(!empty($password_update)) { ?>
                                <br/><br/>
                                <div class="alert alert-success" role="alert">Su Contraseña fué actualizada </div>
                            <?php } ?>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </body>
    </html>
    


    Sexto PasoAhora es el momento de crear nuestro archivo "recuperarcuenta.php"; el cual contiene 1 formulario; los cuales a travez de un script nos proporciona una contraseña aleatoria para poder acceder a nuestro sistema. No mostrará esta contraseña en caso el login no exista en nuestra BD. Este archivo también estará incluido en la carpeta 'vistas' por motivo de organización de nuestro sistema.
    • El archivo recuperarcuenta.php contiene un script PHP, el cual incluye al archivo Usuario.class.php para tener acceso a la class Usuario ahí contenida.
    • Realiza mediante varios scripts la creación de una contraseña aleatoria para tener acceso a nuestro sistema, veamos: 

    Archivo vistas/recuperarcuenta.php


    <?php
    /**
     * Created by PhpStorm.
     * User: Miguel
     * Date: 20/04/2017
     * Time: 22:55
     */
        /**
         * SystemRegPHP\Usuario --Área para recuperar Cuenta--
         */
        session_start();
        require_once('./../Controladores/Usuario.class.php');
    
        /* Utilizando nuestro namespace y nuestra classe Usuario */
        use SystemRegPHP\Usuario as Usuario;
    
        /* Mysql access */
        $sql_driver = 'mysql';
        $sql_host = 'localhost';
        $sql_name = 'conexionpdo';
        $sql_user = 'root';
        $sql_pass = '*****';
        Usuario::init($sql_driver, $sql_host, $sql_name, $sql_user, $sql_pass);
    
        /* check current user */
        $user = false;
        if(Usuario::check()) {
            /* redirect to user account */
            header('Location: micuenta.php');
            exit();
        }
    
        /* default values */
        $login = '';
        $password = '';
    
        /* login routine */
        $recover_error = array();
        if(isset($_POST['recover'])) {
            $login = !empty($_POST['login']) ? $_POST['login'] : '';
    
            $error_flag = false;
    
            if(empty($login)) {
                /* login is required */
                $recover_error['login'] = 'Login is required';
                $error_flag = true;
            }
            /* We shouldn't check existence of login! */
    
            /* all checks passed */
            if(!$error_flag) {
                $password = Usuario::recover($login);
                if(empty($password)) {
                    $recover_error['general'] = implode('<br/>', Usuario::getError());
                }
            }
        }
    
    ?>
    
    <html>
    <head>
        <title>SystemRegPHP: Recupere su cuenta</title>
        <link rel="stylesheet" href="./../src/assets/css/bootstrap.min.css"/>
    </head>
    <body>
    <nav class="navbar navbar-default">
        <div class="container-fluid">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">SystemRegPHP</a>
            </div>
    
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li><a href="./../index.php">Login <span class="sr-only">(current)</span></a></li>
                    <li><a href="registrese.php">Registration</a></li>
                    <li class="active"><a href="recuperacuenta.php">Recover account</a></li>
                </ul>
            </div>
        </div>
    </nav>
    
    <div class="container">
        <h1>Recover</h1>
    
        <div class="row">
            <div class="col-xs-12 col-sm-6 col-md-4 col-sm-offset-3 col-md-offset-4">
                <form action="" method="post">
                    <div class="form-group">
                        <label for="login">Login</label>
                        <input type="text" class="form-control" name="login" id="login" placeholder="Login" value="<?php echo $login; ?>"/>
                        <?php if(!empty($recover_error['login'])) { ?>
                            <br/>
                            <div class="alert alert-danger" role="alert"><?php echo $recover_error['login']; ?></div>
                        <?php } ?>
                    </div>
                    <button type="submit" name="recover" class="btn btn-primary">Recuperar</button>
                    <?php if(!empty($recover_error['general'])) { ?>
                        <br/><br/>
                        <div class="alert alert-danger" role="alert"><?php echo $recover_error['general']; ?></div>
                    <?php } ?>
                    <?php if(!empty($password)) { ?>
                        <br/><br/>
                        <div class="alert alert-success" role="alert">Su nueva Contraseña: <?php echo $password; ?>.<br/>(Envie esto para su email)</div>
                    <?php } ?>
                </form>
            </div>
        </div>
    </div>
    </body>
    </html>
    


    Sétimo PasoAhora es el momento de crear nuestro último archivo "logout.php"; el cual contiene al script que eliminará la session creada por el usuario y lo llevará al formulario de login para que se loguee nuevamente. 
    • Creamos un archivo 'logout.php' dentro de la carpeta Controladores.
    • El archivo logout.php contiene un script PHP, el cual incluye al archivo Usuario.class.php para tener acceso a la class Usuario ahí contenida.
    • Utiliza al método logout de la class Usuario para conseguir eliminar la session actual y
    • lleva al usuario al formulario de login de usuario ("index.php"), veamos: 

    Archivo Controladores/logout.php


    <?php
    /**
     * Project: SystemRegPHP
     * Author: MiSCapuguel
     * Date: 20/04/2017
     * Time: 22:48
     */
        /**
         * SystemRegPHP\Usuario --Script para Logout--
         */
        session_start();
        require_once('Usuario.class.php');
    
        /* Utilizando la Class Usuario y el namespace SystemRegPHP */
        use SystemRegPHP\Usuario as Usuario;
    
        /* Acceso a Mysql */
        $sql_driver = 'mysql';
        $sql_host = 'localhost';
        $sql_name = 'conexionpdo';
        $sql_user = 'root';
        $sql_pass = '****';
        Usuario::init($sql_driver, $sql_host, $sql_name, $sql_user, $sql_pass);
    
        Usuario::logout();
    
        header('Location: ./../index.php');
        exit();
    
    

      • Si hemos codificado de manera correcta todos estos archivos e integrado nuestros datos de acceso a MySQL; obtendremos en nuestro navegador el siguiente panorama:
      Bueno con esto culminamos un artículo muy importante que nos muestra claramente con detalles como es que podemos realizar la conexión a una base de datos MySQL utilizando el API PDO de PHP e interactuar con esta base de datos a travez de un formulario con validaciones, todo paso a paso para que sea entendible!.
      Compartir:
      Localización Gov. Celso Ramos, SC, Brasil

      Aplicativo PHP

      PDO

      PHP

      PHP y MySQL

      SystemRegPHP

      Déjenos su Comentário:

      0 commentários: