sábado, 12 de diciembre de 2020

Sistema de registro e inicio de sesión con HTML,PHP y MySQL

Este sistema de usuarios está elaborado con HTML y php, la base de datos para registra usuarios se creó en MySQL. Para el host local se utilizó wampserver.  Los archivos del sistema están en el siguiente enlace.

Los archivos son: 

config.php

index.php

login.php

logout.php

register.php

reset-password.php

y el script de la tabla users es:

users.sql


No tiene agregado CSS para mejor comprensión del código.


config.php

<?php

/* Credenciales de la base de datos. Suponiendo que está ejecutando MySQL

 con configuración predeterminada (usuario 'root' sin contraseña) */

define('DB_SERVER', 'localhost');//nombre del servidor

define('DB_USERNAME', 'root');//nombre de usuario del servidor

define('DB_PASSWORD', '');//contraseña del servidor

define('DB_NAME', 'db_usuarios');//nombre de la base de datos

 

/* Prueba de conexión a la base de datos MySQL*/

$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

 

// Se verifica la conexión, si no se puede realizar se indica el error

if($link === false){

    die("ERROR: Could not connect. " . mysqli_connect_error());

}

?>




index.php


<?php

// Se inicializa la sesión

session_start();

 

/* Se comprueba si el usuario ha iniciado sesión, si no, se redirecciona

 a la página de inicio de sesión (login.php)*/

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){

    header("location: login.php");

    exit;

}

?>


<!DOCTYPE html>

<html lang="es">

<head>

<meta charset="UTF-8">

<title>Bienvenido</title>  

</head>

<body>

<h1>Hola, <b><?php echo htmlspecialchars($_SESSION["username"]); ?></b>. Has ingresado al sitio.</h1>

   

<p>

<a href="logout.php">Cerrar sesión</a><br>

<a href="reset-password.php" >Cambiar contraseña</a>

</p>

<p>

Nuestro sistema cuenta con ....

</p>

</body>

</html>


login.php

<?php

// Inicializa la sesión

session_start();

 

/* Verifique si el usuario ya ha iniciado sesión, si es así, 

rediríjalo a la página de bienvenida (index.php)*/

if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){

  header("location: index.php");

  exit;

}

 

// Incluir el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$username = $password = $username_err = $password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Comprobar si el nombre de usuario está vacío

    if(empty(trim($_POST["username"]))){

        $username_err = "Por favor ingrese su usuario.";

    } else{

        $username = trim($_POST["username"]);

    }

    

    // Comprobar si la contraseña está vacía

    if(empty(trim($_POST["password"]))){

        $password_err = "Por favor ingrese su contraseña.";

    } else{

        $password = trim($_POST["password"]);

    }

    

    // Validar información del usuario

    if(empty($username_err) && empty($password_err)){

        // Preparar la consulta select

        $sql = "SELECT id, username, password FROM users WHERE username = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            /* Vincular variables a la declaración preparada como parámetros, s es por la

variable de tipo string*/

            mysqli_stmt_bind_param($stmt, "s", $param_username);

            

            // Asignar parámetros

            $param_username = $username;

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                // almacenar el resultado de la consulta

                mysqli_stmt_store_result($stmt);

                

                /*Verificar si existe el nombre de usuario, si es así,

verificar la contraseña*/

                if(mysqli_stmt_num_rows($stmt) == 1){                    

                    // Vincular las variables del resultado

                    mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);

//obtener los valores de la consulta

                    if(mysqli_stmt_fetch($stmt)){

/*comprueba que la contraseña ingresada sea igual a la 

almacenada con hash*/

                        if(password_verify($password, $hashed_password)){

                            // La contraseña es correcta, así que se inicia una nueva sesión

                            session_start();

                            

                            // se almacenan los datos en las variables de la sesión

                            $_SESSION["loggedin"] = true;

                            $_SESSION["id"] = $id;

                            $_SESSION["username"] = $username;                            

                            

                            // Redirigir al usuario a la página de inicio

                            header("location: index.php");

                        } else{

                            // Mostrar un mensaje de error si la contraseña no es válida

                            $password_err = "La contraseña que ha ingresado no es válida.";

                        }

                    }

                } else{

                    // Mostrar un mensaje de error si el nombre de usuario no existe

                    $username_err = "No existe cuenta registrada con ese nombre de usuario.";

                }

            } else{

                echo "Algo salió mal, por favor vuelve a intentarlo.";

            }

        }

        

        // Cerrar la sentencia de consulta

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar laconexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

<meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

<title>Inicio de sesión</title>

</head>

<body>

    

        <h2>Inicio de sesión</h2>

        <p>Por favor, introduzca usuario y contraseña para iniciar sesión.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">

                <label>Usuario</label>

                <input type="text" name="username"  value="<?php echo $username; ?>">

                <span ><?php echo $username_err; ?></span><br>

              

                <label>Contraseña</label>

                <input type="password" name="password">

                <span ><?php echo $password_err; ?></span><br>

            

            

                <input type="submit"  value="Ingresar"><br>

                <p>¿No tienes una cuenta? <a href="register.php">Regístrate ahora</a>.</p>

        </form>

     

</body>

</html>



logout.php

<?php

// Se inicia la sesión

session_start();

 

// se desasignan todas las variables de sesión

$_SESSION = array();

 

// se destruye la sesión

session_destroy();

 

// se redirecciona a la página de inicio de sesión (login.php)

header("location: login.php");

//se sale del archivo

exit;

?>




register.php

<?php

// se incluye el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$username = $password = $confirm_password = "";

$username_err = $password_err = $confirm_password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Validar el nombre de usuario

    if(empty(trim($_POST["username"]))){

        $username_err = "Por favor ingrese un usuario.";

    } else{

        // Preparar la consulta

        $sql = "SELECT id FROM users WHERE username = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "s", $param_username);

            

            // asignar parámetros

            $param_username = trim($_POST["username"]);

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                /* almacenar resultado*/

                mysqli_stmt_store_result($stmt);

                

                if(mysqli_stmt_num_rows($stmt) == 1){

                    $username_err = "Este usuario ya fue tomado.";

                } else{

                    $username = trim($_POST["username"]);

                }

            } else{

                echo "Al parecer algo salió mal.";

            }

        }

         

        // Declaración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Validar contraseña

    if(empty(trim($_POST["password"]))){

        $password_err = "Por favor ingresa una contraseña.";     

    } elseif(strlen(trim($_POST["password"])) < 6){

        $password_err = "La contraseña al menos debe tener 6 caracteres.";

    } else{

        $password = trim($_POST["password"]);

    }

    

    // Validar que se confirma la contraseña

    if(empty(trim($_POST["confirm_password"]))){

        $confirm_password_err = "Confirma tu contraseña.";     

    } else{

        $confirm_password = trim($_POST["confirm_password"]);

        if(empty($password_err) && ($password != $confirm_password)){

            $confirm_password_err = "No coincide la contraseña.";

        }

    }

    

    // Verifique los errores de entrada antes de insertar en la base de datos

    if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){

        

        // Prepare una declaración de inserción

        $sql = "INSERT INTO users (username, password) VALUES (?, ?)";

         

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);

            

            // Establecer parámetros

            $param_username = $username;

$param_password = password_hash($password, PASSWORD_DEFAULT); // Crear una contraseña hash

            

            // Intentar ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                // Redirigir a la página de inicio de sesión (login.php)

                header("location: login.php");

            } else{

                echo "Algo salió mal, por favor inténtalo de nuevo.";

            }

        }

         

        // claración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar la conexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

    <meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

    <title>Registro</title>

</head>

<body>

    

        <h2>Registro</h2>

        <p>Por favor complete este formulario para crear una cuenta.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">

                <label>Usuario</label>

                <input type="text" name="username"  value="<?php echo $username; ?>">

                <span><?php echo $username_err; ?></span><br>

            

                <label>Contraseña</label>

                <input type="password" name="password"  value="<?php echo $password; ?>">

                <span><?php echo $password_err; ?></span><br>

            

            

                <label>Confirmar contraseña</label>

                <input type="password" name="confirm_password"  value="<?php echo $confirm_password; ?>">

                <span><?php echo $confirm_password_err; ?></span><br>

            

                <input type="submit"  value="Ingresar">

                <input type="reset"  value="Borrar"><br>

            

            <p>¿Ya tienes una cuenta? <a href="login.php">Ingresa aquí</a>.</p>

        </form>

    

</body>

</html>


reset-password.php

<?php

// inicializa la sesión

