Tutorial de sesiones en PHP

Valoración del artículo:
Este es un tutorial básico para el manejo y control de sesiones en PHP, una de las consultas más realizadas sobre este lenguaje.
Licencia Copyleft.
Puedes reproducirlo citando al autor y enlazando con DesarrolloWeb.com.
Veamos un sencillo ejemplo de uso de sesiones para ilustrar a los usuarios más inexpertos el manejo de sesiones con PHP en sus procesos más básicos, como son la inicialización de sesiones, comprobar si existen variables de sesión, crearlas y modificarlas.

En este ejemplo vamos a hacer un sistema para llevar la cuenta de las páginas que ha visto un visitante. Es decir, si entra a una página del sitio por primera vez, contamos que ha visto una página, luego con cada página adicional que visite, seguiremos acumulando 1 en la cuenta de páginas vistas dentro del sitio. Del mismo modo, si se recarga una página o se vuelve a la misma página que ya se estuvo, también haremos que se acumule 1 en su cuenta.

Para aprender a trabajar con sesiones recomendamos leer el artículo sesiones en PHP.

Lo que tendremos que hacer en este ejercicio es lo siguiente:

- Inicializar la sesión
- Si no tenemos el contador de páginas creado, lo inicializamos al valor 1
- Si tenemos el contador de páginas creado, lo incrementamos en 1.

<? session_start();
if (!isset($_SESSION["cuenta_paginas"])){
    $_SESSION["cuenta_paginas"] = 1;
}else{
    $_SESSION["cuenta_paginas"]++;
}
?>
<html>
<head>
<title>Contar páginas vistas por un usuario en toda su sesión</title>
</head>

<body>
<?
echo "Desde que entraste has visto " . $_SESSION["cuenta_paginas"] . " páginas";
?>
<br>
<br>
<a href="otracuenta.php">Ver otra página</a>
</body>
</html>

Como se ha podido ver, lo primero que debemos hacer es inicializar la sesión con session_start().

Luego de inicializar la sesión podemos trabajar con variables de sesión en cualquier lugar del código PHP. Nosotros vamos a crear y utilizar una variable de sesión para llevar la cuenta del número de páginas que hemos visto.

$_SESSION["cuenta_paginas"]

Para ver si una variable de sesión ha sido creada podemos utilizar la función isset() pasándole como parámetro la variable que deseamos saber si ha sido creada. Si no fue creada anteriormente, simplemente la creamos (inicializando su valor a 1). Si fue creada, pues que tenemos que incrementar en 1. Eso se consigue con este código:

if (!isset($_SESSION["cuenta_paginas"])){
    $_SESSION["cuenta_paginas"] = 1;
}else{
    $_SESSION["cuenta_paginas"]++;
}

Eso es todo! Ahora lo que se supone que tenemos son otras páginas en el mismo sitio que también tienen que incrementar en 1 el contador de páginas vistas por ese usuario en esa sesión.

Eso lo podríamos hacer con el mismo trozo de código, como el que hemos visto antes, colocado al principio del archivo PHP.

<? session_start();
if (!isset($_SESSION["cuenta_paginas"])){
    $_SESSION["cuenta_paginas"] = 1;
}else{
    $_SESSION["cuenta_paginas"]++;
}
?>

Luego, en cualquier momento, si deseamos mostrar el número de páginas vistas en un momento dado, tendríamos que hacer algo como esto:

<? echo "Has visto " . $_SESSION["cuenta_paginas"] . " páginas, contando actualizaciones de paginas"; ?>

Podemos ver el ejemplo relatado en funcionamiento.

Comentarios
Fueron enviados 17 comentarios al artículo
1 comentario no revisado
16 comentarios revisados:
Por: vicente
22/3/04
La aplicacion me parece muy buena para iniciarse en el tema de las sesiones, pero hay una parte del codigo que se puede hacer más sencilla y rápida.

LA PARTE PARA AÑADIR ITEMS A LA CESTA:

