jueves, 18 de septiembre de 2014

[Parte 7] PHP

Cookies y Sesiones

Http es un protocolo sin estado por lo cual no puede identificar que usuario es cual, ni darle seguimiento. En PHP existen dos herramientas para este proposito las cookies y las sesiones, con las cuales podemos identificar al usuario y darle seguimiento.

Las diferencias entre las cookies y las sesiones es que las cookies se guardan en el navegador del cliente y las sesiones se guardan en el servidor. Las sesiones son generalmente mas seguras que las cookies y pueden almacenar mucha mas informacion. Ambas son tecnologias faciles de utilizar usando PHP para demostrarlo crearemos un sistema de inicio de sesion.

Crear una pagina de inicio de sesion

El proceso de inicio de sesion envuelve algunos componentes:

* Un formulario envia la informacion de inicio de sesion
* Una rutina de validacion se asegura de que los datos necesarios se han enviado
* Una consulta a la base de datos compara que la informacion enviada sea igual a la informacion almacenada en la base de datos
* Las cookies o sesiones son almacenadas reflejando un inicio de sesion correcto

Subsecuente a esto las paginas pueden tener una restriccion por la cual solo se mostraran a usuarios que hayan iniciado sesion, en las cuales pueden agregar caracteristicas especiales.

Crearemos varios archivos rompiendo la logica y haciendola mas facil para que nuestro codigo sea mas facil de escribir y leer y tenga menos redundancia. El script va contener la pagina de inicio de sesion, la cabecera, el reporte de errores, el formulario y el pie de pagina.

Creamos la pagina de inicio de sesion:

login _page.inc.php



<?php
 # Esta pagina imprime cualquier error y esta asociado con la pagina de inicio
 # Y crea la pagina de inicio de sesion entera, incluyendo el formulario.

 # incluir la cabecera
 $page_title = 'Inicio de sesion';
 include('includes/header.html');

 # Imprime cualquier mensaje de error, si existe:
 if (isset($errors) && !empty($errors)) {
   echo '<h1>Error!</h1>
   <p class="error">Los siguientes errores han ocurrido:<br />';
   foreach ($errors as $msg) {
    echo "- $msg<br />\n";
   }
   echo "</p><p>Por favor intente de nuevo.</p>";
  } 

  # Mostrar el formulario:
?>
<h1>Iniciar sesion</h1>
<form action="login.php" method="post">
 <p>Correo electronico: <input type="text" name="email" size="20" maxlength="60" /></p>
 <p>Clave: <input type="password" name="pass" size="20" maxlength="20" /></p>
 <p><input type="submit" name="submit" value="Iniciar sesion!" /></p>
</form>
<?php 
 include('includes/footer.html');
?>


1.- Incluimos el header.html y el titulo al inicio (el header.html lo veremos mas adelante)

2.- Si ocurre algun error imprimimos el error recorriendolo con foreach
3.- Mostramos el formulario
4.- Incluimos footer.html

Nota: estamos utilizando .inc.php para los archivos que iran dentro de otros archivos (seran incluidos), y tambien crearemos una carpeta llamada includes/ donde se encontraran cada uno de ellos.

En el proceso de la creacion de la pagina de inicio de sesion, hay 2 cosas que se repiten, las cuales son :

- Verificacion de correo electronico y clave en la base de datos
- Redirecciones

Es por eso que para comenzar crearemos un script php con el cual evitaremos la redundancia del codigo, nuestro script se llamara login_functions.inc.php:


