En esta oportunidad les voy a dejar un tutorial básico para desarrollar un sistema de usuarios con PHP y MySQL, en el cual haremos uso de sesiones, trataré de ser lo más entendible posible, pero si tienen alguna duda, pueden decirla comentando en esta entrada.

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`)
)

Como podrán notar, el campo usuario_clave tiene una longitud de 32 caracteres, ya que la contraseña de los usuarios registrados las encriptaremos en md5(). Ahora pasamos a crear nuestro scripts PHP.

Creación de archivo de configuración de acceso a MySQL:

A este archivo lo llamaremos acceso_db.php y va a contener los datos de acceso a 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 procederemos a crear nuestro formulario de registro, al cual llamaremos 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:

Ahora pasaremos a crear nuestro formulario de acceso o Login, a 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
    
}
?>

Este es el archivo que comprueba los datos ingresados en el formulario de login, 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");
    }
?>

Agregando mensaje de bienvenida con enlace hacia el perfil personal y un enlace para cerrar sesión, en cualquier página:

Ahora lo que haremos será agregar un mensaje de bienvenida al usuario logueado, además de un enlace para que éste mismo cierre su sesión:

Al inicio de todo el documento HTML de nuestras páginas agregamos lo siguiente:

<?php
    session_start
();
    include(
'acceso_db.php');
?>

Y en cualquier zona de nuestras páginas insertamos el siguiente código:

<?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
    
}
?>

Cerrando la sesión del usuario:

Con este pequeño script cerramos la sesión del usuario, a este archivo lo llamamos 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.";
    }
?>

Página Personal de Usuarios:

Ahora pasaremos a crear una página personal para cada usuario registrado en el sistema, para ello, mostraremos el perfil de usuario, según su ID. Creamos un archivo llamado perfil.php

<?php
    session_start
();
    include(
'acceso_db.php');
    
$perfil mysql_query("SELECT * FROM usuarios WHERE usuario_id='".$_GET['id']."'") 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
    
}
?>

Páginas restringidas:

Como en toda web con sistema de usuarios, siempre habrán zonas restringidas a las que sólo podrán acceder usuarios registrados, entonces para ello partimos del 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 la contraseña:

Si el usuario ha olvidado su contraseña, habrá que facilitársela, para ello generaremos una nueva contraseña de forma aleatoria y se la enviaremos a su correo, 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
    
}
?>

Cambiando la contraseña:

Con este script, los usuarios podrán cambiar su contraseña, a este archivo lo llamaremos cambiar_contrasena.php

<?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.";
    }
?>

Eso sería todo, naturalmente, se puede mejorar añadiéndole más cosas, pero para comenzar, puede ser útil.

Descargar Script