Custom Search
Bloggers Activos
Emacs como IDE para CakePHP aarkerio
La Negación del Viaje Lunar tonathiu
Porque los mononeurones si tenemos madre! blacksoul
BrunoFerías thot
The Art vendaval
Aclimatación extraterrestre ¿para qué? ahuramazdah
¿A que le tienes miedo? teosho
Sobre nazis, terror y medios tonathiu
Amenazas a la cuarta dimensión ¿de veras? ahuramazdah
Tarjeta Broadcom BCM94311MCG rev 02 teosho
Last Download
Segunda Fundación
Segunda Fundación
Pidiendo OpenSolaris 2008.5
vendaval
Sospechosismo
aarkerio
Slackware 12.1 Final
vendaval
Jaime Maussan da por auténtico video trucado del chupacabras hecho en Blender 3D
asarch
Linux hot girl
aarkerio
Calderón puede ser sujeto a juicio político, sostiene Carrancá
tonathiu
La desnutrición en México
aarkerio
Sistema Infalible
ordbal
Histórico
aarkerio
Nietzsche en la FCPyS
aarkerio
Google Groups Karamelo
Visit this group
GNU/Linux
GNU/Linux
Hacktivismo
Hacktivismo
Debian
Debian
NetBSD
NetBSD
WWW
WWW
Guia Linux
Guia Linux
Server Side
Server Side
Ofimatica
Ofimatica
Despabilando...
Despabilando...
Mundo Maya
Mundo Maya
Literatura
Literatura
Agora
Agora
Psicologia
Psicologia
Economia
Economia
Ambientalismo
Ambientalismo
Desarrollo
Desarrollo
Biologia
Biologia
Comercio Justo
Comercio Justo

Hacktivism

LinuxChix button

WWW \ Manejo de Sesiones en PHP
WWW
Manejo de Sesiones en PHP

Este artículo ha sido consultado en 2,127 ocasiones.

Las sesiones nos permiten almacenar y consultar información sobre un visitante sin necesidad de estar enviándola a través de formularios. Usted podría decir "eso ya lo hago con las cookies", pero el uso de las cookies es cada vez más limitado. Muchos navegadores las deshabilitan por omisión pues guardan información en la computadora del usuario y esto las hace inseguras (existen varios programas hackeriles para extraer contraseñas guardadas en las cookies). PHP posee un repertorio interesante de funcionalidades que nos permiten hacer todo lo que hacemos con las cookies sin guardar nada en la computadora del visitante.

Las sesiones de PHP se guardan en un directorio asignado del servidor donde Apache se ejecuta. Generalmente este directorio es /tmp pero es posible modificarlo desde el archivo /etc/php4/apache/php.ini. Estos archivos están vinculados al usuario que navega a través de un identificador especial llamado "Session ID". La mayoría de las veces el usuario no se entera de que está en una sesión al navegar por un sitio en la red.

Las sesiones pueden usarse para muchas cosas pero la gran mayoría de las veces se usan para establecer los derechos de un usuario en el sitio luego de logearse con un nombre de usuario y una contraseña. 

¡Basta de teoría!  Para empezar a trabajar una sesión en PHP lo primero es iniciarla con  la función session_start() , esta función debe estar ANTES de cualquier otra cosa. Esto es muy importante, de no colocarla antes obtendrás mensajes como:

Warning: Cannot send session cookie - headers already sent by (output started at session_header_error/session_error.php:2) in session_header_error/session_error.php on line 3

Warning: Cannot send session cache limiter - headers already sent (output started at session_header_error/session_error.php:2) in session_header_error/session_error.php on line 3

Este error es producido por el siguiente código:

<?php
echo "Pablito clavo un clavito, en la calva de un calvito:<br />";
session_start();
?>

El error ocurre porque la línea "Pablito..." se envia antes de la función session_start(). La manera correcta de hacerlo sería así:

<?php
session_start
();
echo "Pablito clavo un clavito, en la calva de un calvito:<br />";
?>


La diferencia entre mandarla antes o después radica en que cualquier petición http es tomada y negociada de inmediato por el Webserver. Al colocar el inicio de sesión después de que algo le ha llegado a Apache hace imposible iniciarla pues ya ha habido un intercambio de información.  Incluso una línea vacía después de <?php será procesada por Apache, y en consecuencia, la sesión no podrá iniciarse.