<?php
 # Esta pagina define dos funciones usadas para el inicio y cierre de sesion
 /*
  Esta funcion determina la URL absoluta y redirige al usuario
  * Esta funcion toma un argumento para que sea redirigido
  * El argumento por defecto es index.php
 */
 function redirect_user ($page = 'index.php'){
  // comienza definiendo la url
  // la url es http:// agregando el nombre del host y el directorio actual
  $url = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);

  // remueve cualquier barra invertida
  $url = rtrim($url,'/\\');

  // Agrega la pagina:
  $url .= '/' . $page;

  // Redirige al usuario:

  header("Location: $url");
  exit(); // Quita el script
 } // Fin de la funcion redirect_user()

 /*
  Esta funcion valida los datos del formulario (el correo electronico y la clave).
  * Si ambos estan presentes, la base de datos es consultada
  * La funcion requiere coneccion a la base de datos
  * La funcion devuelve un arrat de informacion, incluyendo:
   -  Una variable TRUE/FALSE que indica si fue correcto
   - Un array para los errores o resultados de la base de datos
 */
 function check_login($dbc,$email='',$pass=''){
  $errors = array(); // Inicializamos un array de errores

  // Validamos el correo electronico
  if (empty($email)) {
   $errors[] = 'Olvidastes poner el correo electronico';
  }else{
   $e = mysqli_real_escape_string($dbc,trim($email));
  }
  // Validamos la clave
  if (empty($pass)) {
   $errors[] = 'Olvidastes poner la clave';
  }else{
   $p = mysqli_real_escape_string($dbc,trim($pass));
  }

  if(empty($errors)){
   // Si todo esta bien
   // Devolvemos el id de usuario, el primer nombre de usuario con la combinacion de
   // correo electronico/clave

   $q = "SELECT user_id, first_name FROM login WHERE email='$e' AND pass=SHA1('$p')";
   $r = @mysqli_query($dbc,$q);
   // Correr la consulta
   // verificamos el resultado

   if (mysqli_num_rows($r) == 1) {
    // devolvemos los registros
    $row = mysqli_fetch_array($r,MYSQLI_ASSOC);
    // devuelve true y los registros:
    return array(true,$row);

   }else{ // No coincide
    $errors[] = 'El correo electronico y la clave no coinciden con el archivo';
   }
  } // final de si empty($errors)
  // devuelve falso y los errores:
  return array(false,$errors);
 } // final de la funcion check_login().
?>

Explicando un poco el codigo:

La primera funcion:

1.- Creamos una funcion redirect_user() con la cual podemos redirigir a los usuarios a la pagina que le demos como parametro, pero por defecto es index.php

2.- Creamos la variable $url la cual contiene, primero agregamos el http:// por si nos encontramos en localhost, despues el host seria la url actual, al final agregamos el directorio actual del archivo donde nos encontramos con PHP _SELF.

3.- Removemos las barras

4.- Agregamos la pagina que le dimos para redirigir a la variable $url

5.- Redirigimos a la $url final con header()

6.- Paramos el script con exit()

La segunda funcion:

1.- Se crea la funcion check_login() que lleva tres argumentos, la coneccion a la base de datos, el correo electronico (este es opcional) y la clave (tambien es opcional).

2.- Validamos el correo y la clave, si algun problema ocurre mostrara los errores.

3.- Verificamos que el correo y la clave sea correcta esto lo hacemos de manera que si arroja 1 resultado significa que lo es. Luego devolvemos el resultado en un array como verdadero.

4.- Si el resultado no es correcto devolvemos el array en falso y el inicio de sesion fallará.


Usando Cookies

Las cookies es una forma de que el servidor guarde informacion en la maquina del usuario. Esta es una forma de que el servidor recuerde o siga al usuario. Piensa que la cookie es como un identificador personal, en la cual tu llamas al servidor con tu nombre y el te da una identificacion (pasé o pulsera). Entonces con eso ya sabe a quien se esta refiriendo. En este apartado veremos como establecer una cookie, devolver informacion almacenada por la cookie, alterar la configuracion de la cookie, y tambien eliminar la cookie.


Establecer cookies

La cosa mas importante para aprender acerca de las cookies es que ellas son enviadas desde el servidor hasta el cliente antes que cualquier otra informacion. Ya que si envias una cookie despues esto causaria un error. Incluso si es un espacio en blanco.

Las cookies se envian con la funcion setcookie():

setcookie('nombre','valor');

setcookie('nombre','arthusu');


Como ves esto enviaria una cookie al navegador de nombre le pusimos nombre (valga la redundancia) y de valor le pusimos arthusu. De igual manera si quisieramos agregar mas cookies solamente las seguimos estableciendo con la misma funcion:

setcookie('ID',250);
setcookie('email','arthusu@gmail.com');

Es recomendable no utilizar espacios ni puntuaciones en el nombre establecido.

Veamos como establecer una cookie utilizando todo el codigo del ejemplo anterior...

login.php


