2009-03-19 24 views
7

No puedo usar variables de sesión en una página distinta a la que están configuradas, IOW actúan como variables que no son de sesión. He encontrado una pregunta similar publicada en media docena de foros similares, pero la respuesta en esos otros casos siempre resulta no aplicar.Variables de sesión de PHP no conservadas

Éstos son mis archivos:

sess1.php

<?php 
session_start(); 

session_register("userid"); 
session_register("textvar"); 

$_SESSION['userid'] = 10333 ; 
$_SESSION['textvar'] = TextVariable ; 

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; 
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; 
?> 
<p>Go to the <a href="sess2.php">next page</a>.</p> 

y, sess2.php

<?php 
session_start(); 

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; 
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; 
?> 

La salida del navegador en cada caso es:

sess1.php

ID de usuario es: 10333

Otra variable es: textVariable

Ir a la [página siguiente].

y, sess2.php

La variable de sesión ID de usuario es:

La otra variable de sesión es:

Ir a la [última página].

Un par de cosas que no es:

  • Tengo session_start() en la parte superior de ambos archivos.
  • El directorio de variables es de escritura y las variables de sesión se muestran allí. (Tengo alrededor de un centenar de pequeños archivos llamados sess_b62, que tienen esto dentro: 'userid | i: 10333; textvar | s: 12: "TextVariable";'.)
  • phpinfo() me dice que el archivo php.ini se está leyendo correctamente y la duración está establecida en el valor predeterminado, 0, es decir, hasta que se cierre el navegador.

Estoy al final de mi ingenio. ¿Alguna sugerencia?

Muchas gracias.

+0

¿Ha marcado si se usa la misma ID de sesión? – Gumbo

+0

¿Es una de las páginas de SSL? –

+0

¿Qué versión de PHP está ejecutando? (desde phpinfo() también) –

Respuesta

2

La ID de la sesión debe llevarse de alguna forma para que la misma sesión se pueda utilizar en varias páginas. En general, esto se hace con una cookie (ver session.use_cookies) pero también se puede hacer en la URL o en formularios (ver session.use_trans_sid).

Por lo tanto, primero debe asegurarse de que la ID de la sesión se transmita para que PHP pueda cargar la sesión correcta y los datos de la sesión.

Consulte también Is my understanding of PHP sessions correct?

+0

Gracias por la ayuda. phpinfo() parece confirmar que estoy usando cookies y que la ID se está transmitiendo. session.use_cookies está "Activado" y session.use_trans_sid es 0. Set-Cookie registra la cookie que fue creada por la primera página, y esa página se denomina como el referer. –

+0

¿Y la identificación de la sesión es la misma en ambas páginas?Que un campo de encabezado Set-Cookie haya sido enviado no significa que la cookie haya sido aceptada y enviada junto con la segunda solicitud. Intente comparar los valores de retorno 'session_id()' en ambas páginas. – Gumbo

+0

Crud. Los ID de sesión son diferentes. Ahora que...? –

7

session_register() no es necesario y puede estar ocasionando un problema aquí. Lea los documentos en session_register() - está destinado a asignar variables de sesión utilizando variables existentes.

y desde here:

Bueno, session_register() le dice a PHP que una cierta variable global debe ser considerada como una variable de sesión.Eso significa que al final de la ejecución de la secuencia de comandos (que es cuando normalmente se producen las grabaciones de datos de sesión), el valor resultante de esa variable global se escribirá utilizando los controladores de sesión activados actuales.

Creo que este es el problema que está experimentando. Al final de la ejecución del script, la variable de sesión se sobreescribe.

+0

Sí, session_register() ha quedado obsoleto por bastante tiempo, definitivamente no debería usarse más. No sé si está causando este problema específico, pero no debería estar en ese código independientemente. –

+0

Interesante. Estoy trabajando desde un libro introductorio PHP/SQL que es copyright '07, y el código es más o menos una cita directa. Desafortunadamente, la eliminación de las líneas session_register() no parece resolver el problema. Muchas gracias por la información. –

0