A través de su historia, Microsoft ha producido buenos programas para el mundo, ¡Internet Explorer no es uno de ellos! Uno de sus muchos errores radica en que al llenar un formulario y dar el botón Back, los datos del formario se pierden. Imagínese llenar un largo formulario fiscal y luego de un error al enviarlo, dar Back y ver que toda la información se perdió! Para solucionar este inconveniente es necesario agregar la siguiente línea DESPUÉS de iniciada la sesión:


<?php
session_start
();
header("Cache-control: private"); // IE 6 Fix.
?>

Bien, veamos un ejemplo de como decirle a PHP que inicie una sesión si el login y el password de un usuario coinciden.  Primero crearemos la página acceso.html:

<html>
<head><title>:: Acceso ::</title></head>
<body>
<br />
<div style="text-align:center;"><form
method="post" action="valida.php">
Introduzca su login: <input type="text" name="login" /> <br />
Introduzca su contraseña: <input type="password" name="password" /> <br />
<
input type="submit" value="Enviar">
</
form>
</div>
</body>
</html>

Como puedes ver, no hay nada esotérico en este archivo HTML, solamente lo usaremos para enviar dos valores a la página  valida.php. La cual luce así:


<?php
// Inicio la sesión
session_start();
header("Cache-control: private"); // Arregla IE 6

// Voy por el login y el password
   $login = $_POST['login'];
   $password = $_POST['password'];

// reviso si coincide
if ( $login == "mmontoya" && $password == "amex05") {
        
$_SESSION['estado'] = "logeado" // Coloco la variable de sesión 'estado'
           $msg = "<a href=\"adentro.php\">Bienvenido " . $login . ">></a>";
     
        } else {
     
         $msg = "Datos erroneos!!. <a href=\"acceso.html\">Inténtelo de nuevo.</a>";
     
        }
   
?>
<html>
<head><title>:: Valida ::</title></head>
<body>
<p style="text-align:center;"><?= $msg ?></p>
</form>
</body>
</html>

Bien, este script inicia la sesión (las primeras dos líneas), toma las variables que enviamos del formulario:

 // Voy por el login y el password
   $login = $_POST['login'];


Realiza una comparación entre los valores del formulario y dos strings:

if ( $login == "mmontoya" && $password == "amex05")

Esta linea quiere decir: "si la variable $login es igual a mmontoya y (&&) la variable $password es igual a amex05, haz lo siguiente". Si esta doble condición se cumple se crea la variable de sesión "estado"


$_SESSION['estado'] = "logeado";    // Coloco la variable de sesión $_SESSION['estado']

Si la doble condición no se cumple (else), la variable $msg toma un valor diferente:


$msg = "Datos erroneos!!. <a href=\"acceso.html\">Inténtelo de nuevo.</a>";


Destruyendo una sesión

Ahora bien, si la doble condición se cumple, la página valida.php mostrará un link a la página adentro.php que es la siguiente:

<?php
// Inicio la sesión
session_start();
header("Cache-control: private"); // Arregla IE 6
?>
<html>
<head><title>:: Adentro ::</title></head>
<body>
<p style="text-align:center;">Tu estado de sesión es: <b><?= $_SESSION['estado'] ?></b></p>

</body>
</html>


Esta página simplemente imprime el valor de la variable de sesión $_SESSION['estado']

Esta variable estará siempre a disposición del Webmaster sin necesidad de estar colocándola oculta en un formulario o enviándola en el URL de cada página. Con las sesiones, es muy sencillo comprobar si alguien puede ver una página con acceso restringido en el Website:

<?php
// Inicio la sesión
session_start();
header("Cache-control: private"); // Arregla IE 6

       if (
$_SESSION['estado'] == "logeado" ) {
    
           echo "<p>Usted está autorizado</p>";  //todo esta bien
     
        } else {
     
         
header("Location: acceso.html");   // largo de aqui !!
          echo "<html></html>";

        }
   
?>



¡Session rulezzz!

Además de mostrar el valor de la sesión, veremos una liga a la página salir.php que es la página que nos "saca" del sitio (logout):