<?php
 // esta pagina procesa el formulario de inicio de sesion
 // si el inicio de sesion es correcto, el usuario es redirigido
 // tenemos que incluir dos archivos necesarios
 // no enviamos nada al navegador antes de las lineas setcookie()

 // checamos si el formulario ha sido enviado:
 
 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  // para procesar el inicio de sesion
  require('includes/login_functions.inc.php');

  // necesitamos la coneccion a la base de datos:
  require('../mysqli_connect.php');

  // verificamos el inicio de sesion:
  list($check,$data) = check_login($dbc,$_POST['email'],$_POST['pass']);
  if ($check) { //OK
   setcookie('user_id',$data['user_id']);
   setcookie('first_name',$data['first_name']);

   // redirigimos
   redirect_user('loggedin.php');
  }else{ // No es correcto
   // asignamos a $data para $errors para que nos muestre los errores
   // en el archivo login_page.inc.php
   $errors = $data;
  }

  mysqli_close($dbc); // cerramos la coneccion a la base de datos
 } // aqui termina la condicional principal
 
 // creamos la pagina:
 include('includes/login_page.inc.php');

?>


Explicando el codigo anterior:

1.- Creamos la pagina login.php que requiere de los dos archivos que creamos anteriormente para poder funcionar.

2.- Verificamos que el formulario haya sido enviado y si es asi, entonces agregamos dos script el de las funciones por que lo necesitaremos y el de la coneccion a la base de datos, de forma que verificaremos el inicio de sesion y ademas enviaremos las cookies.

Antes de seguir agregare el codigo de los demas archivos que nos faltan para poder seguir trabajando con nuestros scripts:

1.- Vamos a crear la base de datos la cual llamaremos "usuarios", esto lo hacemos ingresando a phpmyadmin:
http://localhost/phpmyadmin/

2.- Donde dice crear nueva base de datos, colocamos y nombre y le damos crear.

3.- Creamos una nueva tabla dentro que se va llamar login, en la cual agregaremos 5 campos los cuales seran:

* user_id (int not null autoincrement primary key)
* first_name (varchar 70 not null)
* last_name (varchar 70 not null)
* email (varchar 20 not null)
* password (varchar 40 not null)



4.- Insertamos un nuevo registro dando clic en insertar, ahi llenamos los datos, en mi caso puse lo siguiente :

user_ id : 1first_name:  arthusulast _name:  xdemail: arthusu@gmail.compassword: utilize la funcion sha1 y puse clave 123

El archivo php para la coneccion a la base de datos la tenemos fuera del directorio publico de manera que nadie mas lo podra ver a menos que tengan permisos:

mysqli_connect.php


<?php
 
 // Este archivo contiene acceso a la informacion de la base de datos
 // Esta archivo tambien establece coneccion con MySQL
 // selecciona la base de datos, y establece una codificacion

 
 // establecemos la informacion en constantes:
 define('DB_USER', 'tusuario');
 define('DB_PASSWORD', 'tucontraseña');
 define('DB_HOST', 'localhost');
 define('DB_NAME', 'usuarios');

 // creamos una coneccion:
 $dbc = @mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) OR die('No se pudo conectar a MySQL: '.mysqli_connect_error());

 // esablecemos la codificacion:
 mysqli_set_charset($dbc,'utf-8');
?>

En el codigo del archivo anterior definimos en constantes los datos para una coneccion, con mysqli_connect() establecemos una coneccion con la base de datos con mysqli_set_charset() establecemos una codificacion para la base de datos.


El archivo header y footer son los siguientes: 

header.html


<!DOCTYPE html>
<html>
<head>
 <title><?php echo $page_title; ?></title>
 <link rel="stylesheet" href="includes/styles.css" type="text/css" media="screen" />
 <meta http-equiv="content-type" content="text/html;charset=utf8" />
</head>
<body>
 <header>
  <h1>Tu sitio web</h1>
  <h2>Tu slogan...</h2>
 </header>
 <nav>
  <ul>
   <li><a href="#">Inicio</a></li>
   <li><a href="#">...</a></li>
   <li><a href="#">...</a></li>
   <li><a href="#">...</a></li>
   <li><a href="#">...</a></li>
  </ul>
 </nav>



footer.html
 <footer>
  <p><b>Copyright 2014</b></p>
 </footer>
