lunes, 4 de mayo de 2015

Sistemas de Usuarios en PHP y MYSQL

1.- Creando la tabla en MySQL

Bien, necesitamos una tabla con los datos de nuestros usuarios, así que la vamos a crear. Ésta tabla contiene los siguientes campos:


Código

FIELD     | Type        | KEY | Extra        
----------+-------------+-----+----------------
 id        | tinyint(4)  | PRI | AUTO_INCREMENT 
 nombre    | text        |     |                
 apellidos | text        |     |                
 login     | varchar(40) |     |                
 password  | varchar(20) |     |                
 email     | text        |     |                 
 

Bien, pues la sentencia SQL que utilizaremos será algo así:


Código
CREATE TABLE usuarios (
id TINYINT(4) AUTO_INCREMENT,
nombre TEXT,
apellidos TEXT,
login VARCHAR(40),
password VARCHAR(20),
email TEXT,
UNIQUE (id) )

2.-Creando un script para introducir usuarios
Necesitamos el formulario, con los campos siguientes:

Código
<form action="crea_user.php" method="POST">
Login: <input type="text" name="login"><br>
Password: <input type="password" name="pass1"><br>
Repite Password: <input type="password" name="pass2"><br>
Nombre: <input type="text" name="nombre"><br>
Apellidos: <input type="text" name="apellidos"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit" name="Crear">
</form>

Y también el script crea_user.php, que sería algo así:
crea_user.php


Código
<?
$server="localhost"; /* Nuestro server mysql */
$database="bd"; /* Nuestra base de datos */
$dbpass="password"; /*Nuestro password mysql */
$dbuser="user"; /* Nuestro user mysql */
/* Primero comprovamos que no existe un usuario con el mismo login ya registrado */
 
$query="SELECT * FROM usuarios WHERE login='$login'";
$link=mysql_connect($server,$dbuser,$dbpass);
$result=mysql_db_query($database,$query,$link);
if(mysql_num_rows($result)){
echo "El usuario ya existe en la BD";
} else {
mysql_free_result($result);
/* Ahora comprovamos que los dos pass coinciden */
if($pass1!=$pass2) {
echo "Los passwords deben coincidir<br>";
echo 'Clica <a href="form.php">aquí</a> para volver al formulario';
} else {
$pass1=crypt($pass2, "semilla"); 
 
/* Encripatmos el password, con la clave "semilla" que debeis sustituirpor la que mas os guste. Hay otros metodos de encriptacion, mirad en php.net si quereis conocerlos. */
 
$query="INSERT INTO usuarios (login, nombre, apellidos, password, email) VALUES ('$login','$nombre','$apellidos','$pass1','$email')";
 
$result=mysql_db_query($database,$query,$link);
if(mysql_affected_rows($link)){
echo "Usuario introducido correctamente";
} else {
echo "Error introduciendo el usuario";
} /* Cierre del else */
} /* Cierre del else que corresponde a if(mysql_affected_rows.....) */
} /* Cierre del else que corresponde a if(mysql_num_rows...) */
?>

Pues como veis, este script es muy simple. Si no lo entendeis, es porque no conoceis PHP o su método de acceso a bases de datos mysql. Leeros el prólogo antes de continuar ;-) Aquí deberíamos comprobar que quien está creando los usuarios está identificado (en caso de que el registro no sea público).

3.- Creando la página y scripts de login
Ésta parte consiste en dos páginas, la de login, y el script que comprueba los datos. Aquí va la página de login:

login.php

Código
<?
session_start();
if(isset($SESSION)){
header("location: user.php"); /* Si ha iniciado la sesion, vamos a user.php */
} else { 
/* Cerramos la parte de codigo PHP porque vamos a escribir bastante HTML y nos será mas cómodo así que metiendo echo's */
?>
<html><head><title>Necesita identificación! </title></head>
<body>
<center><h1>Identificate! :D </h1></center>
<form action="comprueba.php" method="POST">
Login: <input type="text" name="login"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" value="Entrar">
</form>
</body></html>
<?
} /* Y cerramos el else */ 
?>
 