<?php
// Inicio la sesión
session_start();
header("Cache-control: private"); // Arregla IE 6

 // descoloco todas la variables de la sesión
 session_unset();

 // Destruyo la sesión
 session_destroy();
 
 //Y me voy al inicio
 header("Location: acceso.html");
     echo "<html></html>";
   exit;
?>

Esta página borra las variables de sesión con la función session_unset(), destruye la sesión con session_destroy() y envia al usuario a la página de inicio con la función header(), es decir a acceso.html, "sacando" al usuario del sitio. Y voila!! hemos aprendido a manejar sesiones en PHP. En un próximo tutorial veremos como guardar y eliminar una sesión en una base datos (PostgreSQL o MySQL) y no en el directorio /tmp ¿Para que sirve esto?: Para manejar sesiones distribuidas entre varios servidores.


Autor
Manuel Montoya es psicólogo y vive en la Ciudad de México. Desde 1998 se dedica a la consultoría de sistemas abiertos. Ha desarrollado aplicaciones Web para American Express, Bancomext, Aeroméxico y Ford. Actualmente trabaja en el Instituto de Investigaciones Biomédicas de la UNAM usando Python, PostgreSQL y PHP sobre NetBSD, además prepara el café de las mañanas. Jedit.org y WindowMaker son su editor y escritorio favoritos.
Manuel Montoya


La coloración del código es fácil con:
Jedit.org
y su code2HTML plugin.


Última actualización: 2007-04-29 10:57:00-05

Printable version

on 13/6/07 wrote:
on 13/6/07 aarkerio wrote:
on 18/6/07 leoner rojas wrote:
soy de venezuela. Me parece excelente la informacion, estaba pariendo con las sesiones por que las otras paginas donde busque dan una informacion muy basica
on 11/3/08 Puma_medicina wrote:
Que tal trabajo también en la unam y creeme que me has ayudado un buen fuiste claro y conciso y dejame decirte (sin animos de ofender al contrario) que es bien raro que un Psicologo sepa de tecnología, y la verdad te has rifado porque además has adoptado el animo de ayudar gracias.
on 11/3/08 Puma_medicina wrote:
Que tal trabajo también en la unam y creeme que me has ayudado un buen fuiste claro y conciso y dejame decirte (sin animos de ofender al contrario) que es bien raro que un Psicologo sepa de tecnología, y la verdad te has rifado porque además has adoptado el animo de ayudar gracias.
1 week, 4 days ago Johan wrote:
Muy buena ayuda, de verdad mucha gracias, explica de una manera excelente... De verdad me sorprende y me anima aún más para desarrollarme mas como profesional de programación...

Add comment:



Captcha




Que estas haciendo?
teoshoteosho está:
Preparandome para el viaje a Puerto Vallarta... que triste...
3 hours, 9 minutes ago

scarecrowscarecrow está:
Du hast?
7 hours, 12 minutes ago

der_teufelder_teufel está:
Ich habe einen Kater, aber nicht so schlecht...
14 hours, 46 minutes ago

rnstuxrnstux está:
Y yo un Abrazo.
1 day, 14 hours ago

saidjosesaidjose está:
Dandole su habrazote a mi santa madre que me soporta
1 day, 16 hours ago

dsquiddsquid está:
esperando a que este el pozole
1 day, 17 hours ago

Que estuvimos haciendo >>
Chipotle Software

En tu equipo tienes:
Sólo Windows
Windows y Linux
Sólo Linux
Linux y un BSD
Solaris, linux y BSD
Sólo MacacOS
Rapiditas
Problemas de Lenguaje en niños
10410 lecturas
Sexualidad infantil y juvenil
9167 lecturas
Anticoncepción de Emergencia
7840 lecturas
Rompiendo cualquier clave WEP en unos pocos minutos
6921 lecturas
Sinapsis y exocitosis
6227 lecturas
Mi primer CakePHP, mmmmm cakeee
5264 lecturas
Evolución filética en las hepáticas
4699 lecturas
BASH y Primeros Comandos
4012 lecturas
CakePHP II Active Record
3742 lecturas
Cómo convertirse en hacker
3619 lecturas
Add to Technorati Favorites

ir arriba
Todo lujo es horrible, por su naturaleza misma, es degradante. Alfonso Reyes

The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework XHTML GNU Hacker Chipotle Software

Too Cool for Internet Explorer