Foros del Web » Programando para Internet » PHP »

sesion perdida con header()

Estas en el tema de sesion perdida con header() en el foro de PHP en Foros del Web. Tengo un problema con las sesiones y no se como solucionarlo. Tengo un auth.php que me verifica que el usuario existe y si existe me ...
  #1 (permalink)  
Antiguo 24/02/2005, 04:41
 
Fecha de Ingreso: febrero-2005
Mensajes: 81
Antigüedad: 19 años, 2 meses
Puntos: 0
Exclamación sesion perdida con header()

Tengo un problema con las sesiones y no se como solucionarlo.

Tengo un auth.php que me verifica que el usuario existe y si existe me grava los datos del usuario

ob_start();
start_session();
...(codigo de comprovacion de usuario)...
$_SESSION['username']=$alias;
$_SESSION['password']=$userpass;

header ("Location: ../../../prueba.php");

ob_end_flush();


pero al hacer el header el PHPSSESID se pierde y no me lo pasa como parametro. en cambio si se lo paso por un link normal y corriente si.

tengo el SID en automatico, y en todas las paginas me lo pasa automaticamente sin que yo le diga que me lo pase, pero ni con el header ni con el META refresh me lo pasa.

Como puedo hacer para que me lo pase? tengo que decirle algo en cooncreto? o mejor tengo que cojer el PHPSESSID y pasarlo manualmente en el header asi:

header ("Location: ../../../prueba.php?PHPSESSID=xxxxxx");

si tengo que hacerlo manualmente como consigo el nombre de sesion? hay alguna variable de sesion de donde lo pueda cojer????

Gracias por adelantado
  #2 (permalink)  
Antiguo 19/09/2005, 05:24
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
A mi me pasa algo similar.

En una pagina tengo un include en el que hago un session_start.
El caso es que si pongo el path completo (ej:'http://www.site.com/../../../pagina.php') es como si desaparecieran las variables de sesion. En cambio, si en vez de poner el path completo solo pongo el nombre del fichero en el include (pagina.php) leo correctamente las variables de sesion. Abracadabra!

Alguien conoce el motivo?
  #3 (permalink)  
Antiguo 19/09/2005, 05:38
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
klareNs: start_session()??, no es session_start()??? ... espero sea ese el problema.

jerkan: El tratar de pasar el SID a sitios externos podría significar un problema de seguridad... las rutas absolutas son interpretadas como enlaces externos por ello es que no puedes proparagr el SID.

Un saludo!

Edito y Agrego (no ví ):
Cita:
si tengo que hacerlo manualmente como consigo el nombre de sesion? hay alguna variable de sesion de donde lo pueda cojer????
Tienes la función session_id() y la constante SID, pero por default no es necesario hacer esto... ....
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"

Última edición por jam1138; 19/09/2005 a las 05:58
  #4 (permalink)  
Antiguo 19/09/2005, 05:41
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Gracias jam1138. Entonces, cual es la mejor manera de escribir los paths en el código por si algún dia decides moverlos de sitio? Es que la solución de poner todos los ficheros en un directorio me parece un poco guarra, la verdad.
  #5 (permalink)  
Antiguo 19/09/2005, 10:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
klareNs

Como propagas exactamente el SID (según tu configuración de PHP): lo haces por cookies o por el URL (al parecer lo haces por el URL completamente o tienes problemas con tus cookies).

Te hago el comentario por qué si usas:
session.use_trans_sid a ON (1) .. propagas el SID en el URL automáticamente, eso quiere decir que PHP va a sobre-escribir ciertos tag's HTML para insertar el SID (como los que se mencionana en la directiva: allow_url_rewrite_tags). No sobre-escribe redireccionamientos tipo header("Location: ...") ni <META .. > ni javacript (window.open() ..etc) En esos casos debes propagar el SID a mano.

Si usas session.use_cookie = ON .. (con la otra a ON también) .. se propagará el SID en cookies, pero para esto tu cliente (Navegador) debe aceptar esas cookies, sino .. se propagará el SID en los casos mencionados -sólo-

