Login y registro PDO PHP y MySQL: Ejemplo completo
Login y registro PDO PHP y MySQL.En esta entrada nos enfocaremos en crear un sistema para registrarnos e iniciar sesión de manera simultánea y usando la extensión PDO del PHP. Por lo tanto, es un sistema seguro y bien estructurado.
¿Cómo funciona el registro de usuarios?
Cuando el usuario se registra se enviara un enlace de activación mediante correo electrónico que contiene un enlace para activar la cuenta y posteriormente iniciar sesión.
Una vez activo la cuenta del usuario, este podrá iniciar sesión y además, se le dará la opción de restablecimiento la contraseña atreves de su correo electrónico.
Login y registro PDO PHP y MySQL
A continuación, detallaremos aspectos relacionados con el funcionamiento del sistema y sus partes.
Requerimientos del sistema Login PDO
Se requiere como mínimo la versión de PHP 5.3.17, pero se recomienda para su óptimo desempeño la versión 7 o superior.
- Extensión: Objetos de Datos de PHP (PDO)
- Base de datos MySQL
- Librería externa como el BootStrap
Estructura de archivos del sistema login
Ahora detallaremos la estructura de carpetas del sistema login.
La base de datos
El motor de almacenamiento será MySQL y la base tendrá como nombre «loginpdo.sql
» y esta base de datos tendrá una tabla para almacenar los miembros que se registran y/o consultan para acceder al sistema. La tabla tendrá como nombre «members
«, a continuación, la consulta SQL.
Esta consulta puede ser ejecutada desde el gestor de base de datos llamado PHPMyADMIN.
CREATE TABLE `members` ( `memberID` int(11) NOT NULL, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `active` varchar(255) NOT NULL, `resetToken` varchar(255) DEFAULT NULL, `resetComplete` varchar(3) DEFAULT 'No' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Tabla Miembros' ROW_FORMAT=COMPACT; ALTER TABLE `members` ADD PRIMARY KEY (`memberID`); ALTER TABLE `members` MODIFY `memberID` int(11) NOT NULL AUTO_INCREMENT;
<?php ob_start(); session_start(); //set timezone date_default_timezone_set('Europe/London'); //database credentials define('DBHOST','localhost'); define('DBUSER','UsuarioMysql'); define('DBPASS','password'); define('DBNAME','Database_Mysql'); //application address define('DIR','http://domain.com/'); define('SITEEMAIL','noreply@domain.com'); try { //create PDO connection $db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME, DBUSER, DBPASS); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { //show error echo '<p class="bg-danger">'.$e->getMessage().'</p>'; exit; } //include the user class, pass include('classes/user.php'); include('classes/phpmailer/mail.php'); $user = new User($db); ?>
Ficheros header.php y footer.php
A continuación, tenemos una carpeta con nombre «layout». Sin embargo, dentro de ella existen dos archivos, uno llamado header.php y el otro llamado footer.php. Por lo tanto, estos contendrán librerías externas, declaraciones de JavaScript, hojas de estilo y cierre de las etiquetas HTML.
El archivo Index.php
Básicamente, esta es el archivo principal del sistema y carga de forma predeterminada un formulario para que los usuarios puedan registrarse, también posee algunos vínculos de ayuda como ser:
- Inicio de sesión, si ya son miembros.
- Si el usuario ya ha iniciado sesión, será enviado a la página de miembros.
- La posibilidad de reiniciar la contraseña atreves de un correo electrónico existente.
Registro de usuarios
El sistema tiene la capacidad de registrar nuevos usuarios de manera dinámica y almacenarlos en la base de datos. Por lo tanto, de acuerdo a ese registro se podrá iniciar sesión e ingresar al área de miembros.
Recuperar Contraseña vía Email
Al ser un sistema completo, era obvio que tiene que tener esta opción. Nos referimos, a recuperar la contraseña haciendo uso del correo electrónico que el usuario utilizo al momento de registrase en el sistema.
CONCLUSIÓN DEL SISTEMA LOGIN PDO
Este sistema esta levantado con la extensión PDO, muy recomendado para los sistemas web.
Cubre las necesidades básicas de un sistema, porque posee una estructura completa:
- Registro de usuarios.
- Login de usuarios.
- Página de miembros.
- Reiniciar la contraseña por correo electrónico
- Contraseña segura y cifrada, entre otras opciones.
Por tal motivo su uso es muy recomendado en los sistemas web.
DESCARGAR EL SISTEMA LOGIN PDO
Les dejare un archivo comprimido para que puedan descargar el sistema completo e incluye la base de datos.
Hola, creo q no me van a responder porque esta pagina fue publicada hace tres anyos. Al crear una cuenta, me lleva a una pagina en blanco y cuando me voy al login me dice que la cuenta no ha sido activada, necesito ayuda por favor
Es la tercera vez que quiero publicar para que me ayude, ya que no envia el correo para confirmación. Si ya no reciben preguntas al menos informe. Lo tengo de prueba en un servidor pago pero no me envia el correo como comente anteriomente. Espero respuesta. Gracias
Hola. Estoy probando este ingreso y login, pero al momento de ejecutarlo me sale el error:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘clave’ cannot be null
La verdad que no encuentro donde esta el error.
Si puede ayudarme
Hola. Te comento que el sistema me funciona perfectamente como está, con la tabla correspondiente, pero al momento de adaptarlo para lo que necesito hacer. He modificado el codigo para que reconozca la otra base y los campos que quiero que registre, pero no lo hace y tampoco me sale un error en pantalla. Necesito ayuda. Desde ya gracias y felicitaciones.
me marca error en la lineá 31
Warning: password_hash() expects parameter 2 to be long, string given in C:\xampp\htdocs\login-y-registro-pdo-php-y-mysql-ejemplo-completo\classes\password.php on line 31
SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘password’ cannot be null
esos son los errores que marcar ala hora de registrarme y poner mi contraseña
Manuel, espero que BAULCODE nos de la respuesta. Te cuento que anule todo lo que comprende de esa linea 31 y graba en la base de datos. Lo que no consigo es que me envie el correo. Hasta me gustaria que no haga todo ese movimiento, o sea directamente crear el usuario.
Hola!!!, gracias por tu trabajo, me sirvió de base para el sistema que estoy desarrollando,
Estos cambios hicieron que funcionara bien sobre PHP 7.4.4 y SQLSERVER, detallo la página y como se modifico la linea con cambios.
Saludos, y gracias nuevamente.
config.php
//$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
index.php
$hashedpassword = password_hash($_POST[‘password’], PASSWORD_DEFAULT);
$id = $db->lastInsertId();
user.php
$stmt = $this->_db->prepare(«SELECT password, username, memberID FROM members WHERE username = :username AND active=’Yes'»);
Hola Administrador de Baulcode:
Ante todo agradecer por el trabajo publicado ya que es bastante difícil encontrar un ejemplo tan completo utilizando PDO en PHP, yo e adaptado el sistema de login a las necesidades de mi página web y funciona correcto, SALVO por un error que me aparece en el entorno de producción que me indica que no existe la clase mail, por lo que lo único que no funciona es cuando se debe enviar el email de confirmación para la activación en el correo del usuario.
No se si ya lo tienes resuelto, pero si ya lo tienes te agradecería me respondieras indicando como solucionarlo.
POR ÚLTIMO te recomendaría al menos poner un botón de donación en tu página ya que el trabajo realizado lo merece (eso si, deberías de pulirlo para que no tuviera ningún fallo) pero salvo eso, el trabajo es muy bueno.
Hola a todos,
Gracias por el aporte, es genial.
A mi me sale el mismo mensaje:
Nombre de usuario o contraseña incorrectos o su cuenta no ha sido activada.
Tengo la cuenta activada.
Me he fijado y el problema es que no me está rellenando el campo password cuando registro el usuario. El resto de campos si los rellena.
He probado a meter a mano la password encryptada y ha funcionado.
Alguien podría por favor decirme por donde puedo mirar para ver porque no rellena el campo password?
Gracias.
Buenas, Señor Baulcode, me parece fabuloso. Como le hago, para cambiar el mensaje del correo?
Buenas señor Baulcode, hasta ahora todo excelente, pero le tengo una pregunta, como configuro el mensaje que se envía al correo?
Antes de subirlo aqui debes verificar que todo este bien para que luego todos nos estemos quejando.
Vaya! ¿Porqué no te vas a otro sitio web antes de ofender a las personas así?
Hola Pedro
El detalle suele pasar porque a veces se esta usando una versión muy elevada del PHP y en localhost
Recomendación: Trabajar con la versión 7.2 del PHP y en un servidor de producción (Servidor contratado).
Saludos cordiales.
Alguien sabe como hacer para que no puedan abrir un mismo usuario, dos o más sesiones al mismo tiempo desde distintos dispositivos…..o sea que solo un usuario pueda estar con una sesion y hasta que no la cierre no pueda abrir otra desde cualquier otro dispositivo…….. es para impedir que puedan revender accesos.
Pues le comento que eso tiene que programar por medio de campos de inicio y cierre de sesion en la tabla de usuarios llenando cada campo segun lo que ingrese y salga del sistema sigo…. cualquier duda me puede escribir al mail esmupruarrobagmail.com
Gracias Elvis, ¿tienes algún ejemplo para que yo pueda ver como funciona lo que me comentas?
Estoy tratando de hacer que me funcione todo, he seguido los consejos de ustedes, pero me sigue sin funcionar, resulta que cuando intento registrar un usuario me da el siguiente error «SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘password’ cannot be null» y me puse a investigar y resulta que en las últimas versiones de PHP la función mcrypt_create_iv que se utiliza en el archivo password.php queda en deshuso.
mi pregunta ¿Cómo puedo implementar la función de password_hash en la nueva actualización de PHP?
Hola. a mi me ocurre lo mismo, pero intentaré arreglarlo, de hecho, hace días, me descargué otro ejemplo de este portal y lo pude solventar. Básicamente, se estaba utilizando una instrucción obsoleta.
Muchas gracias, porque pocos sitios Web, presenta ejemplos completos.
Yo tengo el mismo problema , ¿conoceras cual ?
Hola Cesar
Te está fallando por una restricción (constraint) que tienes definida en la base de datos por la cual el campo password no puede ser insertado vacío.
Saludos Cordiales.
Buen aporte maestro, solo tengo una duda, monté su ejemplo en EasyPHP 5.3.5 el cual tiene PHP 5.3.5 y envía los correos correctamente aunque no funciona el password_hash, lo que me llevó a probarlo en una versión de EasyPHP posterior y usé la versión 14.1 en el cual si funciona el password_hash sin embargo el correo electrónico no es enviado, tiene alguna idea de que me hace falta? uso el mismo proyecto que en la versión anterior, por lo que en teoría la configuración del correo es correcta.
BUENOS DIAS , AMIGO.
la presente es una simple, ocurre q subi un login y el HOST fue dado de baja porq parece q hubo INYECCION DE CODIGO y hubo hackeo . y nos anularon la cuenta HOST+DOMINIO.
X temor a esto, pregunto: SU SISTEMA LOGIN ES SEGURO DE PODER SUBIR A UN HOST Y Q NO SE GENERE PROBLEMAS .
MUchas gracias por su respuesta.
Muy buenas, excelente tutorial señor baulcode, le felicito. Es para comunicarle si me pude ayudar, con la parte del correo de activación, estoy usando mi servidor local con Xammp pero no sé cómo hacer que llegué el correo, es para una prueba. Si pudiera responderme muchas gracias por su ayuda.
Estimado Kevin
Este sistema de login y registros para pdoer testearlo necesita de un servidor web y a partir de su servidor obtener los correos electronicos corporativos.
Le recomiendo que lo pruebe en un servidor de produccion y que use un email corportativo.
Si tiene otra inquietud, no dude en consultarme.
Saludos.
Saludos señor Baulcode
Muchísimas gracias por contestarme señor Baulcode, se lo agradezco mucho. Disculpe que le consulte otra vez. Es para preguntarle y disculpe la pregunta si es redundante, le prometo que trataré de testearlo en un servidor web (le agradecería opciones gratuitas por favor). La pregunta sería si hay una forma de testearlo en el localhost editando el código?. Muchísimas gracias por su consejo, y le agradezco mucho su respuesta, la cual espero.
Un saludo.
Hola Kevin
Hay varios servidores gratuitos en el cual puedes testear el script:
https://es.000webhost.com/
https://www.lucushost.com/hosting-gratis
https://x10hosting.com/
https://www.awardspace.com/free-hosting
Tendras que ver que que te den correos gratuitos tambien
Por otro lado, el script funciona con activacion de email.
Saludos
Que pena maestro, al colgar los archivos y tenerlos en la ubicacion raiz, el error 404 ya no sale, funciona perfectamente todos los formularios, excelente aporte .
Se tiene que configurar el archivo config.php y si tienes otros inconvenientes, me escribes por este medio.
Podes decir porque no envia el correo.
Hola Rafael,
Disculpa por responder tarde
Si no envía correos puede haber varios detalles por ejemplo:
– Configurar la librería PHPMailer ingresando las credenciales de un correo electrónico(correo y contraseña)
– Crear una cuenta de correo en el servidor de pago
– Crear base de datos e importar las tablas
– Configurar config.php
Espero haberte ayudado
Gracias por responder. Entiendo tus tiempos tambien. Esta bueno el ejemplo y la verdad que tengo todo el resto del sistema casi terminado pero necesitaba esto antes que nada.
No puedo resolver esto ahora:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘clave’ cannot be null.
Gracias
Todo funciona excepto que cuando envía el email de confirmación y general el link este me manda un error 404 de que no encontró el link.
Hola, Julio
Se tiene que configurar el archivo config.php
//application address
define(‘DIR’,’http://domain.com/’); // Define la pagina donde esta instalado el script
define(‘SITEEMAIL’,’noreply@domain.com’); // Email del dominio existente
Saludos cordiales
saludos Baulcode excelente codigo muy util, gracias por el aporte, seria bueno nos compartiera de su gran experiencia como solucionariamos el tema del link por que al dar click redirecciona a una un The requested URL was not found on this server. error 404.
Hola Camilo
Se tiene que configurar el archivo config.php
//application address
define(‘DIR’,’http://domain.com/’); // Define la pagina donde esta instalado el script
define(‘SITEEMAIL’,’noreply@domain.com’); // Email del dominio existente
Saludos cordiales
Hola,
Alguien me puede ayudar a decir en qué parte de código hay que modificar y de qué manera. No consigo hacerlo funcionar.
Hola Jose
Hay que modificar el archivo config.php
La base de datos
El usuario de BD
La contraseña de BD
Además de la ruta y email
//application address
define(‘DIR’,’http://domain.com/’); // Define la pagina donde esta instalado el script
define(‘SITEEMAIL’,’noreply@domain.com’); // Email del dominio existente
Saludos cordiales
Nos ha funcionado perfectamente, muchas gracias por el aporte.
hola, el sistema funciona perfecto, solo cuando voy al registro me muestra la siguiente leyenda
—————————————————————-
Los nombres de usuario deben tener al menos 3 caracteres alfanuméricos
La contraseña es demasiado corta.
Confirmar contraseña es demasiado corta.
Por favor, introduce una dirección de correo electrónico válida
—————————————————————
podrian indicarme como invisivilizo eso?
muchas gracias Daniel. elchute@gmail.com
Hola.
Gracias por el aporte. Muy buen trabajo. Pero no consigo recibir los email de confirmación.
He cambiado los datos de la linea 15 y 16 de config.php y también he cambiado los datos de la linea 5 hasta la 12 de mail.php, pero no consigo que me se envíen los email de confirmación.
Alguien me puede ayudar… muchas gracias
Hola Jose luis,
Tienes que probarlo en un servidor de producción y crear un correo electrónico con el nombre de tu dominio.
No te lo indique antes, lo estoy probando en un servidor de producción.
Gracias Jose Luis por responderme. Te comento.
En el archivo config.php en la linea 15 he puesto el dominio de mi web y en la 16 el email de mi dominio, y no funciona.
Y en el archivo mail.php también he puesto mi email en la linea 6 y he desactivado todos los comentarios. No se dónde hago mal que no me funciona. Me podías ayudar donde me equivoco.
Por otro lado agradecerte este trabajo que haces para ayudar a tanta gente, entre ellos uno soy yo.
¡¡¡MUCHAS GRACIAS!!!
De decenas de login que he encontrado por la red este es sin duda el mejor. Muchas gracias por el aporte
Buenos dias, lo primero agradecer el aporte 🙂
Estoy tiendo problemas en le momento de registrar a un usuario, el mensaje de error que me dá es el siguiente:
warning PHP:
Warning: password_hash() expects parameter 2 to be long, string given in …/classes/password.php on line 32
y justo encima del formulario me sale este mensaje:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column ‘password’ cannot be null
Muchas gracias
He visto que era por un problema con mi version de php. Este error me lo daba en mi virtual host que tenia una version de php diferente a la de mi servidor. En mi virtual host PASWORD_BCRYPT tenia un valor «2y» y en el mi servidor web tenia valor «1» estoy hacia que en la comprobación de si es integer en la linea 32 del archivo password.php me diera error.
Gracias y disculpe las molesetias
Estimado Baulcode, desestimen los mensajes anteriores, modifiqué el config.php y el mail.php y salio andando todo de una, buenísimo!. Muchas gracias por este material!. Saludos!.
Hola Guillermo
Perfecto, que bueno ver que te fue de maravilla.
Saludos
Hola, dejé hace unas horas un mensaje pero no lo vi más estaba en espera de ser aceptado, dada mi necesidad de respuesta vuelvo a dejar mi pregunta, si esta duplicada sabrán Uds. disculpar y eliminar la que crean oportuna.
La duda que tengo es similar a la de mis colegas que tu has respondido, te pido disculpas y paciencia pero no logro hacer llegar el mail a la cuenta que se quiere registrar aunque si hace joined, como no tengo aun un sitio web estoy con el localhost de easyphp, mi sintaxis en config.php es esta y no funciona podrás tu ayudarme a dilucidar el problema? te lo agradecería.
//application address
define(‘DIR’,’http://localhost/LoginPDO/’);
define(‘SITEEMAIL’,’comprodesdecasa20@gmail.com’);
Ademas de los errores que este cometiendo aquí, hay que modificar algún otro archivo, digo porque veo en mail.php esto comentado y estoy en dudas:
class Mail extends PhpMailer
{
// Set default variables for all new objects
public $From = ‘noreply@domain.com’;
public $FromName = SITETITLE;
//public $Host = ‘smtp.gmail.com’;
//public $Mailer = ‘smtp’;
//public $SMTPAuth = true;
//public $Username = ‘email’;
//public $Password = ‘password’;
//public $SMTPSecure = ‘tls’;
public $WordWrap = 75;
Agradezco mucho tu ayuda!!
Estimado Igmar, ayer me tope con este desarrollo y me parece fabuloso y justo lo que venia necesitando, quizás mas!. Para no desentonar con los amigos que me preceden en este chat te vengo con lo mismo y te pido mil disculpas pero yo modifico en config.php esas lineas así textual como las pego aquí y si bien hace join nunca recibo mail de confirmación, espero puedas ayudarme porque lo que es esto me fascina. Pego aquí mi código tal cual.
//application address
define(‘DIR’,’http://127.0.0.1/login-y-registro-pdo-php-y-mysql-ejemplo-completo/’);
define(‘SITEEMAIL’,’comprodesdecasa20@gmail.com’);
Es que cometo algún error sintáctico y no lo veo, las comillas son simples tal cual aquí.
Otra consulta, esto está en mail.php todo comentado, debo descomentarlo?
// Set default variables for all new objects
// public $From = ‘noreply@domain.com’;
// public $FromName = SITETITLE;
//public $Host = ‘smtp.gmail.com’;
//public $Mailer = ‘smtp’;
//public $SMTPAuth = true;
//public $Username = ‘email’;
//public $Password = ‘password’;
//public $SMTPSecure = ‘tls’;
// public $WordWrap = 75;
Agradezco tu aporte y ayuda, un saludo!.
No envía el mail donde configuro el smtp de gmail? Para enviar la activacion o el reenvio de clave muchas gracias
Sabran como hacer para que este gran sistema valide por email y no por nombre de usuario
hola. me podrías ayudar coloco la información del dominio y el correo y el mail de confirmación no llega.
//application address
define(‘DIR’,’http://jasolutionsweb.com’);
define(‘SITEEMAIL’,’noreply@jasolutionsweb.com’);
HE VISTO ESTE FANTÁSTICO EJEMPLO PERO COMO LO PONGO EN UNA PÁGINA HTML,NO TENGO MUCHOS CONOCIMIENTOS GRACIAS
hola, como hago para que en la pagina de memberpage.php mostrar contenido especifico para cada usuario registrado.
es decir que tenga 3 usuarios verdad
usuario1, usuario2 y usuario 3.
cómo hago para mostrar en memberpage.php por ejemplo 3 o 4 botones con funciones especificas para ese usuario sin que los demas usuarios la vean, pero los demas usuarios tambien tengan 2 o 3 botones especificos para hacer una tarea, pero que los demas usuarios no puedan ver esos botones, solo el usuario al que se le asigna o si se puede crear una pagina persosalizada como funciones especificas a cada usuario pero que la misma sea mostrada en memberpage.php o que sean enviado cada uno a su pagina privada que solo ellos puedan ver.
ejemplo accedio el usuario1, pero que al accede el pueda ver su contenido paginauser1.php por ejemplo.
accede el usuario2 y a este se le muestra su pagina con su contenido paginauser2.php y
si accede el usuario3 este vea su contenido paginauser3.php
pero que ninguno pueda ver la pagina que no le corresponde salvo el usuario principal como admin o algo asi que pueda acceder a todas.
en scrip se puede hacer, pero no se recomienda porque s se da ver codigo fuente se ven los accesos.
yo creo que esta funcion se llama con php usando el id del usuario para imprimir el contenido de la pagina en memberpage.php pero no se como hacerlo que el php llame a la pagina especifica dependiendo del usuario conectado
no se si me explico.
Excelente ejemplo, me podrías orientar por que no llega el correo de activación o de recuperación.
saludos
porque no has configurado la info del dominio donde tienes el sistema de registro, esta info se coloca en: /include/config.php
en esta seccion:
//application address
define(‘DIR’,’http://dominio.com/’);
define(‘SITEEMAIL’,’correo@dominio.com’);
Igmar, me pasa lo mismo. Configuré como lo solicita, con datos de mi servidor y sigo sin recibir el correo.
Podes ayudar?
Yo lo hice y aún sigue sin enviar el mail
Hola buenas noches está muy interesante este formulario de ingreso. Me gustaría saber porque después de registrarme y de acceder al login aparece como error «no coinciden usuario o password» o que la cuenta no esta activada. Me podrían colaborar con eso por favor. Muchas gracias.
Tienes la misma falta de configuracion que @Arturo
buenas
porque me sale este mensaje y no me deja iniciar sesión
Nombre de usuario o contraseña incorrectos o su cuenta no ha sido activada.
porque tienes que activarla, sino agregas el dominio donde tienes el login y un correo, no va a enviar el correo de conformacion para que active la cuenta el usuario
Hola, tengo una página ya con PDO pero no tiene restablecer contraseña es posible cambiar el sistema por este y que no me presente problemas?
Hola Manuel,
Primero tienes que analizar tu sistema y el nuevo sistema para poder reemplazar sin problemas, por ejemplo las tablas y clases.