Acceso y registro con HTML, AJAX, PHP y MySQL

¡Hola a todos y a todas! Comienzo este 2016 (un poco tarde, estaba descansando 🙂 ) con un tutorial donde mostraré cómo hacer un acceso y registro de usuarios básico basado en HTML, AJAX, PHP y MySQL.

En esta ocasión, utilizaremos y configuraremos cookies de sesión con PHP, y también comprobaremos si el usuario está logueado (si tiene la sesión iniciada) o no. Representado en un diagrama de flujo, sería algo así:

Diagrama de flujo

Diagrama de flujo

Entonces, comencemos.

¿Cómo crear un sistema de usuarios?

Como siempre digo, seguiré desarrollando en local, utilizando XAMPP (Apache y MySQL con PHPMyAdmin) en Windows.

1 de 3: MySQL

Lo primero que debemos hacer es estructurar nuestra base de datos.
Continúo trabajando sobre una base de datos llamada mmv con cotejamiento utf8_spanish_ci. Dentro tengo una tabla llamada mmv005 que tiene cuatro columnas. El motor de almacenamiento es InnoDB.

  1. id -> INT(5) -> A_I -> primaria
  2. username -> varchar(20) -> utf8_spanish_ci
  3. usernamelowercase -> varchar(20) -> utf8_spanish_ci -> único
  4. password -> varchar(60) -> utf8_spanish_ci

2 de 3: HTML y PHP

Ahora debemos crear los scripts para obtener y modificar los datos.

Empecemos por crear el archivo index.php, el cual comprobará si la sesión está iniciada o no. Lo que necesitamos es: iniciar la sesión (si existe) con la función session_start() de PHP, comprobar si los datos de sesión están seteados (establecidos), y actuar en consecuencia.

En este caso, si la sesión está iniciada, incluiremos el archivo página.php , y si no hay ninguna sesión creada, incluiremos el archivo login.php. Estos archivos los crearemos más adelante.

El archivo debe estar totalmente vacío. Las etiquetas HTML (doctype, html, head, body, etc.) que puedan generar algunos editores de texto (como Dreamweaver) deben ser eliminadas.

Código fuente de index.php:

<?php
//Iniciamos la sesión
session_start();

//Evitamos que nos salgan los NOTICES de PHP
error_reporting(E_ALL ^ E_NOTICE);

//Comprobamos si la sesión está iniciada
//Si existe una sesión correcta, mostramos la página para los usuarios
//Sino, mostramos la página de acceso y registro de usuarios
if(isset($_SESSION['usuario']) and $_SESSION['estado'] == 'Autenticado') {
	include('pagina.php');
	die();
} else {
	include('login.php');
	die();
};
?>

Ahora creamos el archivo de acceso y registro: login.php, donde comenzaremos por comprobar si existe una sesión utilizando nuevamente la función de PHP. Esta función debe ir encima de la declaración del doctype de HTML.

A continuación hay que agregar la librería de jQuery en el head del HTML para poder usar la función AJAX. Yo utilizaré la versión 1.9.1 minificada que tengo descargada.

