martes, 29 de octubre de 2013

Sistema de usuarios con PHP y MySQL



Hola a todos!! luego de perderme un tiempo por aquí vengo a dejarles un pack completo de un sistema de usuarios en PHP con ayuda de MySQL que encontré navegando  para aquellos que estén interesados en crear su página web con usuarios o para aquellos curiosos como yo que quieran ver como es el funcionamiento y manejo de los usuarios en las páginas web, weno sin más tiempo que perder empecemos !!!

Para empezar, crearemos nuestra tabla de usuarios con los siguientes campos:
  
CREATE TABLE `usuarios` (
    `usuario_id` int(4) NOT NULL AUTO_INCREMENT,
    `usuario_nombre` varchar(15) NOT NULL DEFAULT '',
    `usuario_clave` varchar(32) NOT NULL DEFAULT '',
    `usuario_email` varchar(50) NOT NULL DEFAULT '',
    `usuario_freg` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
    PRIMARY KEY (`usuario_id`)
)

Archivo de configuracion de acceso a MySQL.



Weno una vez creada nuestra tabla de usuarios crearemos el archivo acceso_db.php en el cual estará la configuración de nuestra base de datos.


<?php
    $host_db = ""; // Host de la BD
    $usuario_db = ""; // Usuario de la BD
    $clave_db = ""; // Contraseña de la BD
    $nombre_db = ""; // Nombre de la BD
    
    //conectamos y seleccionamos db
    mysql_connect($host_db, $usuario_db, $clave_db);
    mysql_select_db($nombre_db);
?> 

Formulario de registro.

Ahora crearemos en formulario de registro de usuarios, el cual se llamara registro.php


  <?php
    include('acceso_db.php'); // incluimos el archivo de conexión a la Base de Datos
    if(isset($_POST['enviar'])) { // comprobamos que se han enviado los datos desde el formulario
        // creamos una función que nos parmita validar el email
        function valida_email($correo) {
            if (preg_match('/^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+\.[A-Za-z]{2,4}$/', $correo)) return true;
            else return false;
        }
        // Procedemos a comprobar que los campos del formulario no estén vacíos
        $sin_espacios = count_chars($_POST['usuario_nombre'], 1);
        if(!empty($sin_espacios[32])) { // comprobamos que el campo usuario_nombre no tenga espacios en blanco
            echo "El campo <em>usuario_nombre</em> no debe contener espacios en blanco. <a href='javascript:history.back();'>Reintentar</a>";
        }elseif(empty($_POST['usuario_nombre'])) { // comprobamos que el campo usuario_nombre no esté vacío
            echo "No haz ingresado tu usuario. <a href='javascript:history.back();'>Reintentar</a>";
        }elseif(empty($_POST['usuario_clave'])) { // comprobamos que el campo usuario_clave no esté vacío
            echo "No haz ingresado contraseña. <a href='javascript:history.back();'>Reintentar</a>";
        }elseif($_POST['usuario_clave'] != $_POST['usuario_clave_conf']) { // comprobamos que las contraseñas ingresadas coincidan
            echo "Las contraseñas ingresadas no coinciden. <a href='javascript:history.back();'>Reintentar</a>";
        }elseif(!valida_email($_POST['usuario_email'])) { // validamos que el email ingresado sea correcto
            echo "El email ingresado no es válido. <a href='javascript:history.back();'>Reintentar</a>";
        }else {
            // "limpiamos" los campos del formulario de posibles códigos maliciosos
            $usuario_nombre = mysql_real_escape_string($_POST['usuario_nombre']);
            $usuario_clave = mysql_real_escape_string($_POST['usuario_clave']);
            $usuario_email = mysql_real_escape_string($_POST['usuario_email']);
            // comprobamos que el usuario ingresado no haya sido registrado antes
            $sql = mysql_query("SELECT usuario_nombre FROM usuarios WHERE usuario_nombre='".$usuario_nombre."'");
            if(mysql_num_rows($sql) > 0) {
                echo "El nombre usuario elegido ya ha sido registrado anteriormente. <a href='javascript:history.back();'>Reintentar</a>";
            }else {
                $usuario_clave = md5($usuario_clave); // encriptamos la contraseña ingresada con md5
                // ingresamos los datos a la BD
                $reg = mysql_query("INSERT INTO usuarios (usuario_nombre, usuario_clave, usuario_email, usuario_freg) VALUES ('".$usuario_nombre."', '".$usuario_clave."', '".$usuario_email."', NOW())");
                if($reg) {
                    echo "Datos ingresados correctamente.";
                }else {
                    echo "ha ocurrido un error y no se registraron los datos.";
                }
            }
        }
    }else {
?>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
        <label>Usuario:</label><br />
        <input type="text" name="usuario_nombre" maxlength="15" /><br />
        <label>Contraseña:</label><br />
        <input type="password" name="usuario_clave" maxlength="15" /><br />
        <label>Confirmar Contraseña:</label><br />
        <input type="password" name="usuario_clave_conf" maxlength="15" /><br />
        <label>Email:</label><br />
        <input type="text" name="usuario_email" maxlength="50" /><br />
        <input type="submit" name="enviar" value="Registrar" />
        <input type="reset" value="Borrar" />
    </form>
<?php
    }