Y el que sigue es el script de comprobación, que comprobará los datos y si son correctos nos manda a user.php tras iniciar la sesión. Si no, nos dará un mensajito avisandonos de que no hemos dado el login correcto. Primero os explicaré las funciones que usaremos.

session_start() se debe usar al principio de cada script en el que vayamos a hacer uso de variables de sesión.

session_register("nombre_variable") se usará para crear una variable de sesión, que luego podremos usar con
el nombre $nombre_variable. Lo que haremos aquí será primero inicializar las variables como un array, y luego registrarlas en la sesión.

Ahora el código:

comprueba.php

Código
<?
session_start();
$server="localhost"; /* Nuestro server mysql */
$database="bd"; /* Nuestra base de datos */
$dbpass="password"; /*Nuestro password mysql */
$dbuser="user"; /* Nuestro user mysql */
$query="SELECT * FROM usuarios WHERE login='$login'";
$link=mysql_connect($server,$dbuser,$dbpass);
$result=mysql_db_query($database,$query,$link);
if(mysql_num_rows($result)==0){
echo "No existe el login introducido";
} else {
$array=mysql_fetch_array($result);
if($array["password"]==crypt($pass,"semilla") ){
/* Comprobamos que el password encriptado en la BD coincide con el password que nos han dado al encriptarlo. Recuerda usar la misma semilla para encriptar los dos passwords. */
$SESSION["login"]=$login;
$SESSION["nombre"]=$array["nombre"];
$SESSION["apellidos"]=$array["apellidos"];
session_register("SESSION");
header("location: user.php");
 
} else {
echo "Password incorrecto!";
} /* Cerramos este ultimo else */
} /* Cerramos el else que corresponde a la comprobación de que el login existe */
 
?>

4.- Creación de la página de los usuarios
Bien, ésta página la voy a dejar bastante vacía, solo va a comprobar si el usuario ya se ha identificado. Si es así, le daremos la bienvenida simplemente, y pondremos el botón para logout. Si no, le mandaremos a login.php. Ahí va el código:
user.php

Código
<?
session_start();
if(!isset($SESSION)){
header("location: login.php");
} else {
echo "<html><body>";
echo "Bienvenido ";
echo $SESSION["nombre"];
echo $SESSION["apellidos"]." ";
echo "<br>Has entrado con el nombre de usuario ";
echo $SESSION["login"];
echo "<br>Para cerrar la sesión, pulsa: <a href='logout.php'>logout</a>";
echo "</body></html>";
}
?>
 

5.- Cerrando la sesión
En el script logout.php simplemente cerraremos la sesión y mostraremos un mensaje indicando que ha
sido cerrada correctamente. Antes de ésto, comprovaremos que ha sido iniciada la sesión. Si no lo ha sido, mandaremos al usuario a login.php. Aquí usaremos dos funciones nuevas:

session_unset() destruye todas las variables de sesión que hemos creado. Debemos llamarla antes de llamar a
session_destroy.
session_destroy() destruye la sesión en sí, pero no destruye las variables.

Ahora sí, aquí os dejo el código:

Código
<?
session_start();
if(!isset($SESSION)){
header("location: login.php");
} else {
session_unset();
session_destroy();
echo "Las variables de sesión han sido eliminadas, y la sesión se ha dado por finalizada correctamente ;-)";
}
?>

Simple verdad? Pues ya tenemos nuestro sistema de usuarios completo!

ALERTA!: En éstos scripts hay algunas cosillas que tendremos que mejorar.
Por ejemplo, hay que mejorar el manejo de errores de la base de datos. Además, deberíamos incluir redirecciones hacia login.php tras mostrar los mensajes de logout, de error al identificarse (tanto de login incorrecto como de password incorrecto), que lo podríamos hacer con un refresh simple en HTML.