Es hora de empezar a estructurar el cuerpo del archivo. Lo primero es crear un contenedor (div #mensaje) donde estarán las respuestas del servidor respecto a las acciones de los usuarios en el formulario. Las respuestas las recibiremos después a través de AJAX.

Una vez creado ese contenedor, debemos crear dos formularios:

  1. ID acceso, método POST. Contiene:
    – Input de tipo texto, con nombre userAcceso, clase acceso (*1), id userAcceso.
    – Input de tipo contraseña, con nombre passAcceso, clase acceso (*1), id passAcceso.
    – Input de tipo submit, con nombre acceso (opcionalmente, valor Acceder).
  2. ID registro, método POST. Contiene:
    – Input de tipo texto, con nombre userRegistro, clase registro (*1), id userRegistro.
    – Input de tipo contraseña, con nombre passRegistro, clase registro (*1), id passRegistro.
    – Input de tipo submit, con nombre registro (opcionalmente, valor Registrarse).

Adicionalmente, a los inputs podemos añadirle un placeholder. un auto-completado apagado, aceptar UTF-8 y establecer los action vacíos.

*1 Esto se realiza para posteriormente vaciar los inputs desde PHP. Lo mostraré más adelante. Después simplemente debemos crear el método de envío desde el archivo login.php a PHP por medio de AJAX.

Código fuente de login.php:

<?php
//Iniciamos la sesión
session_start();

//Pedimos el archivo que controla la duración de las sesiones
require('recursos/sesiones.php');
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Acceso o registro</title>
<script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>

<div id="mensaje" style="border:1px solid #CCC; padding:10px;"></div>

<h2>Accede a tu cuenta</h2>

<div class="formulario-acceso">
<form method="POST" id="acceso" action="" accept-charset="utf-8">
	<input type="text" name="userAcceso" class="acceso" id="userAcceso" placeholder="Usuario" autocomplete="off" maxlength="20">
	<input type="password" name="passAcceso" class="acceso" id="passAcceso" placeholder="Contraseña" autocomplete="off" maxlength="60">
	<input type="submit" name="acceso" class="boton-principal" value="Acceder">
</form>
</div>

<hr>

<h2>Crea una cuenta</h2>

<div class="formulario-registro">
<form method="POST" id="registro" action="" accept-charset="utf-8">
	<input type="text" name="userRegistro" class="registro" id="userRegistro" placeholder="Usuario" autocomplete="off" maxlength="20">
	<input type="password" name="passRegistro" class="registro" id="passRegistro" placeholder="Contraseña" autocomplete="off" maxlength="60">
	<input type="submit" name="registro" class="boton-principal" value="Registrarse">
</form>
</div>

<script>
//Guardamos el controlador del div con ID mensaje en una variable
var mensaje = $("#mensaje");
//Ocultamos el contenedor
mensaje.hide();

//Cuando el formulario con ID acceso se envíe...
$("#acceso").on("submit", function(e){
	//Evitamos que se envíe por defecto
	e.preventDefault();
	//Creamos un FormData con los datos del mismo formulario
	var formData = new FormData(document.getElementById("acceso"));

	//Llamamos a la función AJAX de jQuery
	$.ajax({
		//Definimos la URL del archivo al cual vamos a enviar los datos
		url: "recursos/acceder.php",
		//Definimos el tipo de método de envío
		type: "POST",
		//Definimos el tipo de datos que vamos a enviar y recibir
		dataType: "HTML",
		//Definimos la información que vamos a enviar
		data: formData,
		//Deshabilitamos el caché
		cache: false,
		//No especificamos el contentType
		contentType: false,
		//No permitimos que los datos pasen como un objeto
		processData: false
	}).done(function(echo){
		//Una vez que recibimos respuesta
		//comprobamos si la respuesta no es vacía
		if (echo !== "") {
			//Si hay respuesta (error), mostramos el mensaje
			mensaje.html(echo);
			mensaje.slideDown(500);
		} else {
			//Si no hay respuesta, redirecionamos a donde sea necesario
			//Si está vacío, recarga la página
			window.location.replace("");
		}
	});
});

//Cuando el formulario con ID acceso se envíe...
$("#registro").on("submit", function(e){
	//Evitamos que se envíe por defecto
	e.preventDefault();
	//Creamos un FormData con los datos del mismo formulario
	var formData = new FormData(document.getElementById("registro"));

	//Llamamos a la función AJAX de jQuery
	$.ajax({
		//Definimos la URL del archivo al cual vamos a enviar los datos
		url: "recursos/registro.php",
		//Definimos el tipo de método de envío
		type: "POST",
		//Definimos el tipo de datos que vamos a enviar y recibir
		dataType: "HTML",
		//Definimos la información que vamos a enviar
		data: formData,
		//Deshabilitamos el caché
		cache: false,
		//No especificamos el contentType
		contentType: false,
		//No permitimos que los datos pasen como un objeto
		processData: false
	}).done(function(echo){
		//Cuando recibamos respuesta, la mostramos
		mensaje.html(echo);
		mensaje.slideDown(500);
	});
});
</script>
</body>
</html>

Como se puede apreciar, justo después de iniciar sesión llamo a un archivo llamado sesiones.php, y ¿qué es esto? Bueno, para evitar tener que estar modificando los archivos de configuración (.ini) del servidor (Apache), es decir, para no usar ini_set(«session.cookie_lifetime») ni ini_set(«session.gc_maxlifetime») en nuestro(s) script(s) en PHP, debemos definir la duración de la sesión en PHP. Esto se haría a través de una comprobación de tiempo.

Código fuente de sesiones.php:

<?php
//Evitamos que nos salgan los NOTICES de PHP
error_reporting(E_ALL ^ E_NOTICE);

//Obtenemos el timestamp del servidor de cuanto se hizo la petición
$hora = $_SERVER["REQUEST_TIME"];

//Duración de la sesión en segundos
$duracion = 60;

//Si el tiempo de la petición* es mayor al tiempo permitido de la duración, 
//destruye la sesión y crea una nueva
if (isset($_SESSION['ultima_actividad']) && ($hora - $_SESSION['ultima_actividad']) > $duracion) {
  session_unset();
  session_destroy();
  session_start();
};
// * Por esto este archivo debe ser incluido en cada página que necesite comprobar las sesiones

//Definimos el valor de la sesión "ultima_actividad" como el timestamp del servidor
$_SESSION['ultima_actividad'] = $hora;
?>

Ahora debemos recibir los datos de los formularios. Para eso, comenzaremos por el registro.

Realizamos la conexión a la base de datos, almacenamos los dos valores (usuario y contraseña) en una variable, realizamos un filtro anti-XSS, definimos la cantidad máxima de caracteres por input (para reforzar la seguridad), y comprobamos que los valores no sean de mayor cantidad de caracteres de lo que es posible. Después convertimos el valor del usuario (userRegistro) en minúsculas, seleccionamos todos los nombres de usuario en minúsculas de la BBDD, y checkeamos la información: si los campos están vacíos, mostramos error, si el usuario introducido que pasamos a minúsculas es igual a algún usuario existente en algún campo de usernamelowercase, mostramos error. Si no hay errores, se pasa a encriptar la contraseña (en este caso, lo hago con Blowfish + crypt()) y registramos los datos en la base de datos.

Para el formulario de acceso:

Realizamos la conexión a la base de datos, almacenamos los dos valores (usuario y contraseña) en una variable, realizamos un filtro anti-XSS, definimos la cantidad máxima de caracteres por input (para reforzar la seguridad), y comprobamos que los valores no sean de mayor cantidad de caracteres de lo que es posible. Después convertimos el valor del usuario (userAcceso) en minúsculas para poder realizar una consulta de comparación en la base de datos. Por último, hacemos un checkeo de datos (si el nombre existe, si los campos no están vacíos, o si la contraseña no es correcta), y si está todo bien, simplemente creamos una nueva sesión.

Código fuente de registro.php:

<?php
//Conectamos a la base de datos
require('../../conexion.php');

//Obtenemos los datos del formulario de registro
$userPOST = $_POST["userRegistro"]; 
$passPOST = $_POST["passRegistro"];

//Filtro anti-XSS
$userPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $userPOST));
$passPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $passPOST));