?>  

Formulario de Acceso.



A continuación crearemos el formulario con el cual los usuarios podrán acceder  a sus cuentas, este archivo lo llamaremos acceso.php
 

 <?php
    session_start();
    include('acceso_db.php');
    if(empty($_SESSION['usuario_nombre'])) { // comprobamos que las variables de sesión estén vacías        
?>
        <form action="comprobar.php" method="post">
            <label>Usuario:</label><br />
            <input type="text" name="usuario_nombre" /><br />
            <label>Contraseña:</label><br />
            <input type="password" name="usuario_clave" /><br />
            <input type="submit" name="enviar" value="Ingresar" />
        </form>                    
<?php
    }else {
?>
        <p>Hola <strong><?=$_SESSION['usuario_nombre']?></strong> | <a href="logout.php">Salir</a></p>
<?php
    }
?>  

Comprobar Acceso

El siguiente archivo se encargara de comprobar y verificar los datos ingresado, lo llamaremos comprobar.php

  <?php
    session_start();
    include('acceso_db.php');
    if(isset($_POST['enviar'])) { // comprobamos que se hayan enviado los datos del formulario
        // comprobamos que los campos usuarios_nombre y usuario_clave no estén vacíos
        if(empty($_POST['usuario_nombre']) || empty($_POST['usuario_clave'])) {
            echo "El usuario o la contraseña no han sido ingresados. <a href='javascript:history.back();'>Reintentar</a>";
        }else {
            // "limpiamos" los campos del formulario de posibles códigos maliciosos
            $usuario_nombre = mysql_real_escape_string($_POST['usuario_nombre']);
            $usuario_clave = mysql_real_escape_string($_POST['usuario_clave']);
            $usuario_clave = md5($usuario_clave);
            // comprobamos que los datos ingresados en el formulario coincidan con los de la BD
            $sql = mysql_query("SELECT usuario_id, usuario_nombre, usuario_clave FROM usuarios WHERE usuario_nombre='".$usuario_nombre."' AND usuario_clave='".$usuario_clave."'");
            if($row = mysql_fetch_array($sql)) {
                $_SESSION['usuario_id'] = $row['usuario_id']; // creamos la sesion "usuario_id" y le asignamos como valor el campo usuario_id
                $_SESSION['usuario_nombre'] = $row["usuario_nombre"]; // creamos la sesion "usuario_nombre" y le asignamos como valor el campo usuario_nombre
                header("Location: acceso.php");
            }else {
?>
                Error, <a href="acceso.php">Reintentar</a>
<?php
            }
        }
    }else {
        header("Location: acceso.php");
    }
?> 


Mensaje de Bienvenido y cierre de sesión 



Ahora lo que haremos será crear una pagina de ejemplo en la cual se mostrara un mensaje y la opción de cerrar sesión solamente si el usuario se ha logeado con una cuenta valida, caso contrario se mostrar las opciones de registrarse e ingresar , este será nuestro archivo index.php


 <?php
    session_start();
    include('acceso_db.php');
?> 
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <?php
        if(isset($_SESSION['usuario_nombre'])) {
    ?>
            Bienvenido: <a href="perfil.php?id=<?=$_SESSION['usuario_id']?>"><strong><?=$_SESSION['usuario_nombre']?></strong></a><br />
            <a href="logout.php">Cerrar Sesión</a>
    <?php
        }else {
    ?>
            <a href="registro.php">Registrarse</a> | <a href="acceso.php">Ingresar</a>
    <?php
        }
    ?> 
</body>
</html>

Cerrar la sesión del usuario


Este es el archivo que se encarga de cerrar la sesión del usuario , este archivo se llamara logout.php


 <?php
    session_start();
    include('acceso_db.php'); // incluímos los datos de acceso a la BD
    // comprobamos que se haya iniciado la sesión
    if(isset($_SESSION['usuario_nombre'])) {
        session_destroy();
        header("Location: index.php");
    }else {
        echo "Operación incorrecta.";
    }