Además de todo ésto, tendríamos que crear un filtro para los datos introducidos en el login para evitar la inyección SQL en nuestras páginas. Para el password no sería necesario, puesto que hemos encriptado la entrada del usuario antes de pasarsela al MySQL, pero tampoco pasaría nada si, una vez implementado el filtro, se lo pasamos al password introducido por el usuario.

Upload (Subir) de archivos con php a la Web

Muchas veces necesitamos hacer uploads de archivos en nuestros proyectos para muchos es algo sencillo pero para los que recién empiezan les explicare como se realiza el proceso. Este upload lo haremos utilizando php.
upload-php.gif
El primer paso es crear un formulario en el cual se seleccione el archivo a subir, para ello utilizaremos el tag input del tipo file, además hay que tener en cuenta que hay que seleccionar el tipo de encoding para el formulario el cual es: multipart/form-data.
HTML:

  1. <form action="upload.php" method="post" enctype="multipart/form-data">


  2. <input name="archivo" type="file"
    size="35" />



  3. <input name="enviar" type="submit" value="Upload
    File"
    />



  4. <input name="action" type="hidden" value="upload" />   


  5. </form>

Luego en la página upload.php que es que se encarga de recibir los datos del formulario (Lo definimos en la propiedad action del formulario). El archivo seleccionado es subido temporalmente a una carpeta, entonces tenemos que copiar el archivo a la carpeta final, en caso contrario este archivo se eliminará automáticamente.
Para acceder a las propiedades del archivo php nos brinda el array $_FILES con las siguientes propiedades, en donde archivo es el nombre del campo con el cual se envió el archivo desde el formulario:
  • $_FILES['archivo']['size']: tamaño en bytes del archivo recibido
  • $_FILES['archivo']['type']: tipo mime del archivo, por ejemplo image/gif
  • $_FILES['archivo']['name']: nombre original del archivo
  • $_FILES['archivo']['tmp_name']: nombre del archivo temporal que se utiliza para almacenar en el servidor el archivo recibido
Algo que hago siempre es anteponer 6 caracteres aleatorios antes del nombre del archivo, esto para evitar duplicidad de nombres de los archivos.
PHP:

  1. $status = "";


  2. if ($_POST["action"] == "upload") {



  3.   // obtenemos los datos del archivo



  4.   $tamano = $_FILES["archivo"]['size'];



  5.   $tipo = $_FILES["archivo"]['type'];


  6.   $archivo = $_FILES["archivo"]['name'];



  7.   $prefijo = substr(md5(uniqid(rand())),0,6);





  8.   if ($archivo != "") {


  9.      // guardamos el archivo a la carpeta files



  10.       $destino = "files/".$prefijo."_".$archivo;



  11.       if (copy($_FILES['archivo']['tmp_name'],$destino)) {



  12.           $status= "Archivo subido: <b>".$archivo."</b>";


  13.         }else {



  14.           $status= "Error al subir el archivo";



  15.       }



  16.   } else {



  17.       $status = "Error al subir archivo";


  18.   }


  19. }
Todos los archivos se copiarán a la carpeta /files por que así lo definimos a la hora de copiar el archivo. Hay que tener en cuenta que la carpeta a donde se copiarán los archivos deben tener permisos de escritura en caso contrario se devolverá un error.
Ahora si tienes un hosting deberás cambiar los permisos, esto se hace comúnmente con un cliente de FTP que utilizas para subir tus archivos al hosting. Por ejemplo yo utilizo el FlashFXP como cliente de FTP y hay una opción llamada Atributes (CHMOD) para cambiar los permisos como se muestra en la siguiente imagen.
chmod-hosting.gif
En nuestro ejemplo no hemos utilizado las propiedades size y type, pero ustedes la pueden usar para restringir a un máximo de tamaño de archivo o restringir a cierto tipo de archivos por ejemplo solo permitir subir imágenes. Para finalizar, hemos agregado estilos a nuestra página creada y además hemos listado los archivos subidos a la carpeta files. Pueden ver el resultado final del ejemplo además de ellos les dejo los archivo fuente para que lo descarguen.

Manejo de Fechas en PHP