//Definimos la cantidad máxima de caracteres
//Esta comprobación se tiene en cuenta por si se llegase a modificar el "maxlength" del formulario
//Los valores deben coincidir con el tamaño máximo de la fila de la base de datos
$maxCaracteresUsername = "20";
$maxCaracteresPassword = "60";

//Si los input son de mayor tamaño, se "muere" el resto del código y muestra la respuesta correspondiente
if(strlen($userPOST) > $maxCaracteresUsername) {
	die('El nombre de usuario no puede superar los '.$maxCaracteresUsername.' caracteres');
};

if(strlen($passPOST) > $maxCaracteresPassword) {
	die('La contraseña no puede superar los '.$maxCaracteresPassword.' caracteres');
};

//Pasamos el input del usuario a minúsculas para compararlo después con
//el campo "usernamelowercase" de la base de datos
$userPOSTMinusculas = strtolower($userPOST);

//Escribimos la consulta necesaria
$consultaUsuarios = "SELECT usernamelowercase FROM `mmv005`";

//Obtenemos los resultados
$resultadoConsultaUsuarios = mysqli_query($conexion, $consultaUsuarios) or die(mysql_error());
$datosConsultaUsuarios = mysqli_fetch_array($resultadoConsultaUsuarios);
$userBD = $datosConsultaUsuarios['usernamelowercase'];