?>  

Perfil del usuario

 Ahora crearemos un archivo llamado perfil.php el cual se encargara de mostrar algunos datos del usuario según su ID.

 <?php
    session_start();
    include('acceso_db.php');
  $ident = mysql_real_escape_string($_GET['id']);
     $perfil = mysql_query("SELECT * FROM usuarios WHERE usuario_id='".$ident."'") or die(mysql_error());
    if(mysql_num_rows($perfil)) { // Comprobamos que exista el registro con la ID ingresada
        $row = mysql_fetch_array($perfil);
        $id = $row["usuario_id"];
        $nick = $row["usuario_nombre"];
        $email = $row["usuario_email"];
        $freg = $row["usuario_freg"];
?>
        <strong>Nick:</strong> <?=$nick?><br />
        <strong>Email:</strong> <?=$email?><br />
        <strong>Registrado el:</strong> <?=$freg?><br />
        <strong>URL del perfil:</strong> <a href="perfil.php?id=<?=$id?>">Click aquí</a>
<?php
    }else {
?>
        <p>El perfil seleccionado no existe o ha sido eliminado.</p>
<?php
    }
?>  

Pagina restringida

Como en toda web con sistema de usuarios, siempre habrán zonas en la que sólo podrán acceder usuarios registrados, para ello deberemos agregar el siguiente código  :

 <?php
    session_start();
    include('acceso_db.php'); // incluímos los datos de acceso a la BD
    // comprobamos que se haya iniciado la sesión
    if(isset($_SESSION['usuario_nombre'])) {
?>
        <!-- Aquí ponemos todo el código HTML de nuestra página restringida, desde <html> a </html>-->
<?php
    }else {
        echo "Estás accediendo a una página restringida, para ver su contenido debes estar registrado.<br />
        <a href='acceso.php'>Ingresar</a> / <a href='registro.php'>Regitrarme</a>";
    }
?>  

Recuperación de Contraseña



Si alguna vez el usuario olvida su contraseña deberemos poder facilitar una nueva contraseña, la cual será generada aleatoriamente y enviada al correo con el que el usuario se registro, a este archivo lo llamaremos recuperar_contrasena.php


 


  <?php
    include('acceso_db.php'); // incluímos los datos de acceso a la BD
    if(isset($_POST['enviar'])) { // comprobamos que se han enviado los datos del formulario
        if(empty($_POST['usuario_nombre'])) {
            echo "No ha ingresado el usuario. <a href='javascript:history.back();'>Reintentar</a>";
        }else {
            $usuario_nombre = mysql_real_escape_string($_POST['usuario_nombre']);
            $usuario_nombre = trim($usuario_nombre);
            $sql = mysql_query("SELECT usuario_nombre, usuario_clave, usuario_email FROM usuarios WHERE usuario_nombre='".$usuario_nombre."'");
            if(mysql_num_rows($sql)) {
                $row = mysql_fetch_assoc($sql);
                $num_caracteres = "10"; // asignamos el número de caracteres que va a tener la nueva contraseña
                $nueva_clave = substr(md5(rand()),0,$num_caracteres); // generamos una nueva contraseña de forma aleatoria
                $usuario_nombre = $row['usuario_nombre'];
                $usuario_clave = $nueva_clave; // la nueva contraseña que se enviará por correo al usuario
                $usuario_clave2 = md5($usuario_clave); // encriptamos la nueva contraseña para guardarla en la BD
                $usuario_email = $row['usuario_email'];
                // actualizamos los datos (contraseña) del usuario que solicitó su contraseña
                mysql_query("UPDATE usuarios SET usuario_clave='".$usuario_clave2."' WHERE usuario_nombre='".$usuario_nombre."'");
                // Enviamos por email la nueva contraseña
                $remite_nombre = ""; // Tu nombre o el de tu página
                $remite_email = ""; // tu correo
                $asunto = "Recuperación de contraseña"; // Asunto (se puede cambiar)
                $mensaje = "Se ha generado una nueva contraseña para el usuario <strong>".$usuario_nombre."</strong>. La nueva contraseña es: <strong>".$usuario_clave."</strong>.";
                $cabeceras = "From: ".$remite_nombre." <".$remite_email.">\r\n";
                $cabeceras = $cabeceras."Mime-Version: 1.0\n";
                $cabeceras = $cabeceras."Content-Type: text/html";
                $enviar_email = mail($usuario_email,$asunto,$mensaje,$cabeceras);
                if($enviar_email) {
                    echo "La nueva contraseña ha sido enviada al email asociado al usuario ".$usuario_nombre.".";
                }else {
                    echo "No se ha podido enviar el email. <a href='javascript:history.back();'>Reintentar</a>";
                }
            }else {
                echo "El usuario <strong>".$usuario_nombre."</strong> no está registrado. <a href='javascript:history.back();'>Reintentar</a>";
            }
        }
    }else {
?>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
        <label>Usuario:</label><br />
        <input type="text" name="usuario_nombre" /><br />
        <input type="submit" name="enviar" value="Enviar" />
    </form>
<?php
    }
