domingo, 4 de mayo de 2014

como hacer un Sistema de usuarios con PHP y MySQL (phpMyAdmin) utlizando OpenSuse 31.1

En esta oportunidad les voy a dejar un tutorial básico para desarrollar un sistema de registro usuarios con PHP y MySQL (phpMyAdmin),.

(antes debes tomar en cuenta que ) Es recomendable trabajar con una DB de tipo InnoDB por que ofrece una fiabilidad y consistencia muy superior a MyISAM. tablas relacionales muy grandes debes aplicar: InnoDB.

Para empezar, crearemos nuestra base de datos :('userdatasql') y la tabla de ('usuarios') con los siguientes campos:

CREATE TABLE IF NOT EXISTS usuarios (
usuario_id int(5) 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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



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 ="localhost"; //nombre de la bd
$usuario_db =" ";// usuario dela BD
$clave_db =" "; // clave de user DB
$nombre_db =" "; //nombre la BD
//CONECTAMOS Y SELECCIONAMOS LA BD:
mysql_connect($host_db, $usuario_db, $clave_db) or exit('Datos de conexion incorrectos.');
mysql_select_db($nombre_db) or exit('no se encontro la BD.');
echo 'se conecto correctamente con la BD';
?>



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


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


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

No hay comentarios:

Publicar un comentario