</body>
</html>


Ya terminado nuestro codigo para continuar con la explicacion con el codigo de las cookies, por cierto el estilo no se ha agregado, esto lo veremos mas adelante...

3.- Validamos los datos enviando estableciendo la coneccion a la base de datos, y los datos que se pasan que estan en el formulario. Como en la funcion check_login() devolvemos un array entonces lo recojemos en variables utilizando la funcion list(). De esta manera sabremos si el login es correcto o no, y asi poder utilizar los datos.

4.- Si el inicio de sesion es correcto, establecemos las cookies user_id y first_name para ello utilizaremos los datos de la base de datos arrojados por la funcion check_login(). Y haremos una redireccion a un archivo que todavia no existe llamado loggedin.php

5.- Si el inicio de sesion no es correcto arrojamos los errores.

6.- Cerramos la base de datos utilizando mysqli_close(). Incluimos el archivo que contiene nuestro formulario.


De todas formas aunque el archivo loggedin.php no exista en los navegadores podemos ver como las cookies se han establecido correctamente:



Algunas notas importantes sobre las cookies es que estan limitadas a 4KB y que cada navegador recuerda un numero limitado de cookies para cada sitio. Los mayoria de los navegadores actuales soportan hasta 50 cookies por sitio. La funcion setcookie() es una de las pocas funciones en php que podria tener diferentes resultados en diferentes navegadores, desde cada navegador las cookies son tratadas de diferente manera. Para estar seguros podemos probar nuestro sitio web en diferentes navegadores y diferentes plataformas.

Accediendo a las cookies

Para devolver una valor desde la cookie, tu solo debes referirte al array superglobal $_COOKIE, usando apropiadamente el nombre de la cookie como clave, por ejemplo para devolver el valor de una cookie establecida:


setcookie('username','arthusu');

tu puedes referirte a ella como $_COOKIE['username']




<?php
 // el usuario es redirigido aqui desde login.php
 
 // si la cookie no esta presente, redirigimos al usuario
 if (!isset($_COOKIE['user_id'])) {
  // necesitamos las funciones
  require('includes/login_functions.inc.php');
  redirect_user();
 }

 // establecemos el titulo de la pagina en la cabecera html
 $page_title = 'Sesion iniciada';
 include('includes/header.html');

 // mostramos un mensaje personalizado

 echo "<h1>Sesion iniciada correctamente</h1>
 <p>Tu sesion esta iniciada como, {$_COOKIE['first_name']}!
 <a href=\"logout.php\">Salir</a></p>";

 include('includes/footer.html');
?>

1.- verificamos si existe la cookie, en caso de no existir redirigimos al inicio de la pagina. Antes para ello es necesario agregar donde se encuentran las funciones para llamar a la pagina y redirigir.

2.- Si el inicio de sesion es correcto, creamos una variable con el titulo e incluimos el header.html el cual contiene un codigo para nuestra variable. Despues de eso mostramos un mensaje de bienvenida con el nombre del usuario haciendo referencia a el con el array superglobal $_COOKIE.

3.- Creamos un enlace de Salida (logout.php) que mas adelante veremos como crear.

Estableciendo parametros a las cookies

Nosotros solo hemos pasado el nombre y el valor como parametros en la funcion setcookie(), pero hay otros argumentos disponibles que puede tomar y cada uno altera la definicion de la cookie.


setcookie(nombre,valor,expiracion,ruta,servidor,secure,httponly)

El argumento expiracion es usado para establecer el tiempo de duracion para que una cookie exista. Este tiempo se especifica en segundos. Si este valor se deja en 0 no se especifica nada y la cookie es eliminada hasta que el navegador es cerrado. Podremos agregar un tiempo de expiracion especifico utilizando la funcion time(), por ejemplo si quisieramos agregar 30 minutos en tiempo de expiracion de la cookie seria de la siguiente manera:


setcookie(nombre,valor,time()+1800);

Donde 1800 es el tiempo en segundos.
La ruta y el servidor son usados para limitar la cookie a una ruta especificada o servidor, por ejemplo: www.ejemplo.com o 192.168.0.1. Y en la ruta por ejemplo si tu quieres que esa cookie solo exista en la ruta del administrador admin/ se la especificas ahi mismo.
Si nosotros establecemos en la ruta / se podra usar la cookie en todo el sitio, y si ponemos en el servidor .ejemplo.com se puede usar la cookie en todo el sitio y subdominios.

