En este tutorial vamos a ver un simple registro de usuarios e inicio de sesión con la opción de restablecer la contraseña en caso de que el usuario la haya olvidado, usaremos programación orientada a objetos con PHP5, MySQLi, jQuery y Bootstrap. Además el sistema incluye una serie de plantillas para mostrar después que el usuario haya iniciado sesión, dichas páginas son (home.php, info.php, header.php, footer.php y account.php).
Paso 1:
Crear la base de datos y la tabla de ejemplo para este tutorial con la siguientes consultas:
-- -- Database: `login` -- CREATE DATABASE IF NOT EXISTS `login` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE `login`; -- -------------------------------------------------------- -- -- Table structure for table `users` -- CREATE TABLE IF NOT EXISTS `users` ( `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `email` varchar(60) NOT NULL, `password` varchar(60) NOT NULL, `social_id` varchar(100) NOT NULL, `picture` varchar(250) NOT NULL, `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`user_id`), KEY `email` (`email`), KEY `login` (`password`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Paso 2:
Crear archivo config.php y definir información de configuración generales relacionados en el mismo.
<?php require_once 'messages.php';define( 'BASE_PATH', 'http://localhost/login/');//Ruta base donde se encuentra define( 'DB_HOST', 'localhost' );//Servidor de la base de datos define( 'DB_USERNAME', 'root');//Usuario de la base de datos define( 'DB_PASSWORD', 'root');//Contraseña de la base de datos define( 'DB_NAME', 'login');//Nombre de la base de datos
function __autoload($class) { $parts = explode('_', $class); $path = implode(DIRECTORY_SEPARATOR,$parts); require_once $path . '.php'; }
En donde __autoload() es una de las mágicas funciones de PHP5. Si quieres usar las mismas clases en otros archivos php, debes incluir el archivo de la clase usando require_once o include_once para usar las funciones de esa clase.
Ahora crear el archivo messages.php, que tendrá todos los mensaje de éxito así como de error.
<?php
define('FIELDS_MISSING', 'Algunos campos faltan');
define('PASSWORD_NOT_MATCH', 'Las contraseñas no coinciden');
define('USER_REGISTRATION_FAIL', 'Registro de usuarios falló');
define('USER_REGISTRATION_SUCCESS', 'Registro de usuario se ha realizado correctamente , puede iniciar sesión ahora');
define('LOGIN_FIELDS_MISSING', 'Correo electrónico y contraseña faltan');
define('LOGIN_FAIL', 'Correo electrónico y/o Contraseña no coinciden');
define('PASSOWRD_CHANAGE_SUCCESS', 'Contraseña cambiada con éxito.');
Ahora cree DBclass.php y crear DBclass en ella.
<?php
class Cl_DBclass
{
/**
* @var $con llevará a cabo la conexión de base de datos
*/
public $con;
/**
* Esto creará la conexión de base de datos
*/
public function __construct()
{
$this->con = mysqli_connect(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
if( mysqli_connect_error()) echo "Falló conexión a MySQL: " . mysqli_connect_error();
}
}
Paso 3:
Crear archivo User.php, que va a manejar todos las funcionalidades lógicas. mientras va a guardar los datos en la base de datos que es valida los datos, una vez que pasen validación entonces guarda los datos enviados a la base de datos. Si falla la validación que entonces envía la Excepción de error.
<?php
class Cl_User
{
/**
* @var va a contener la conexión de base de datos
*/
protected $_con;
/**
* Inializar DBclass
*/
public function __construct()
{
$db = new Cl_DBclass();
$this->_con = $db->con;
}
/**
* Registro de usuarios
* @param array $data
*/
public function registration( array $data )
{
if( !empty( $data ) ){
// Trim todos los datos entrantes:
$trimmed_data = array_map('trim', $data);
// escapar de las variables para la seguridad
$name = mysqli_real_escape_string( $this->_con, $trimmed_data['name'] );
$password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] );
$cpassword = mysqli_real_escape_string( $this->_con, $trimmed_data['confirm_password'] );
// Verifica la direccion de correo electrónico:
if (filter_var( $trimmed_data['email'], FILTER_VALIDATE_EMAIL)) {
$email = mysqli_real_escape_string( $this->_con, $trimmed_data['email']);
} else {
throw new Exception( "Por favor, introduce una dirección de correo electrónico válida!" );
}
if((!$name) || (!$email) || (!$password) || (!$cpassword) ) {
throw new Exception( FIELDS_MISSING );
}
if ($password !== $cpassword) {
throw new Exception( PASSWORD_NOT_MATCH );
}
$password = md5( $password );
$query = "INSERT INTO users (user_id, name, email, password, created) VALUES (NULL, '$name', '$email', '$password', CURRENT_TIMESTAMP)";
if(mysqli_query($this->_con, $query)){
mysqli_close($this->_con);
return true;
};
} else{
throw new Exception( USER_REGISTRATION_FAIL );
}
}
/**
* Este metodo para iniciar sesión
* @param array $data
* @return retorna falso o verdadero
*/
public function login( array $data )
{
$_SESSION['logged_in'] = false;
if( !empty( $data ) ){
// Trim todos los datos entrantes:
$trimmed_data = array_map('trim', $data);
// escapar de las variables para la seguridad
$email = mysqli_real_escape_string( $this->_con, $trimmed_data['email'] );
$password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] );
if((!$email) || (!$password) ) {
throw new Exception( LOGIN_FIELDS_MISSING );
}
$password = md5( $password );
$query = "SELECT user_id, name, email, created FROM users where email = '$email' and password = '$password' ";
$result = mysqli_query($this->_con, $query);
$data = mysqli_fetch_assoc($result);
$count = mysqli_num_rows($result);
mysqli_close($this->_con);
if( $count == 1){
$_SESSION = $data;
$_SESSION['logged_in'] = true;
return true;
}else{
throw new Exception( LOGIN_FAIL );
}
} else{
throw new Exception( LOGIN_FIELDS_MISSING );
}
}
/**
* El siguiente metodo para verificar los datos de la cuenta para el cambio de contraseña
* @param array $data
* @throws Exception
* @return boolean
*/
public function account( array $data )
{
if( !empty( $data ) ){
// Trim todos los datos entrantes:
$trimmed_data = array_map('trim', $data);
// escapar de las variables para la seguridad
$password = mysqli_real_escape_string( $this->_con, $trimmed_data['password'] );
$cpassword = $trimmed_data['confirm_password'];
$user_id = mysqli_real_escape_string( $this->_con, $trimmed_data['user_id'] );
if((!$password) || (!$cpassword) ) {
throw new Exception( FIELDS_MISSING );
}
if ($password !== $cpassword) {
throw new Exception( PASSWORD_NOT_MATCH );
}
$password = md5( $password );
$query = "UPDATE users SET password = '$password' WHERE user_id = '$user_id'";
if(mysqli_query($this->_con, $query)){
mysqli_close($this->_con);
return true;
}
} else{
throw new Exception( FIELDS_MISSING );
}
}
/**
* Este metodo para cerrar las sesión
*/
public function logout()
{
session_unset();
session_destroy();
header('Location: index.php');
}
/**
* Esto restablece la contraseña actual y la nueva contraseña para enviar correo
* @param array $data
* @throws Exception
* @return boolean
*/
public function forgetPassword( array $data )
{
if( !empty( $data ) ){
// escapar de las variables para la seguridad
$email = mysqli_real_escape_string( $this->_con, trim( $data['email'] ) );
if((!$email) ) {
throw new Exception( FIELDS_MISSING );
}
$password = $this->randomPassword();
$password1 = md5( $password );
$query = "UPDATE users SET password = '$password1' WHERE email = '$email'";
if(mysqli_query($this->_con, $query)){
mysqli_close($this->_con);
$to = $email;
$subject = "Nueva solicitud de contraseña";
$txt = "Su nueva contraseña ".$password;
$headers = "From: admin@obedalvarado.pw" . "rn" .
"CC: admin@obedalvarado.pw";
mail($to,$subject,$txt,$headers);
return true;
}
} else{
throw new Exception( FIELDS_MISSING );
}
}
/**
* Esto generará una contraseña aleatoria
* @return string
*/
private function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
$pass = array(); //recuerde que debe declarar $pass como un array
$alphaLength = strlen($alphabet) - 1; //poner la longitud -1 en caché
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass); //convertir el array en una cadena
}
}
Bueno esa sería la configuración básica para hacer funcionar el Script de Registro de Usuarios a la Base de Datos e Inicio de Sesión al Sistema.

Comentarios