?> 

Cambiar Contraseña



Por último crearemos un archivo llamado cambiar_contrasena.php  con el cual los usuarios podrán cambiar su contraseña cuando lo necesiten.


 


 <?php
    session_start();
    include('acceso_db.php'); // incluímos los datos de conexión a la BD
    if(isset($_SESSION['usuario_nombre'])) { // comprobamos que la sesión esté iniciada
        if(isset($_POST['enviar'])) {
            if($_POST['usuario_clave'] != $_POST['usuario_clave_conf']) {
                echo "Las contraseñas ingresadas no coinciden. <a href='javascript:history.back();'>Reintentar</a>";
            }else {
                $usuario_nombre = $_SESSION['usuario_nombre'];
                $usuario_clave = mysql_real_escape_string($_POST["usuario_clave"]);
                $usuario_clave = md5($usuario_clave); // encriptamos la nueva contraseña con md5
                $sql = mysql_query("UPDATE usuarios SET usuario_clave='".$usuario_clave."' WHERE usuario_nombre='".$usuario_nombre."'");
                if($sql) {
                    echo "Contraseña cambiada correctamente.";
                }else {
                    echo "Error: No se pudo cambiar la contraseña. <a href='javascript:history.back();'>Reintentar</a>";
                }
            }
        }else {
?>
        <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
            <label>Nueva contraseña:</label><br />
            <input type="password" name="usuario_clave" maxlength="15" /><br />
            <label>Confirmar:</label><br />
            <input type="password" name="usuario_clave_conf" maxlength="15" /><br />
            <input type="submit" name="enviar" value="Enviar" />
        </form>
<?php
        }
    }else {
        echo "Acceso denegado.";
    }
?>  
Para aquellos que quieran el archivo ZIP con todos los archivos que hemos visto aqui se los dejo para que puedan descargarlo.



Hasta aquí seria todo , espero que de alguna manera les haiga ayudado y ya saben cualquier problema solo comenten y lo más pronto posible les responderé.


Sígueme en facebook  y  ayúdame a llegar a más personas .
https://www.facebook.com/pages/Espacio-Hacker/393964274047994


Fuente
http://www.celulaweb.net/2010/07/07/tutorial-sistema-de-usuarios-con-php-y-mysql/