//Si el input de usuario o contraseña está vacío, mostramos un mensaje de error
//Si el valor del input del usuario es igual a alguno que ya exista, mostramos un mensaje de error
if(empty($userPOST) || empty($passPOST)) {
	die('Debes introducir datos válidos');
} else if ($userPOSTMinusculas == $userBD) {
	die('Ya existe un usuario con el nombre '.$userPOST.'');
}
else {
//Si no hay errores, procedemos a encriptar la contraseña
//Lectura recomendada: https://mimentevuela.wordpress.com/2015/10/08/establecer-blowfish-como-salt-en-crypt-2/
	
	function aleatoriedad() {
		$caracteres = "abcdefghijklmnopqrstuvwxyz1234567890";
		$nueva_clave = "";
		for ($i = 5; $i < 35; $i++) {
			$nueva_clave .= $caracteres[rand(5,35)];
		};
		return $nueva_clave;
	};

	$aleatorio = aleatoriedad();
	$valor = "07";
	$salt = "$2y$".$valor."$".$aleatorio."$";

	$passwordConSalt = crypt($passPOST, $salt);

	//Armamos la consulta para introducir los datos
	$consulta = "INSERT INTO `mmv005` (username, usernamelowercase, password) 
	VALUES ('$userPOST', '$userPOSTMinusculas' , '$passwordConSalt')";
	
	//Si los datos se introducen correctamente, mostramos los datos
	//Sino, mostramos un mensaje de error
	if(mysqli_query($conexion, $consulta)) {
		die('<script>$(".registro").val("");</script>
Registrado con éxito <br>
Ya puedes acceder a tu cuenta <br>
<br>
Datos:<br>
Usuario: '.$userPOST.'<br>
Contraseña: '.$passPOST);
	} else {
		die('Error');
	};
};//Fin comprobación if(empty($userPOST) || empty($passPOST))
?>

Código fuente de acceder.php:

<?php
	
//Conectamos a la base de datos
require('../../conexion.php');

//Obtenemos los datos del formulario de acceso
$userPOST = $_POST["userAcceso"]; 
$passPOST = $_POST["passAcceso"];

//Filtro anti-XSS
$userPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $userPOST));
$passPOST = htmlspecialchars(mysqli_real_escape_string($conexion, $passPOST));

//Definimos la cantidad máxima de caracteres
//Esta comprobación se tiene en cuenta por si se llegase a modificar el "maxlength" del formulario
//Los valores deben coincidir con el tamaño máximo de la fila de la base de datos
$maxCaracteresUsername = "20";
$maxCaracteresPassword = "60";

//Si los input son de mayor tamaño, se "muere" el resto del código y muestra la respuesta correspondiente
if(strlen($userPOST) > $maxCaracteresUsername) {
	die('El nombre de usuario no puede superar los '.$maxCaracteresUsername.' caracteres');
};

