2010-06-03 22 views
10

He leído el manual de php para este problema y parece un problema bastante común, pero aún no he encontrado una solución. Estoy guardando sesiones en una base de datos. Mi código es el siguiente:PHP: la sesión no se guarda antes de redirigir el encabezado

// session 
$_SESSION['userID'] = $user->id;   
header('Location: /subdirectory/index.php'); 

A continuación, en la parte superior de index.php después de la session_start(), he var_dumped los $ _SESSION global y el ID de usuario no está allí. Como dije, he consultado el manual de PHP (http://php.net/manual/en/function.session-write-close.php) y ni session_write_close ni session_regenerate_id(true) me han funcionado. ¿Alguien sabe una solución?

Editar: Tengo session_start() en la parte superior de mi archivo. Cuando var_dump la sesión global antes del redireccionamiento de encabezado, veo el ID de usuario allí, pero no en el otro archivo, que está en un subdirectorio de este script

+0

¿Estás 'session_starting()' donde realizas la redirección? –

+0

y ¿está seguro de que $ user-> id está configurado? – ahmet2106

+0

Hola, por favor vea el comentario que dejé para la publicación de @ ahmet2106 – phpNutt

Respuesta

0

Tiene un session_start(); ¿en la parte superior?

no han sido evaluados, pero no puedo haces algo como esto:

session_start(); 
$_SESSION['userID'] = $user->id; 
if($_SESSION['userID'] == $user->id) 
{ 
    header('Location: /index.php'); 
} 

nunca tienen este problema antes, interesante

+0

Sí, lo hago. Cuando var_dump la sesión global antes de la redirección del encabezado, está ahí, simplemente no es cuando voy a un nuevo archivo en una subcarpeta del script original – phpNutt

+0

@Matt gracioso, pero es realmente interesante, porque no debe establecerse la sesión, tal vez cualquier otro código esté borrando su sesión, ¿está seguro de que en ninguna otra parte hay una session_destroy(); ? – ahmet2106

+0

Extraño, cambié $ _SESSION ['userID'] a $ _SESSION ['uid'] y funcionó como se esperaba. No sé por qué las dos letras mayúsculas marcan la diferencia. Lo intenté con UserId también y eso también estuvo bien. ¿Alguna idea de por qué no aceptaría el ID de usuario? con dos capitales, estoy desconcertado – phpNutt

0

ID de usuario no tiene ningún estado de palabras clave.

La única razón para mí, es $ _SESSION ['userID'] se sobrescribe o se elimina en alguna parte.

Asegúrese de utilizar session-> start() en todos los archivos que desee agregar/acceder a la sesión.

Una cosa importante (que puede no ser aplicable en su caso) es que, si la sesión se maneja con cookies, se puede hacer que las cookies sean accesibles solo bajo ciertos directorios y subdirectorios. En cualquier caso, el subdirectorio tendrá acceso a la sesión.

-2

Intente dar session_name() antes que usted session_start().

Y cambie error_reporting(15) para ver los errores.

4

@ Matt (no poder hacer comentarios todavía ...): Si:
a) Aparece en la sesión antes de redirigir
b) otras teclas funcionan

80% de las veces el problema es register_globals , y el uso de una variable igualmente nombrada $ userID en alguna parte (el otro 19% está sobrescribiendo en lugares que no se espera, 1% no puede escribir/bloquear sesión antes de redireccionar y datos obsoletos, en cuyo caso podría intentar session_write_close() antes de la redirección). No hace falta decir register_globals debe estar apagada: P

+0

3 años después. session_write_close fue el mejor comentario de hoy! –

0

asegurarse de que ambas páginas son la misma versión php (PHP5, php4 a veces tienen diferentes rutas de sesión)

0

que no han oído hablar de este tema, pero no he No usé mucho las sesiones.

Con sesiones que debe hacer algunas cosas y tener una configuración de ajuste de unos pocos:

  • las cookies habilitadas en el lado del cliente
  • session_start(), antes de que algo sucede
  • asegurarse de que usted don' t destruir la sesión (a menos que quieran cerrar la sesión)
  • El ID de la sesión PHP debe ser el mismo (se refiere a las cookies)

Otro problema podría ser el $ usuario-> id está devolviendo una referencia a un objeto que no existe en la página siguiente. Lo más probable es que no, pero asegúrese.

Si veo tu código, podría ayudarte mucho más. Pero cuando se depura, verifique la clave de sesión con session_id() y asegúrese de que sea la misma. Si pudieras intentar eso, dime que podría seguir ayudando.

También me gustaría saber cómo terminará esto cuando regrese a las sesiones.

10

Sé que esto es un antiguo toppic pero encontré la solución (para mí). He puesto una salida después del encabezado.

$_SESSION['session'] = 'this is a session'; 
header('location: apage.php'); 
exit; 

Esto funciona para mí

+0

Gracias! Esto funciona para mí :) – mattpark22

+0

Esto funcionó para mí también. – jenovachild

+0

Está trabajando solo para el mismo directorio. ¿Cómo hacer esto para el subdirectorio? P. ej .: de http: /dominio.com a http: /dominio.com/subdir/? – arrowman

0

que tenía el mismo problema recientemente. Estoy escribiendo un sitio web personalizado de MVC para la escuela y, como todos dijeron, start_session() debe escribirse en las primeras líneas de código.

Mi problema es LA UBICACIÓN de "session_start()". Deben ser las primeras líneas de su controlador global, no las primeras líneas de la vista. $ _SESSION no fue accesible en los archivos del controlador porque solo se inició cuando el servidor procesó la vista.

Luego, estoy usando session_write_close() después de la llamada del encabezado ('ubicación: xxx.php') para mantener las variables de sesión para la siguiente solicitud.

ejemplo:

globalController.php:

//First line 
session_start(); 
require_once('Model/Database.php'); 
require_once('Model/Shop/Client.php'); 
... 

logonController.php:

... 
//Users is validated and redirected. 
$_SESSION['client'] = $client; 
header('location: index.php'); 
session_write_close(); 

espero que resuelve sus problemas.

0

Esto fue molesto como el infierno pero finalmente descubrí una solución.

config.php tuve: include 'session.php';

En la parte superior de session.php, tuve: session_start();

Por session_start() a la parte superior del archivo config.php, viola en movimiento ...

Problema resuelto!

+0

Es bastante bueno que hayas resuelto el problema. Solo te aconsejaré que estés un poco más limpio en tu solución para que también ayude a otros lectores. – sachinjain024

1

Debe iniciar la sesión antes de utilizar la matriz de sesión.

Código PHP,
session_start();
$ _SESSION ['userID'] = $ usuario-> id;

header ('Ubicación: /subdirectory/index.php');

Cuestiones relacionadas