if ($item){
if (!isset($itemsEnCesta)){
$itemsEnCesta[$item]=$cantidad;
}else{
foreach($itemsEnCesta as $k => $v){
if ($item==$k){
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}
}

SE PODRIA CAMBIAR POR:

if ($item)
{
    if ( isset( $itemsEnCesta[$item] ) )
    {
       $itemsEnCesta[$item]+=$cantidad;
    }
    else
    {
       $itemsEnCesta[$item]=$cantidad;
    }
}

Más sencilla y a la vez mas eficiente, ya que no esta hecha en un bucle
Por: Erick
24/7/04
Ami parecer está mejor la primer forma de añadir al carrito, ya que esa misma parte de codigo lo puedes modificar y hacer cosas como Elimitar una cantidad de Items, o bien añadir la compra a la base de datos.


foreach($itemsEnCesta as $k => $v){

if($v>0){

mysql_query("INSERT INTO detalle_compra (Folio,IDArticulo," .
"Cantidad) VALUES (" .
$folio . "," .
$k . "," .
$v . ")",$mysql);


mysql_query("update almacen set Existencias=Existencias- " . $v . " where IDArticulo= " . $k ,$mysql );

}
}
Por: daCrow
29/7/05
Todavía se puede mejorar así:

if($_POST["itemActual"])
$_SESSION["cesta"][$_POST["itemActual"]] += $_POST["cantidad"];

Saludos
Por: Patton
02/8/05
Hay un erroren este código

<?php
session_register('contador');
echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale: '.++$contador.'</a>';
?>
En echo debería ser:
echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale: '.++$_SESSION['contador'].'</a>';

tb podría usarse $_REQUEST
Por: Patton
07/8/05
$item = $_POST['item'];
$cantidad = $_POST['cantidad'];
antes de session star();
Pa los ke no les funcione el formulario x regiter_globals
Por: Ivan
11/8/05
Para hacer el carrito mas completo Prodrín agregarle estas modificaciones que le hice, asi podrán quitar items, y sumar y restar cantidades:


<?php
session_start();
session_register('itemsEnCesta');
$encontrado=0;
$total=0;
if (isset($item)){
if (!isset($itemsEnCesta)){
$itemsEnCesta[$item]=$cantidad;
}else{
foreach($itemsEnCesta as $k => $v){
if ($item==$k){
//$total+=$v;
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;
}
}
if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}
}
?>
<html>
<body>
<tt>
<form action="<?=$PHP_SELF."?".SID?>" method="post">
Dime el producto <input type="text" name="item" size="20"><br>
Cuantas unidades <input type="text" name="cantidad" size="20">
<br></br>
<input type="submit" value="Añadir a la cesta"><br>
</form>
<?

if (isset($valor2)){
foreach($itemsEnCesta as $k => $v){
if ($valor2==$k){
$itemsEnCesta[$k]+=1;
}
}
}

if (isset($valor3)){
foreach($itemsEnCesta as $k => $v){
if ($itemsEnCesta[$k]>1){
if ($valor3==$k){
$itemsEnCesta[$k]-=1;
}
}else{
$valor=$valor3;
}
}
Por: patton
21/8/05
Ivan
Parece ke lo ke kiere hacer este wn es borrar, pero no!! Ni siquiera cambiaste el menú. Lo uniko ke hace es entregarle la cantidad al arreglo con clave item es decir la celda del arreglo ke contiene ese producto ke se ingreso, si es un mismo producto busca en el arreglo si lo encuentra añade la nueva cantidad, es decir hace lo mismo ke lo ke dice el tutorial aporte? ninguno
Salvador
Lindo tu código, pero si nos salvas, salva primero el codigo sin errores
function valida1(){ document.forma.action= "/salvador_1.php?PHPSESSID=d9c98acc2f5c5746274c0818859c8942"; document.forma.method= 'POST'; document.forma.submit(); } function valida2(){ document.forma.action= "respsession3_final.php"; document.forma.method= 'POST'; document.forma.submit(); }
Por: churla
05/10/05
en el comentario anterios dijo que:

++$contador esta mal y que deberia ser ++$_SESSION['contador'] pues la verdad es que si estaba bien. siempre y cuando en el php.ini global este activo. y sino se deberia usar la segunda, pero sí si esta activado la primera es mas sencilla de usar.
Por: javier gallegos
14/12/05
pues por mas que trate de correrlo no se podia, agregue
$item=$_POST[item]
$cantidad=$_POST[cantidad]
asi si jalo pero cada vez que ingreso algo incluso siendo un producto que ya estaba, no lo suma solo lo actualiza, lo que me indica que pra el programa jamas esta declarado el arreglo itemsEnCesta y nunca entra a la siguiente parte si alguien sabe que es lo que tengo mal por favor diganmelo, porque de otra forma pues de nada me sirve el programita
Por: GordoChow
16/12/05
Buenas tiene mucha razon he visto que en muychos de los post añaden siempre:

<?php
session_register('contador');
echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale: '.++$contador.'</a>';
?>

----cuando debe ser------------
<?php
session_register('contador');
$_SESSION['contador']++;
echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale: '.$_SESSION['contador'].'</a>';
?>

------------------
grabe error en muchos tutoriales, sin embargo en los tutoriales de php explica detalladamente
--------lo siguiente:---------
<?php
session_start();
if (isset($HTTP_SESSION_VARS['count'])) {
$HTTP_SESSION_VARS['count']++;
}
else {
$HTTP_SESSION_VARS['count'] = 0;
}
?>

-------
Gracias un saludo. y aqui les dejo mi cherry
- Photoshop
- Adobe Acrobat
- Corel Photopaint
- Corel Draw
- Dreanweaver
- Marcromedia flash
- XML
- HTML
- PHP
- MYSQL (nivel basico)
- javascript (nivel basico)
- 3d max(modelado)

contactar a walter_apaza en HOT
GordoChow - Solutions
Por: Verónica
05/5/06
El ejemplo es excelente y me ayudo mucho a entender el potencial del manejo de sesiones,
solo encontré dos detalles al correrlo

1.- Notice: Undefined variable: item in c:appservwwwejemses2.php on line 4
2.- Notice: Undefined variable: encontrado in c:appservwwwejemses2.php on line 14

Que se corrige Inicializando las variables: encontrado e item, el código quedaría así en esta parte:

<?php
session_start();
session_register('itemsEnCesta');
//Inicializacion de las variables
$encontrado=0;
if (!isset($item)){
$item="";
}
//
if ($item){
if (!isset($itemsEnCesta)){
$itemsEnCesta[$item]=$cantidad;
}else{
foreach($itemsEnCesta as $k => $v){
if ($item==$k){
$itemsEnCesta[$k]+=$cantidad;
$encontrado=1;//Encuentra el producto
}
}
if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}
}
?>
Por: panther22
01/6/07
hola programadores e ingenieros, tengo un problema, miren estoy ttabajando con una base de datos mysql, y a la vez en php, necesito validar usuario pero eso ya lo sé, "i el ususario es correcto registrar en sesion, para acceder a sistema" eso no lo se, quien me puede ayudar..porfaa
Por: Brahyan
05/8/07
hola... estoy epesando en esto de las sesioones y tengo una duda.... como hago por ejemplo:

creé una pagina en la cual el index me pide un login el cual valido en una base dedatos mysql y si esta es correcta me da como resultado session_start();
como hago para que si yo digito en la barra de direcciones http://index.php/otroArchivo.php no me abra sino que me pida el login.... lo he intantado hacer por medio de una sentencia if() en el cabasote de cada pafina pero no me da el resultado que espero.. al parecer cuando nombro una variable con el contenido de
session_start();
por ejemplo: $sesion=session_start(); al parecer lo qeu susede esque el sistema inicia la sesion cuando ve esta variable..... como puedo arreglar esto???
Por: Sol
20/8/07
Hola, he realizado mis sesiones por mi cuenta, ummm pero tengo una duda, cuando inicio en una ventana de mi esplorador la sesion, ahi tengo ami usuario y sesion, y caundo abro otra ventana y pruebo con otro usuario y entro a mi aplicacion php que estoy desarrrolando, automaticamente la sesion anetrior toma la nueva sesion, generandome una sesion duplicada, y se vuelve el mismo usuario, ups! algo esta mal, pero no se que sera o a que se debe, podrian orientarme en que debo hacer?
gracias pro su tiempo y sus conocimientos.
Por: Felipe
10/9/07
¿Cómo puedo crear perfiles a partir de la sesión?, es decir: que según el usuario registrado pueda acceder a ciertas partes, pero a otras no.
problemas con autentificacion
Por: jorge
24/4/09
Hola, muy útil su aportación, tengo una duda, estoy haciendo la autentificación de un sitio y lo estoy haciendo con variables de sesión.
el problema es que una vez que se logean la variable se queda guardada incluso cuando abandonan la pagina, por lo cual, si se abre el navegador y se escribe en la barra de direcciones una pagina interna y se quiere volar el log in esta accede.
como puedo llamar session_destroy cuando la pagina se cierre, o hay otra solución?

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo
Copyright | Publicidad | Acerca de | Datos legales | Contacta