if(strlen($passPOST) > $maxCaracteresPassword) {
	die('La contraseña no puede superar los '.$maxCaracteresPassword.' caracteres');
};

//Pasamos el input del usuario a minúsculas para compararlo después con
//el campo "usernamelowercase" de la base de datos
$userPOSTMinusculas = strtolower($userPOST);

//Escribimos la consulta necesaria
$consulta = "SELECT * FROM `mmv005` WHERE usernamelowercase='".$userPOSTMinusculas."'";

//Obtenemos los resultados
$resultado = mysqli_query($conexion, $consulta);
$datos = mysqli_fetch_array($resultado);

//Guardamos los resultados del nombre de usuario en minúsculas
//y de la contraseña de la base de datos
$userBD = $datos['usernamelowercase'];
$passwordBD = $datos['password'];

//Comprobamos si los datos son correctos
if($userBD == $userPOSTMinusculas and password_verify($passPOST, $passwordBD)){

	session_start();
	$_SESSION['usuario'] = $datos['username'];
	$_SESSION['estado'] = 'Autenticado';

	/* Sesión iniciada, si se desea, se puede redireccionar desde el servidor */

//Si los datos no son correctos, o están vacíos, muestra un error
//Además, hay un script que vacía los campos con la clase "acceso" (formulario)
} else if ( $userBD != $userPOSTMinusculas || $userPOST == "" || $passPOST == "" || !password_verify($passPOST, $passwordBD) ) {
	die ('<script>$(".acceso").val("");</script>
Los datos de acceso son incorrectos');
} else {
	die('Error');
};
?>

Para finalizar, crearemos el archivo pagina.php, que es donde accederán los usuarios logueados y el archivo salir.php, que nos permitirá cerrar sesión.

Para este ejemplo, la página de los usuarios será muy simple: primero se comprobará si los datos están seteados, si no lo están, se redirecciona al index, y si lo están, se define el botón de cerrar sesión y se incluye el archivo sesiones.php para controlar la duración de la sesión actual.

Código fuente de pagina.php:

<?php
//Reanudamos la sesión
session_start();

//Comprobamos si el usario está logueado
//Si no lo está, se le redirecciona al index
//Si lo está, definimos el botón de cerrar sesión y la duración de la sesión
if(!isset($_SESSION['usuario']) and $_SESSION['estado'] != 'Autenticado') {
	header('Location: index.php');
} else {
	$estado = $_SESSION['usuario'];
	$salir = '<a href="recursos/salir.php" target="_self">Cerrar sesión</a>';
	require('recursos/sesiones.php');
};
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Bienvenido</title>
</head>

<body>
<div><p>Hola, <?php echo $estado; ?><br>
<?php echo $salir; ?></p><div>
</body>
</html>

Código fuente de salir.php:

<?php
//Reanudamos la sesión
session_start();

//Requerimos los datos de la conexión a la BBDD
require('../../conexion.php');

//Des-establecemos todas las sesiones
unset($_SESSION);

//Destruimos las sesiones
session_destroy();

//Cerramos la conexión con la base de datos
mysqli_close($conexion);

//Redireccionamos a el index
header("Location: ../");
die();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Cerrando sesión...</title>
</head>
<body>
</body>
</html>
3 de 3: Ejemplos

Una vez hecho todo lo anterior, podemos observar los resultados finales. Yo no lo he aplicado ningún estilo, pero se puede hacer sin problemas.

Usuario creado

Usuario creado

 

Datos incorrectos

Datos incorrectos

 

Sesión iniciada

Sesión iniciada

Conclusión:

Para comenzar a trabajar con sesiones, PHP y MySQL, este tutorial es bastante completo. Hay que tener en cuenta más cuestiones de seguridad que aquí no se tratan, como que es imprescindible usar SSL (HTTPS) para enviar datos de usuarios. Si te sirvió, por favor, compártelo.

NOTA: La estructura de los archivos es la siguiente:

index.php
login.php
pagina.php
 js (carpeta)
  L jquery-1.9.1.min.js
 recursos (carpeta)
  L acceder.php
  L registro.php
  L salir.php
  L sesiones.php

Espero que el tutorial haya sido de utilidad. Nos leemos, ¡saludos!

37 comentarios

  1. Jesús · abril 4, 2016

    Muy bueno, justo lo que estaba buscando, no se si me falto algo por poner pero registro el usuario correctamente y luego realizo el login y al darle a entrar no me entra en la sesión, solo entra si actualizo o recargo la página con f5, ¿Sabría porque? o es que debo hacer una redirección manual para que el usuario a su sitio? Gracias.

    Me gusta

    • Rocanrol · abril 4, 2016

      Claro, en el archivo acceder.php hay un comentario que dice:

      /* Sesión iniciada, si se desea, se puede redireccionar desde el servidor */

      Saludos.

      Me gusta

      • Jesus · abril 4, 2016

        Si justo ahí puse lo siguiente:
        header(‘Location: backend/page_ready_user_profile.php’);

        y también lo puse en pagina.php
        else {
        $estado = $_SESSION[‘usuario’];
        $salir = ‘Cerrar sesión‘;
        require(‘recursos/sesiones.php’);
        header(‘Location: backend/page_ready_user_profile.php’);
        };

        y me redirecciona sólo cuando actualizo con f5. Un saludo.

        Me gusta

      • Jesús · abril 4, 2016

        Gracias, ya he conseguido hacer la redirección, en donde usted comenta he puesto lo siguiente:
        echo ‘
        window.location.assign(«backend/page_ready_user_profile.php»);
        ‘;

        Le gusta a 1 persona

  2. Jesús · abril 8, 2016

    Hola Rocanrol, en http://www.pcpiezas.info/ he implementado el tutorial buscar usuario y el tutorial de login. En el siguiente ejemplo si hace login con usuario: admin y pass: admin accede accede al directorio usuarios, http://pcpiezas.info/usuarios/ pero a su vez me sigue permitiendo acceder a http://pcpiezas.info ¿ Si no es molestia y no le requiere tiempo sabría darme una idea de que debo de hacer para en caso de estar logueado solo permita estar dentro de http://pcpiezas.info/usuarios y no permita acceder a ningun otro directorio o carpeta y en caso contrario de que el usuario no se halla logueado pues que no permita acceder a http://pcpiezas.info/usuarios. Un saludo.

    Como comentario adicional, para cualquier usuario de este sitio que haga el tutorial, cuando lo suba al servidor debe tener en cuenta que necesita la version de PHP 5.5 o superior.

    Me gusta

  3. Jesús · abril 8, 2016

    Lo tenía ante mis ojos, es así?

    if(isset($_SESSION[‘usuario’]) and $_SESSION[‘estado’] == ‘Autenticado’) {
    pag a redireccionar
    }

    y así debo hacerlo en cada una de las páginas?

    Me gusta

    • Rocanrol · abril 8, 2016

      Correcto. De todas formas, no olvide añadir un tercer factor para los administradores. Algo tipo:

      if(isset($_SESSION[‘usuario’]) and $_SESSION[‘estado’] == ‘Autenticado’ and $_SESSION[‘usuario’] == 'Admin') {
      pag a redireccionar
      }

      Eso se configuraría en «acceder.php».

      Me gusta

  4. pavel · abril 19, 2016

    Gracias por el aporte, pero te pido el apoyo ya que me marca error al iniciar sesión ya cheque el código y no le encuentro la falla según yo esta todo bien

    Conectado a la base de datos
    Fatal error: Call to undefined function password_verify() in D:\AppServ\www\cvu\recursos\acceder.php on line 46

    saludos

    Me gusta

    • Rocanrol · abril 19, 2016

      Parece ser un problema de PHP, password_verify() funciona desde la 5.5.0, asegúrate de tener esa versión o alguna mayor.

      Me gusta

  5. andre · May 3, 2016

    Hola, quería darte las gracias porque me ha ayudado bastante tu tutorial, y de pasada hacerte una consulta, en mi proyecto tengo diferentes usuarios, y a cada uno le asigne un tipo agregando una nueva columna, la consulta es que realice esta condicion:
    if(isset($_SESSION[‘usuario’]) $_SESSION[‘tipo’] == ‘1’ and $_SESSION[‘estado’] == ‘Autenticado’) {
    header(‘Location: usuario1.php’);
    }

    y asi con cada tipo con su respectiva redireccion, el problema que tengo es que como puedo hacer para que el usuario1 en la url no pueda acceder a la pagina del usuario2 ?

    Te agradeceria pudieras aydurme en mi duda, muchas gracias

    Me gusta

    • Rocanrol · May 3, 2016

      Hola, Andre. Gracias por tus comentarios 🙂

      El asunto es: no debes crear un archivo por usuario. Sino obtener el tipo en cada página.

      La condición if() está mal aplicada, mira:

      if(isset($_SESSION[‘usuario’]) $_SESSION[‘tipo’] == ‘1’ and $_SESSION[‘estado’] == ‘Autenticado’) {
      header(‘Location: usuario1.php’);
      }

      Debería ser:

      if(isset($_SESSION['usuario']) AND $_SESSION['tipo'] == '1' and $_SESSION['estado'] == 'Autenticado') {
      	header('Location: usuario1.php');
      }

      Ahora, ¿de dónde sacas el número de «tipo»? ¿Le asignas uno a cada usuario? ¿Es un ID auto-incrementado en la base de datos?

      Saludos.

      Me gusta

      • Andre · May 3, 2016

        El tipo es un numero que le asigno según el tipo de usuario, no es auto-incrementado, y el tema es que eso me resulta y cada usuario segun su tipo se redirecciona a la pagina que le corresponde, pero estos pueden a traves de la url ingresar a todas las otras paginas, ya que esta logeado con el session, entonces queria saber si hay alguna forma de evitar eso, que no pueda entrar a la pagina del usuario2.

        Y me podrias explicar eso de obtener el tipo en cada pagina?

        Me gusta

  6. Mike · junio 4, 2016

    y el archivo conexion.php ?????

    Me gusta

    • Rocanrol · junio 27, 2016

      En la parte del tutorial que dice «Realizamos la conexión a la base de datos».

      Me gusta

  7. Excelente tutorial, un millón de gracias

    Me gusta

  8. Pingback: Acceso y registro con HTML, AJAX, PHP y MySQL | joseavila82
  9. steven · agosto 18, 2016

    hola amigo esta bien todo pero como hago para que el usuario que aya iniciado sesion le aparezca el nombre en el menu de navegacion

    Me gusta

    • Rocanrol · agosto 20, 2016

      Hola. Podrías guardar el nombre en una cookie de sesión y mostrarlo donde lo necesites.

      Me gusta

  10. Win.long · septiembre 26, 2016

    Tengo una duda; al momento de que el usuario supere el tiempo indicado en el script, las sesiones efectivamente se destruyen pero igual sigue logueado, recién cuando refresco la página sale al index y, por ende, al formulario de ingreso.

    ¿Esto es así o hay que agregar/eliminar algo en el script de control de sesión?

    Saludos!

    Me gusta

    • Rocanrol · septiembre 26, 2016

      Hola.

      Lo que describes es el funcionamiento correcto del código provisto.

      Saludos.

      Me gusta

  11. Heiver Cuesta Dávila · octubre 26, 2016

    Le Falto incluir el archivo de Conexion

    Me gusta

    • Rocanrol · octubre 26, 2016

      No, revisa bien el tutorial:

      «[…] Realizamos la conexión a la base de datos (LINK A LA ENTRADA QUE HABLA SOBRE CONECTAR A LA BD), almacenamos los dos valores (usuario y contraseña) en una variable […]»

      Me gusta

  12. Jozian · marzo 25, 2017

    como lo conecto a la base de datos? en las primeras lineas del archivo acceder.

    Me gusta

  13. Lalo Landa · abril 27, 2017

    Hola que tal,

    Gracias por el aporte, aunque tiene un par de años que no programo en php espero no liarla mucho. Tengo una pregunta, por qué me sale este error: #1089 – Parte de la clave es erronea. Una parte de la clave no es una cadena o la longitud usada es tan grande como la parte de la clave.

    Gracias por tu comentario.

    Saludos

    Me gusta

    • Rocanrol · abril 28, 2017

      Hola, ¿dónde te muestra ese error?

      Me gusta

      • Lalo Landa · abril 28, 2017

        Hola, ese error me lo muestra al crear la tabla con los datos, no sé si es el campo de ID o el campo de password.

        Saludos.

        Me gusta

      • Rocanrol · abril 28, 2017

        ¿Estás intentando asignar una longitud a el campo ID? Ese puede ser el problema. Si el ID es auto-incrementable, no necesitas definir un valor.

        Me gusta

      • Lalo Landa · abril 28, 2017

        Listo ya encontré el error, al momento de poner los valores de Unique o de Primary arroja una ventana en el caul te pide el nombre del campo, y los valores por ejemplo: varchar(20) pero no se le agrega nada en esa ventana y me dejó crear la tabla, si tengo alguna otra duda te estaré escribiendo.

        Gracias y saludos.

        Me gusta

  14. novatiño · abril 28, 2017

    Hola Rocanrol, no puedo hacer funcionar el codigo, soy nuevito en programacion y me interesa mucho ver funcionar este codigo aprenderia bastante, tengo creada todos los documentos pero solo llego a la primera pagina, me dice que esta conectado a la base de datos pero nada mas…cree un usuario de prueba en la BD con usuario y pass y tampoco me funciona, ¿que podria ser? la version de js es distinta jquery-3.2.1.min.js y tambien probe con la de google http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    es lo unico que encuentro diferente. tengo wamp64 y win10.

    Saludos.

    Me gusta

    • Rocanrol · abril 28, 2017

      Hola. No acostumbro a dar respuestas personalizadas, porque cada caso es diferente.

      Sin embargo, te recomiendo que checkees la consola de Javascript (desde Dev Tools), a ver si arroja algún error.

      Me gusta

  15. novatiño · abril 28, 2017

    Ok, lo revisare Gracias.

    Me gusta

  16. spabon · julio 8, 2017

    Excelente tutoria, pero podrian ayudarme en algo. Es que al momento de verificar el password
    if( password_verify($passPOST, $passwordBD)){

    session_start();
    $_SESSION[‘usuario’] = $datos[‘nom_usuario_sif’];
    $_SESSION[‘estado’] = ‘Autenticado’;

    die(‘Ha iniciado sesion correctamente como’.$_SESSION[‘usuario’]);
    }

    No me valida el if y se salta al else.

    Lo demas funciona de manera correcta.
    Alguien sabe por qué esta función password_verify() no me valida ?

    Gracias

    Me gusta

  17. spabon · julio 8, 2017

    Buenas tardes apreciados amigos.
    Ya encontrè el detalle. Era que el tamaño del campo en la base de datos era mas pequeño que el que se generaba al encryitar y al comparar la cadena guardada en el campo password, no estaba completa. saludos

    Me gusta

  18. rafaeldorado001 · febrero 16, 2018

    Muchas gracias, me gusta mucho este blog

    Me gusta

  19. Arath · julio 3, 2018

    Es la página con mejor explicación y estructura que he visto.
    ¡Muchas gracias!

    Me gusta

Deja un comentario