Si quieres evitarte propagar el SID a mano en esos casos y ganar en seguridad, propaga el SID en cookies:
sesssion.use_only_cookies = ON

www.php.net/session
(la versión en ingles está más completa .. lectura recomendada).

Un saludo,
  #6 (permalink)  
Antiguo 19/09/2005, 10:22
 
Fecha de Ingreso: agosto-2005
Mensajes: 79
Antigüedad: 18 años, 8 meses
Puntos: 0
Yo tengo otro problemas con sesiones y header... y no se como solucionarlo...
Tengo entendido que son bastante caprichosas estas sentencias...

Tengo un .php donde abro session (session_start()) y compruebo si lleva muchos tiempo inactivo... entonces si no lleva mucho tiempo inactivo continua la sesion y sino la destruye... este lo abro en todas las paginas... y toda funciona bien... pero..

cuando pongo ese include dentro de otro php... que contiene un header me dice q ya ha enviado la cabezera el include... y si lo pongo delante... hace el header("Location:...." pero no hace el include... por lo que tp debe empezar la session... lo curioso es que cuando le digo $_SESSION["id"] me duevelve el valor correcto...

esto a que se debe? espero explicarme bien.. Un saludo!
  #7 (permalink)  
Antiguo 19/09/2005, 10:29
 
Fecha de Ingreso: abril-2005
Ubicación: Montevideo, Uruguay
Mensajes: 102
Antigüedad: 19 años
Puntos: 0
Ojo con esto!

Antes de hacer un header location, si has almacenado algo en al sesión, siempre hay que hacer session_write_close() para forzar a PHP a serializar la sesión. Sino es probable que no la serialize y los datos escritos se pierdan.

Además es recomendable hacer un die o exit luego del header location, porque bajo ciertas circunstacias el script podría seguir corriendo.

Ej:

session_write_close();
header ("Location: ../../../prueba.php");
exit;

Aparentemente no es el problema concreto, pero como no lo veo en tu código te aviso.

Saludos
__________________
Mauricio Etcheverry

WebMaster de YoReparo.com
  #8 (permalink)  
Antiguo 19/09/2005, 10:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
elmaster ...

Has tenido experiencias con esa función? .. te lo comento por qué nunca la he usado y no he tenído problemas con el resgistro de las sesiones. Te hablo desde que uso PHP (versiones 4.0.x a 5.x que ahora uso).

En definitiva ... según comenta PHP(.net) al terminar la ejecución del script, se registran las variables de sesión y quedan disponibles en su array correspondiente ($_SESSION), .. Como el objetivo final al usar un redireccionamiento tipo header("Location ...") -suele- ser cambiarse a la ejecución de otro script .. hacemos:

1) indicamos al cliente (navegador en estos casos) vía cabeceras HTTP que cambie (llame) a otro script:
Código PHP:
header ("Location: ...."); 
2) Terminamos la ejecución del script en curso, .. por qué sino PHP sigue la ejecución hasta el final del script según el flujo del código que usemos (condicionales y demás).
Código PHP:
exit; 
Ahora .. si no terminamos la ejecución del script en ese punto .. sobre todo si se captura el buffer de salida (con las funciones ob_start() y afines .. ahí tal vez sea recomendable "forzar" a que PHP vaya registrando en ese punto las variables de sesión que tenga hasta el momento. (Aunque por mi parte soy de la filosofía de NO usar el buffer de salida de PHP para eso .. ordenando mejor el código para no enviar salida -antes- de tener que usar un redireccionamiento tipo header() o envio de cabeceras HTTP en general).

Un saludo,
  #9 (permalink)  
Antiguo 19/09/2005, 10:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por daveee
Yo tengo otro problemas con sesiones y header... y no se como solucionarlo...
Tengo entendido que son bastante caprichosas estas sentencias...

Tengo un .php donde abro session (session_start()) y compruebo si lleva muchos tiempo inactivo... entonces si no lleva mucho tiempo inactivo continua la sesion y sino la destruye... este lo abro en todas las paginas... y toda funciona bien... pero..

cuando pongo ese include dentro de otro php... que contiene un header me dice q ya ha enviado la cabezera el include... y si lo pongo delante... hace el header("Location:...." pero no hace el include... por lo que tp debe empezar la session... lo curioso es que cuando le digo $_SESSION["id"] me duevelve el valor correcto...

esto a que se debe? espero explicarme bien.. Un saludo!
Deberías indicar el código que usas y el error -textual- que obtienes (sin omitir nombres de los scripts que ahí se te indican).

Un espacio .. un salto de línea antes de tus <? .. o al final de tu ?> del script que llamas en tu include .. ya origina esa "salida" por la que alega PHP. (por eso .. si nos indicas el código y el mensaje de error te podremos orientar mejor).

Un saludo,
  #10 (permalink)  
Antiguo 19/09/2005, 10:49
 
Fecha de Ingreso: agosto-2005
Mensajes: 79
Antigüedad: 18 años, 8 meses
Puntos: 0
Muchas gracias... lo voy a intentar... de todas maneras te explico donde viene el problema y el codigo...

Tengo un tagboard, y solo quiero q envie el contenido si continua la sesion... entonces el formulario del contenido lo mando a un fichero .php

en este fichero recogeria los valores por POST y los introduciria en la base de datos... y al final coloco el header ("location :pagina anterior");

hasta ahi bien... pero le he introducido delante el cont_session.php... que te hago un resumen del codigo...
Código PHP:
<?
session_start
();    
if (
$_SESSION["ultimoAcceso"]){
            
//y ahora comparo con la fecha guardada de la ultima actividad
      
if($tiempo_transcurrido >= 999) { 
           
//cierro la sesion y le digo q se vuelva a loguear
          
mysql_close();
          
session_destroy(); // destruyo la sesión 
          
unset($_SESSION);
         
header("Location: $PHP_SELF?er=3"); //envío al usuario a la pag. 
         
exit;
    
//sino, actualizo la fecha de la sesión 
    
}else 
        
$_SESSION["ultimoAcceso"] = $ahora
}
?>
al codigo esta incompleto... le falta... recoger los valores de ultimo acceso... y poner las nueva fecha... etc... solo he puesto donde actua las sesiones y el header...

entonces como pongo antes el include... me dice q la cabecera se habia enviado antes con el inicio de sesion....
Debo cerrarla como me has dicho, no?

Entonces es recomendado cerrar la sesion una vez que haya comparado y modificado los datos de sesion??

Muchas gracias... voy a ver si asi va bien!
  #11 (permalink)  
Antiguo 19/09/2005, 11:06
 
Fecha de Ingreso: agosto-2005
Mensajes: 79
Antigüedad: 18 años, 8 meses
Puntos: 0
este es el error q me sale....

Warning: Cannot modify header information - headers already sent by (output started at /home/.../cont_session.php:22) in /home/.../noticia_nv.php on line 25
  #12 (permalink)  
Antiguo 19/09/2005, 11:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Insisto ..

Y el mensaje de error concreto y el código completo?

Sobre todo el mensaje de error y que nos indique a que línea de código pertenece!.

Un saludo,
  #13 (permalink)  
Antiguo 19/09/2005, 11:36
 
Fecha de Ingreso: agosto-2005
Mensajes: 79
Antigüedad: 18 años, 8 meses
Puntos: 0
Cita:
Iniciado por Cluster
Insisto ..

Y el mensaje de error concreto y el código completo?

Sobre todo el mensaje de error y que nos indique a que línea de código pertenece!.

Un saludo,
El error lo puse antes....

Warning: Cannot modify header information - headers already sent by (output started at /home/.../cont_session.php:22) in /home/.../noticia_nv.php on line 25

ESTE ES EL notcia_nv.php
Código PHP:
<? 
include ("../config/cont_session.php");
include (
"funciones.php");
$contenido=quitar($_POST["contenido"]);
$autor=$_SESSION["usuario"];
$fecha=date("Y-m-d");
$hora=date("H:i:s");
if(
trim($contenido) != ""

// tb modifico mas datos... puntos... y de mas... pero solo toco mysql_query...
mysql_query("INSERT INTO noticias (autor,contenido,fecha,hora) VALUES ('$autor','$contenido','$fecha','$hora')",$conex);   
mysql_close();
}
header("Location:../index.php");
exit;
?>
Y ESTE EL cont_session.php
Código PHP:
<?    
session_start
();    
if (
$_SESSION["ultimoAcceso"]){
    
$fechaGuardada $_SESSION["ultimoAcceso"]; 
    
$ahora date("Y-n-j H:i:s"); 
    
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada)); 
    
//comparamos el tiempo transcurrido 
    
if($tiempo_transcurrido >= 999) { 
     
//si pasaron 16 minutos o más 
     // tb borro de la tabla de conectados el usuario que cierra la session.
      
session_destroy(); // destruyo la sesión 
      
unset($_SESSION);
      
header("Location: $PHP_SELF?er=3"); //envío al usuario a la pag. de autenticación 
      
exit;
      
//sino, actualizo la fecha de la sesión 
    
}else 
        
$_SESSION["ultimoAcceso"] = $ahora
}
?>
Ala pos ya esta... lo que he suprimido son modificaciones de las bases de datos suplementarias... no muestra nada por pantalla solo son mysql_querys....
  #14 (permalink)  