El valor secure dice que la cookie solo puede ser enviada por conecciones seguras https. Con 1 la activamos y con 0 dejamos la coneccion estandar. En caso de que tu sitio tenga activado https puedes activar para que las cookies sean seguras estableciendo el valor 1.


setcookie(nombre,valor,expiracion,ruta,servidor,1);
En la version de php 5.2 fue agregado el argumento httponly. Este es un valor Booleano que es usado para crear una cookie accesible mediante HTTP (y HTTPS). Reforzando la restriccion de la cookie haciendola mas segura (ante intentos de hackers) pero no es soportada por todos los navegadores. 


setcookie(nombre,valor,expiracion,ruta,servidor,secure,TRUE);

Como la mayoria de las funciones en setcookie() para no establecer ninguna valor a alguno de los parametros solo es necesario utilizar NULL, 0 o una cadena vacia (No usar FALSE). La expiracion y secure ambos son valores enteros por lo cuales no deben ir entre comillas. 

Vamos a demostrar todo lo visto en el script anterior modificando la cookie haciendo que expire en 1 hora.

Abrimos el archivo login.php y le agregamos lo siguiente:


setcookie('user_id',$data['user_id'],time()+3600,'/','',0,0);setcookie('first_name',$data['first_name'],time()+3600,'/','',0,0);




<?php
 // esta pagina procesa el formulario de inicio de sesion
 // si el inicio de sesion es correcto, el usuario es redirigido
 // tenemos que incluir dos archivos necesarios
 // no enviamos nada al navegador antes de las lineas setcookie()

 // checamos si el formulario ha sido enviado:
 
 if ($_SERVER['REQUEST_METHOD'] == 'POST') {

  // para procesar el inicio de sesion
  require('includes/login_functions.inc.php');

  // necesitamos la coneccion a la base de datos:
  require('../mysqli_connect.php');

  // verificamos el inicio de sesion:

  list($check,$data) = check_login($dbc,$_POST['email'],$_POST['pass']);
  if ($check) { //OK
   setcookie('user_id',$data['user_id'],time()+3600,'/','',0,0);
   setcookie('first_name',$data['first_name'],time()+3600,'/','',0,0);

   // redirigimos
   redirect_user('loggedin.php');
  }else{ // No es correcto
   // asignamos a $data para $errors para que nos muestre los errores
   // en el archivo login_page.inc.php
   $errors = $data;
  }

  mysqli_close($dbc); // cerramos la coneccion a la base de datos
 } // aqui termina la condicional principal
 
 // creamos la pagina:
 include('includes/login_page.inc.php');

?>


Para sacar los segundos es tan facil como multiplicar 60 minutos que es una hora por 60 segundos que es 1 minuto.


Eliminar las cookies

Lo ultimo para terminar de saber como se usan las cookies es eliminar una. Ya sabemos que hay cookies que tienen un tiempo de expiracion pero incluso si tu quisieras simplemente salir de alguna pagina y que tu sesion ya no este iniciada por alguna razon podrias cerrar tu sesion eliminado la cookie.

Para eliminar la cookie solo es necesario el nombre, el valor dejarlo vacio y el tiempo de expiracion ponerlo hacia atras el tiempo que le hayas dado. Un ejemplo para eliminar la cookie first_name:


setcookie('first_name','',time()-3600);
Para que todo esto quede mas claro vamos a crear nuestra pagina de logout.php:



<?php
 // esta pagina deja al usuario cerrar sesion
 // si la cookie no esta presente, redirige al usuario:

 if (!isset($_COOKIE['user_id'])) {
  // necesitamos las funciones
  require('includes/login_functions.inc.php');
  redirect_user();
 }else{
  // Eliminamos las cookies:
  setcookie('user_id','',time()-3600,'/','',0,0);
  setcookie('first_name','',time()-3600,'/','',0,0);
 }
 // Establecemos un titulo a la pagina
 $page_title = 'Cerrar sesion';
 include('includes/header.html');

 // Imprimimos un mensaje personalizado

 echo "<h1>Cierre de sesion!</h1>
 <p>Tu cesion ha sido cerrada correctamente, {$_COOKIE['first_name']}</p>";

 include('includes/footer.html');