33 comentarios:

  1. Gracias amigo me sirvio mucho sigue asi espero mas ejemplos

    ResponderEliminar
  2. gracias muy bueno, saludos...

    ResponderEliminar
  3. eso es un registro para personas que ingresen a mi web les agradeceria sus respuestas

    ResponderEliminar
  4. esta vacan pero no tendras para multiples usuarios, donde cada usuario tenga una cuenta y restricciones por jerarquias(jefe,gerente,secretaria,etc). donde el administrador pueda enviar mensaje a la secretaria y que solo ella pueda verlo, no cualquier usuario logueado, lo mismo para cada cliente,
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola PorgramerJunior !!! creo que luis ya te habra dado una idea jeje y ya depende de cada uno mejorar este sistema de usuarios añadiendole mas funciones ;)

      Eliminar
  5. oye man y por ejemplo ahí solo pones un usuario pero y si fueran 20 y 10 de ellos son administradores se que se separa con el else tipo=1 es administrador y lo mandas a otra location bueno es lo que yo te podría decir que agregues lo demás pues por lo que veo esta bien pero esa condición la deberías agregar por ejemplo usuario=1 administrador si es 2 usuario normal y si es 3 es usuario invitado o no registrado y otra cosa no se escribe haiga XD

    ResponderEliminar
    Respuestas
    1. Hola Luis !!! si se podría hacer eso que dices pero mi intención en este tutorial es solamente hacer algo básico para aquellos que recién empiezan. La idea de colocarle tipo según sea el usuario es correcta así he visto yo que lo hacen , yo les di el comienzo depende de ustedes mejorarlo ;) ... a y disculpa mi ortografía lo que pasa es que no soy muy weno escribiendo jejejje

      Eliminar
  6. Excelente, excelente. solo me falta probarlo pero es un buen comienzo. Buen aporto.
    Oye ¿De casualidad tendrás otro sistema de usuario, donde la forma de registrase sea con la huella dactilar o con la iris del ojo?

    ResponderEliminar
  7. muy bueno y seguro, evita inyeccion sql, gracias por el aporte.

    ResponderEliminar
  8. ummm eso está poderoso

    ResponderEliminar
  9. como se podria asignar un id en la url y mostrar un perfil de cada usuario?

    www.ejemplo.com/?id=user00215544

    ResponderEliminar
  10. no me envia el email.. me sale "No se ha podido enviar el email. Reintentar" no encuentro el error en recuperar_contrasena.php -

    ResponderEliminar
  11. amigo una pregunta, a mi no me funciona con un usuario que tenga correo hotmail... porque sera, en gmail si me funcion

    ResponderEliminar
  12. te hago una pregunta... yo quiero hacer una web en la cual pondria en distintas paginas html galerias fotografias..
    la cosa es asi... imaginate que tengo 5 usuarios, pero no quiero que cualquiera vea las fotos del usuario 1.. o sea que cuando un usuario se loguee solo pueda ver su galeria personal... como puedo hacer esto??
    en pocas palabras lo que quiero hacer es... se loguea juan, y va a parar a la galeria personal de juan... me explique??

    ResponderEliminar
  13. Muy bueno el documento. Muchas gracias!

    ResponderEliminar
  14. buenass, estoy intentando registrar el usuario y me da un error:

    Acceso prohibido!

    Usted no tiene permiso de accesar al objeto solicitado. El objeto está protegido contra lectura, o no puede ser leído por el servidor.

    no se que puedo hacer si alguien puede ayudarme... gracias

    ResponderEliminar
  15. genio! volvé con mas magia!!!

    ResponderEliminar
  16. hermano muchisimas gracias por tu ejemplo tan completo.... me ha servido todo menos una cosa....


    y es el cambio de contraseña actual del usuario cuando este lo desee.. aqui te dejare el codigo personalisado a ver si puedes encontrar el fallo,,,,

    antes que nada te explico cual es el fallo...


    cuando voy a donde dice cambiar contraseña y pongo la contraseña actual del usuario cuando le doy a enviar o cambiar esta me da un abiso diciendo que ya a sido coambiada, pero la verdad e que se ha quedado todo como estaba y no se ha cambiado ninguna contraseña en la base de datos..... espero me ayudes

    ResponderEliminar
  17. amigo tendrías uno que tenga un modulo para cada usuario, es decir que al loguearse pueda ver solo él el contenido que se le asigne...

    ResponderEliminar
  18. Excelente aporte. Muy agradecido por el empuje y por compartir la experiencia. Saludos

    ResponderEliminar
  19. Hola amigos! disculpen por no responder los comentarios pero e estado un largo tiempo perdido por mi blog, sobre los errores que pudieran haber los vere en el transcurso de la semana. Mil disculpas por responder tan tarde pero se los recompensare con nuevos tutoriales. Gracias.

    ResponderEliminar
  20. gracias es justo lo que buscaba

    ResponderEliminar
  21. Muy Bueno! espero poder adaptarlo a mysqli!
    muchas gracias

    ResponderEliminar
  22. Sos un grande boludo tanto buscaba este ejemplo y vos son tremendo, gracias por compartir tus conocimientos SOS GRANDE :)

    ResponderEliminar
  23. Hola maestro. muy bueno estos archivos, funciona perfecto todo, menos la pagina de perfil ,,.. que puede estar mal, la verdad esto es demasiado para mi, no entiendo ja. alguien me ayuda?

    ResponderEliminar
  24. Realmente, una maravilla, hace una semana que pruebo codigos, y este resulto, al menos la parte de insercion en la base de datos de los usuarios, lo unico que no puedo iniciar sesion, pero eso es algo menor, al menos ya puedo registrar gente.... sigo intentando. sos un genio

    ResponderEliminar
  25. Amigo gracias por tu aporte. Solo quiero hacerte una corrección no se dice ni se escribe haiga esta palabra como tal no existe, la correcta es Haya del verbo haber. Bendiciones y de nuevo muchas gracias y lo animo a que siga compartiendo tus conocimientos.

    ResponderEliminar
  26. Felicitaciones!!!! el mejor scripts que he visto

    ResponderEliminar