session_start();

 

/* Compruebe si el usuario ha iniciado sesión; 

de lo contrario, redirija a la página de inicio de sesión (login.php)*/

if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){

    header("location: login.php");

    exit;

}

 

// incluir el archivo de configuración

require_once "config.php";

 

// Definir variables e inicializar con valores vacíos

$new_password = $confirm_password = "";

$new_password_err = $confirm_password_err = "";

 

// Procesamiento de datos del formulario cuando se envía el formulario

if($_SERVER["REQUEST_METHOD"] == "POST"){

 

    // Validar la nueva contraseña

    if(empty(trim($_POST["new_password"]))){

        $new_password_err = "Por favor, introduzca la nueva contraseña.";     

    } elseif(strlen(trim($_POST["new_password"])) < 6){

        $new_password_err = "La contraseña debe tener al menos 6 caracteres.";

    } else{

        $new_password = trim($_POST["new_password"]);

    }

    

    // Validar la confirmación de contraseña

    if(empty(trim($_POST["confirm_password"]))){

        $confirm_password_err = "Por favor confirme la contraseña.";

    } else{

        $confirm_password = trim($_POST["confirm_password"]);

        if(empty($new_password_err) && ($new_password != $confirm_password)){

            $confirm_password_err = "Las contraseñas no coinciden.";

        }

    }

        

    // Verifique los errores de entrada antes de actualizar la base de datos

    if(empty($new_password_err) && empty($confirm_password_err)){

        // Prepare la declaración de actualización

        $sql = "UPDATE users SET password = ? WHERE id = ?";

        

        if($stmt = mysqli_prepare($link, $sql)){

            // Vincular variables a la declaración preparada como parámetros

            mysqli_stmt_bind_param($stmt, "si", $param_password, $param_id);

            

            // Asignar parámetros

            $param_password = password_hash($new_password, PASSWORD_DEFAULT);

            $param_id = $_SESSION["id"];

            

            // Intente ejecutar la declaración preparada

            if(mysqli_stmt_execute($stmt)){

                /* Contraseña actualizada exitosamente. 

Destruye la sesión y redirige a la página de inicio de sesión (login.php)*/

                session_destroy();

                header("location: login.php");

                exit();

            } else{

                echo "Algo salió mal, por favor vuelva a intentarlo.";

            }

        }

        

        // Declaración de cierre

        mysqli_stmt_close($stmt);

    }

    

    // Cerrar conexión

    mysqli_close($link);

}

?>

 

<!DOCTYPE html>

<html lang="es">

<head>

    <meta charset="UTF-8">

<!link href="CSS/estilo_form.css" rel="stylesheet" type="text/css">

    <title>Cambio de contraseña</title>

</head>

<body>

        <h2>Cambio contraseña</h2>

        <p>Complete este formulario para restablecer su contraseña.</p>

        <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> 

        

                <label>Nueva contraseña</label>

                <input type="password" name="new_password" value="<?php echo $new_password; ?>">

                <span><?php echo $new_password_err; ?></span><br>

            

                <label>Confirmar contraseña</label>

                <input type="password" name="confirm_password" >

                <span><?php echo $confirm_password_err; ?></span><br>

            

                <input type="submit" value="Enviar"><br>

                <a class="btn btn-link" href="index.php">Cancelar</a>

           

        </form>

  

</body>

</html>



users.sql

CREATE TABLE IF NOT EXISTS `users` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(50) NOT NULL,

  `password` varchar(255) NOT NULL,

  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),

  UNIQUE KEY `username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;




Si se utiliza wampserver solamente copiamos los archivos en una carpeta  dentro de la carpeta www de la ruta de instalación. Por ejemplo en C:\wamp64\www\

Ahí creamos una carpeta con el nombre que deseemos, por ejemplo sistema_2_es

Ahora en la carpeta alias (C:\wamp64\alias) copiamos cualquiera de los archivos con extensión .conf y le cambiamos el nombre por el de nuestra carpeta de archivos: sistema_2_es.conf 


Si realizamos bien los pasos despues de abrir el local host veremos en your aliases el nombre de nuestra carpeta y al dar clic se abrirá la página de inicio (index.php) pero como es necesario estar iniciar sesión se abre el archivo de login (login.php).









La base de datos la podemos crear en phpmyadmin.