Utilice algún tipo de herramienta y compruebe los encabezados http para que pueda ver cómo se está enviando la cookie. Tal vez su servidor web esté configurado incorrectamente y envíe cookies con un dominio diferente no válido.

Es posible que desee ver hacer session_set_cookie_params() en cada solicitud y asegurarse de que el dominio correcto, la ruta y demás estén configurados.

-1

Utilice session_register en ambos archivos y debería funcionar.

+0

Gracias por la sugerencia. Lo intenté de ambas maneras, con las líneas session_register() en ambos archivos, y sin. No apareció ningún cambio en el comportamiento. –

+0

session_register está en desuso: no lo use si puede evitarlo – rhodesjason

+0

@Jason: ¿desea compartir un URL donde dice que está en desuso? ¿Qué debería usarse en su lugar? –

2

Un error que veo es que en el primer archivo está configurando $_SESSION['textvar'] y en el segundo archivo está llamando al $_SESSION['newvar'].

Además, probé su código en un servidor que sé que está funcionando y funcionó bien que no sea el error anterior.

También traté de eliminar el session_register() y el código sigue funcionando perfectamente.

+0

Buen ojo - "newvar" era un error tipográfico, que quedó de cuando copié el código en nuevos archivos más simples. Pero la solución session_register() no funciona en mi sistema. Muchas gracias por la sugerencia. –

+0

¿Ha intentado borrar sus cookies (o eliminar esta cookie de sitios) y acceder a esta página como la primera a la que accede? Además, ¿estás seguro de que no hay ningún otro texto arriba o el

1

"session_register() acepta un número variable de argumentos, cualquiera de los cuales puede ser una cadena que contiene el nombre de una variable o una matriz que consiste de nombres de variables u otras matrices. Para cada nombre, session_register() registra la variable global con ese nombre en la sesión actual. "

porque no tiene variables con esos nombres, el resultado será impredecible.

sólo tiene que utilizar $_SESSION[$key] = $value;

1

Si todo lo anterior no resuelve el problema, voy sólo hay que preguntar lo obvio: No haber wouldn't espacios o nuevas líneas antes de la etiqueta de apertura php?

También puede verificar los mensajes en el archivo de registro de errores del servidor, que deberían indicarle si sus variables están definidas (aunque supongo que eso también depende del nivel de informe de errores).

0

Otra cosa obvia para comprobar:

Asegúrese de que el espacio en disco no está lleno; lo que evitaría que se guarden los datos de la sesión.

0

Sepa que esta es una publicación anterior, pero he tenido un problema similar (no se usa session_register()). Tuve que convertir sesiones en cookies porque la sesión se agotaba demasiado y, debido a la configuración del servidor ('especial' servidor de Windows entorno de alojamiento (con Apache)), el valor de tiempo de sesión de PHP no se pudo cambiar .

El resultado final fue/es que ahora, después de convertir a las cookies con vida útil prolongada, ¿los datos de la cookie aún se están perdiendo (en la transmisión)? a veces.

Muy frustrante.

NUNCA HICE que esto ocurra en un entorno LAMP, por lo que quizás la pregunta que debe hacer es si está utilizando un servidor LAMP o no.

Espero que esto ayude. No creo que esto sea un problema de PHP.

3

Tenía el mismo problema. La razón fue, en php.ini Establecí el valor de parámetro session.cookie_secure en . Pero estaba usando http en lugar de https en la url. El uso de https resolvió el problema.

Configuración de session.cookie_secure = 1 indica que las cookies solo se deben enviar a través de conexiones seguras. Por lo tanto, obtenía nuevas session_ids en cada página nueva mientras usaba http.

0

Compruebe los registros del servidor de su servidor PHP, por ejemplo, nginx o apache.

Puede encontrar información sobre por qué las sesiones no funcionan en nginx error.log. La ruta a ese archivo generalmente es: /var/log/nginx/error.log.

En mi caso, decía que los datos de la sesión no se pueden guardar. Resultó que en el mismo directorio el archivo antiguo error.log.1 tenía un tamaño de 17 GB y tomaba todo el espacio disponible en el disco.

Simplemente liberar espacio en el disco restauró el comportamiento normal de las sesiones.

Cuestiones relacionadas