?>


Usando sesiones

Otro metodo para crear datos disponibles en multiples paginas de un sitio web es utilizar sesiones. La premisa de una sesion es que los datos son almacenados en el servidor, no en el navegador web, y el identificador de sesion es usado para identificar a un usuario en particular (datos de sesion). Este identificador de sesion es almacenado en el navegador comunmente cuando utilizamos cookies, pero los datos son sensibles, como el ID de usuario, el nombre y demas, por eso los datos siempre deben de mantenerse en el servidor.

La pregunta surge aqui: ¿para que usamos sesiones si podemos usar cookies y funcionan correctamente? primero que todo, las sesiones son mas seguras al almacenar los datos en el servidor,y no continua enviando atras y adelante entre servidor y cliente. En segunda tu puedes guardar mas datos en las sesiones. En tercera algunos usuarios rechazan las cookies o simplemente las mantienen apagadas. Mientras que las sesiones estan diseñadas para trabajar con cookies pueden funcionar sin ellas, tambien.

Para demostrar las sesiones y compararlas con las cookies, reescribiremos los scripts creados anteriormente...

Estableciendo sesiones

La mas importante regla respecto a las sesiones es que cada pagina que vayan a llamarlas deben usar la funcion session_start() al comienzo. Esta funcion es llamada en PHP ya sea cuando comienzas una nueva sesion o accedes a una existente. Esta funcion debe ser llamada antes que cualquier cosa sea enviada al navegador.
La primera vez que esta funcion es usada, session_start() intentara enviar una cookie con el nombre PHPSESSID (nombre por defecto de una sesion) y un valor parecido al este 7d9d0e1d7a8e37f6feb9967ac0a5b445 (32 letras hexadecimales, ID de sesion). El por que de este intento para enviar la cookie, session_start() es enviada antes que cualquier dato sea enviado al naveador web, hasta ese caso nosotros podemos usar las funciones setcookie() y header().

Incluso si la sesion ya ha comenzado, los valores pueden ser registrados para la sesion usando la sintaxis normal del array, usando el array superglobal $_SESSION.

1.- abrimos el archivo login.php y reemplazamos las lineas de setcookie() por el siguiente codigo:

session_start();
$_SESSION['user_id'] = $data['user_id'];
$_SESSION['first_name'] = $data['first_name'];
El primer paso para comenzar la sesion. Es que no debe de haber ninguna declaracion echo, inclusion de archivos HTML o espacios en blanco. Para que la funcion session_start() este segura, tambien podriamos ponerla al inicio de todo el script, nuestro array $_SESSION tiene dos pares de claves con sus valores, first_name y user_id.


<?php
 // esta pagina procesa el formulario de inicio de sesion
 // si el inicio de sesion es correcto, el usuario es redirigido
 // tenemos que incluir dos archivos necesarios
 // no enviamos nada al navegador antes de las lineas setcookie()

 // checamos si el formulario ha sido enviado:
 
 if ($_SERVER['REQUEST_METHOD'] == 'POST') {

  // para procesar el inicio de sesion
  require('includes/login_functions.inc.php');

  // necesitamos la coneccion a la base de datos:
  require('../mysqli_connect.php');

  // verificamos el inicio de sesion:

  list($check,$data) = check_login($dbc,$_POST['email'],$_POST['pass']);
  if ($check) { //OK
   session_start();
   $_SESSION['user_id'] = $data['user_id'];
   $_SESSION['first_name'] = $data['first_name'];
   // redirigimos
   redirect_user('loggedin.php');
  }else{ // No es correcto
   // asignamos a $data para $errors para que nos muestre los errores
   // en el archivo login_page.inc.php
   $errors = $data;
  }

  mysqli_close($dbc); // cerramos la coneccion a la base de datos
 } // aqui termina la condicional principal
 
 // creamos la pagina:
 include('includes/login_page.inc.php');

?>

Obviamente el script loggedin.php debe ser modificado ya que esta esperando la precencia de una cookie.

Tips:

Puedes establecer session.auto_start a 1 en el archivo php.ini de esta manera no es necesario agregar session_start() en cada pagina. Aunque esto tambien hace que el servidor este enviando sesion nueva cada vez y solo debe utilizarse cuando sea realmente necesario.