Antiguo 19/09/2005, 12:52
 
Fecha de Ingreso: agosto-2005
Mensajes: 79
Antigüedad: 18 años, 8 meses
Puntos: 0
he hecho mejoras... si pongo el contenido del include... directamente sobre el otro codigo php... no da error... he leido en php(.net) que...

·Recuerde que la función header() debe ser llamada antes de que cualquier salida sea enviada, ya sea mediante etiquetas HTML normales, líneas en blanco de un archivo, o desde PHP. Es un error bastante común interpretar código extra con include(), require(), o alguna otra función de acceso de archivos, y terminar con espacios o líneas en blanco que son impresas antes de un llamado a header(). El mismo problema existe cuando se usa un archivo PHP/HTML único. (Fuente: php.net)

pero no he entendido muy bien a lo que se refiere... he quitado todos los espacios y fallaba... pero si coloco el contenido integro... como he dixo no falla.

Espero haberos servido de ayuda... o si sabeis algo de los includes... me podais ayudar ami!

Saludos!
  #15 (permalink)  
Antiguo 19/09/2005, 14:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y .. esa línea: 22 de cont_session.php (cont_session.php:22) a que corresponde? Seguramente tienes algún salto de línea o espaco al final de tu ?> .. revisalo bien con algún editor que cuente líneas (Dreamweaver u otros) .. ahí veras que es lo que tienes en esa línea.

Un saludo,
  #16 (permalink)  
Antiguo 19/09/2005, 14:21
 
Fecha de Ingreso: abril-2005
Ubicación: Montevideo, Uruguay
Mensajes: 102
Antigüedad: 19 años
Puntos: 0
Cita:
Iniciado por Cluster
elmaster ...

Has tenido experiencias con esa función? .. te lo comento por qué nunca la he usado y no he tenído problemas con el resgistro de las sesiones. Te hablo desde que uso PHP (versiones 4.0.x a 5.x que ahora uso).
Hola Cluster, he tenido problemas sí, y han sido bastante jodidos de debugear. Los datos no persistían en la sesión, y todo parecía estar bien. Al final, era debido a esto.

Si te fijas en la documentación de header(), y en la de session_write_close() en los comentarios, hay gente que dice le pasó lo mismo y por tanto recomiendan hacer session_write_close(), lo cual es lógico.

Así que cuidado, porque de presentarse fallos debido a esto pueden ser muy peliagudos de figurar, además de aleatorios.
__________________
Mauricio Etcheverry

WebMaster de YoReparo.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:44.