6.- Sesiones

Cómo hemos visto, las cookies no nos sirven para guardar grandes cantidades de información, además las cookies tienen mala imagen, por lo que muchos usuarios las desactivan.

Las sesiones solucionan este problema. En lugar de guardar los datos como cookies en el navegador, las sesiones permiten guardar la información en el servidor. Lo único que se guarda en el navegador es una cookie que contiene el id de sesión del usuario: una variable que php vigila en todas las páginas y que utiliza para cargar los datos asociados a esa sesión.

A menos que sea configurado de otra manera, las sesiones funcionan estableciendo automáticamente una cookie en el navegador del usuario que contiene la id de la sesión: una cadena de texto y números que identifica al usuario durante toda la duración de su visita en el site. El navegador manda esta cookie al solicitar cualquier página en el servidor. Utilizando una serie de archivos temporales que se guardan en el servidor, PHP puede hacer un seguimiento de las variables registradas en cada sesión y sus valores.

Una de las ventajas de las sesiones de php es que siguen funcionando aunque las cookies estén desactivadas. Cuando php detecta que las cookies no están activadas, añade automáticamente la id de sesión como una query string en todos los enlaces de la página. Para que esto funcione hay que cumplir dos requisitos:

  • todas las páginas de site tienen que tener la extensión php, pues de lo contrario php no puede añadir la id sesión a páginas que no sean php.
  • Además es necesario que session.use_trans_sid esté activado en en php.ini

Cómo configurar php.ini para que funcionen las sesiones

Si tienes la página alojada en un servidor externo, lo más probable es que esto ya esté así configurado. Si tienes tu propio servidor tendrás que asegurarte de que está bien configurado.

Abre php.ini en un editor de textos y busca la sección [session] encontrarás unas 20 opciones que empiezan con la palabra session, tenemos que verificar los siguientes:


session.save_handler = files
session.save_path = C:\WINDOWS\TEMP
session.use_cookies = 1
session.use_trans_sid = 1

session.save_path establece dónde se van a guardar los archivos temporales para seguir las sesiones. Debe ser un directorio que exista en el servidor, si el directorio no existe el directorio nos dará errores. En Unix se suele utilizar /tmp. En windows podría ser C:\WINDOWS\TEMP o D:\PHP\SESIONES. Una vez hechos todas las modificaciones necesarias hay que reiniciar el servidor.

  • Para utilizar una sesión existente o crear una nueva: session_start(). Cómo utiliza cookies hay que llamar a la función antes de envíar ningún contenido a la página.
  • Para guardar variables en las sesiones y poder utilizarlas en otros scripts utilizamos la función session_register($pass); Para quitar una variable de la sesión session_unregister($pass);
  • Para terminar la sesión, y todas las variables asociadas: session_destroy();

Vamos a ver cómo montaríamos un carrito de la compra

Vamos a crear dos scripts:

  1. Un catálogo de productos en el que podremos ir añadiendo productos (catalogo.php)
  2. Una página de salida, que muestra los contenidos del carrito para confirmación (carrito.php).

Desde la página de confirmación, podríamos enviar el pedido a un sistema que lo procesara y se ocupara del pago y del envío de los productos.

Empecemos con el catálogo

El ejemplo que vamos a ver de utilización de las sesiones está basado en el libro de Kevin Yank: “Build your Own Database Driven Website using php y Mysql”. Las modificaciones son debidas a que mi estilo de hacer algunas cosas es distinto, pero por lo demás es igual. Si queréis aprender es un libro excelente.

catalogo.php

<?php
$carrito = array();
session_start();
session_register('carrito');
if($comprar != "")
{
//añadir un producto al final del array $carrito
$carrito[] = $comprar;
header("Location: $PHP_SELF?".SID);
exit();
}
?>
<html>
<head>
<title>Catálogo de productos</title>
</head>
<body>
Tienes en el carrito de la compra: <?php echo count($carrito); ?> productos.
<p> <a href="carrito.php" title="Ver el carrito"> Mira lo que tienes el carrito</a>
<?php
$productos = array ("Dicionario", "Calculadora", "Pluma Montblanc", "Zapatos de ante azul", "pantalones verdes");

$precios = array("20", "50", "2000", "200", "50");
?>

<table border="1">
<tr>
<th> Descripción  del producto</th>
<th> Precio</th>
</tr>

<?php
for($i =0; $i < count($productos); $i++) {
?>

<tr>
<td><?php echo $productos[$i]; ?> </td>
<td><?php echo number_format($precios[$i],2); ?> € </td>
<td><a href="catalogo.php?comprar=<?php echo $i ?>">Comprar</a> </td>
<tr>
<?php
}
?>

</table>
Todos los precios son inventados Smile
</body>
</html>

carrito.php

<?php
$carrito = array();
session_start();
session_register('carrito');
if($vacio != "")
{
//añadir un producto al final del array $carrito
session_unregister('carrito');
header("Location: $PHP_SELF?".SID);
exit();
}
?>
<html>
<head>
<title>Tu carrito de la compra</title>
</head>
<body>
Tienes en el carrito de la compra: <?php echo count($carrito); ?> productos.
<p> <a href="carrito.php" title="Ver el carrito"> Mira lo que tienes el carrito</a>
<?php
$productos = array ("Dicionario", "Calculadora", "Pluma Montblanc", "Zapatos de ante azul", "pantalones verdes");

$precios = array("20", "50", "2000", "200", "50");
?>

<table border="1">
<tr>
<th> Descripción  del producto</th>
<th> Precio</th>
</tr>

<?php
for($i =0; $i < count($carrito); $i++) {
?>

<tr>
<td><?php echo $productos[$carrito[$i]]; ?> </td>
<td><?php echo number_format($precios[$carrito[$i]],2); ?> € </td>
<td><a href="catalogo.php?comprar=<?php echo $i ?>">Comprar</a> </td>
</tr>

<?php
$total = $total + $precios[$carrito[$i]];
}
?>
<tr>
<th align="right"> Total:</th>
<th align="right"><?php echo number_format($total,2);?>

</table>
<a href="catalogo.php">Seguir comprando</a><p>
<a href="carrito.php?vacio=1">Vaciar carrito de la compra</a>
</body>
</html>

Volver al índice

2 responses to “6.- Sesiones

  1. Normal, este tutorial hace por lo menos 5 años que lo escribí, si siguiera funcionando, habría que preocuparse seriamente por la seguridad de php, pásate por http://www.forosdelweb.com/f18/

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s