Accediendo a las sesiones

Incluso las sesiones que ya han sido creadas y las variables que ya han sido registradas, tu puedes acceder desde otros scripts a estas variables, esto lo podemos hacer con cada script iniciando la sesion con session_start().

Esta funcion nos da acceso a la sesion anteriormente almacenada (puede leer el PHPSESSID almacenado en la cookie) o crear una nueva sesion si no esta creada. Comprendiendo que si el ID de sesion no es encontrado y un nuevo ID de sesion es generado, ninguno de los datos almacenados en el ID de sesion viejo estaran disponibles. Lo mencionado aqui puede causarte problemas con sesiones, para verificar el valor de el ID de la sesion podemos verlo en una pagina con el paso a debugear.

Asumiendo que no tienes problemas con la sesion, nos referimos a la variable de la sesion, usando $_SESSION['var'], tu podrias referirte a cualquier otro array. 

1.- abrimos el archivo loggedin.php y agregamos al inicio session_start() que debe ser llamada antes que header.html.

2.- reemplazamos $_COOKIE por $_SESSION y guardamos el archivo.






<?php
 // iniciamos la sesion
 session_start();
 // el usuario es redirigido aqui desde login.php
 
 // si la cookie no esta presente, redirigimos al usuario
 if (!isset($_SESSION['user_id'])) {
  // necesitamos las funciones
  require('includes/login_functions.inc.php');
  redirect_user();
 }

 // establecemos el titulo de la pagina en la cabecera html
 $page_title = 'Sesion iniciada';
 include('includes/header.html');

 // mostramos un mensaje personalizado

 echo "<h1>Sesion iniciada correctamente</h1>
 <p>Tu sesion esta iniciada como, {$_SESSION['first_name']}!
 <a href=\"logout.php\">Salir</a></p>";

 include('includes/footer.html');
?>

Tips:

Recuerda que como ya dijimos, si en tu aplicacion no ves los datos de sesion en otra pagina, esto puede ser por que se ha creado una nueva sesion en otra pagina. Para verificar esto podemos comprobar el ID de sesion (mirando los ultimos caracteres comprobando si son iguales) tambien puedes ver el ID de sesion utilizando la funcion session_id():

echo session_id();

Eliminando sesiones

Cuando utilizamos sesiones usted debe de tener un metodo para poder eliminarlas, esto es necesario para que el usuario cierre sesion. 
Para eliminar una variable de sesion individual podemos utilizar la funcion unset() que es valida para cualquier variable:

 unset($_SESSION['var'])

Para eliminar cualquier variable de la sesion tu no deberias utilizar unset() sino reestablecer la sesion de la siguiente manera:

$_SESSION = array();

Y finalizamos borrando cualquier dato de sesion en el servidor utilizando la funcion session_destroy():

session_destroy();
Nota que la prioridad para utilizar cualquiera de estos metodos es siempre iniciar session_start(), para que los datos de sesion sean recogidos.

1.- abrimos el archivo logout.php
2.- agregamos al inicio del archivo session_start();
3.- Cambiamos la condicional en lugar de $_COOKIE usamos $_SESSION
4.- reemplazamos las lineas de setcookie() por $_SESSION = array(); session_destroy(); y eliminamos del mensaje de cerrado de sesion {$_COOKIE['first_name']}:


<?php

 // iniciamos sesion
 session_start();

 // esta pagina deja al usuario cerrar sesion
 // si la cookie no esta presente, redirige al usuario:

 if (!isset($_SESSION['user_id'])) {
  // necesitamos las funciones
  require('includes/login_functions.inc.php');
  redirect_user();
 }else{
  // Eliminamos las cookies:
  $_SESSION = array();
  session_destroy();
 }
 // Establecemos un titulo a la pagina
 $page_title = 'Cerrar sesion';
 include('includes/header.html');

 // Imprimimos un mensaje personalizado

 echo "<h1>Cierre de sesion!</h1>
 <p>Tu cesion ha sido cerrada correctamente</p>";

 include('includes/footer.html');
?>

Hasta aqui termina la septima parte de PHP, nos vemos en la proxima parte :).

No hay comentarios:

Publicar un comentario