2012-08-01 47 views
13

Tengo un sitio web de una página que usa AJAX para cargar nuevos archivos php y actualizar la pantalla.Variables de sesión PHP no preservadas con ajax

Comienzo mi sesión php en la página principal, pero cuando uso ajax para actualizar inner html necesito esas variables de sesión para el nuevo archivo php que se está cargando.

Esta publicación es similar a esta: PHP Session Variables Not Preserved. Pero he comprobado y mi php.ini tiene session.use_cookies = 1

Página Principal PHP:

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
{$_SESSION['views']=$_SESSION['views']+1;} 
else 
{$_SESSION['views']=1;} 
?> 

Después de la entrada de usuario que utilizar AJAX para llamar a un archivo PHP y cargar una subsección de la página:

<?php  
if(isset($_SESSION['views'])) 
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";} 
?> 

¿Puede alguien decirme qué paso importante me falta? Gracias.

Actualización: Después de agregar la llamada a session_id() tanto en la página principal como en la secundaria, veo que ambas páginas tienen el mismo Session_ID. Sin embargo, todavía no puede extraer la variable de sesión y si le asigno un valor, las dos variables de sesión del mismo nombre se mantienen independientes entre sí.

Respondo a la pregunta que creó esta pregunta: Encontré que tenía que establecer una ruta estática de session_save en mi archivo php.ini. Con la mayoría de los servicios de alojamiento web pagos, solo tienen un contenedor predeterminado para las sesiones, pero se ve afectado por el equilibrio de carga. Qué significa.

+0

Cuando uso session_start() en el nuevo archivo se crea una nueva sesión. ¿Hay alguna forma de vincular estas sesiones? – Quinma

+0

Lo que "vincula" a las sesiones es la cookie de sesión, que debe estar en el encabezado Cookie de la solicitud HTTP ... – Peter

+0

No está utilizando un servidor web de carga equilibrada, ¿o sí? (cuando se utiliza el almacén de respaldo predeterminado basado en archivos para sesiones de PHP, naturalmente no hay forma de que los hosts compartan información de sesión) – Peter

Respuesta

24

Creo que falta session_start() en la página que Ajax llama.

que necesita:

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";} 
?> 
+0

Esto crea una nueva sesión y $ _SESSION ['views'] son ​​números diferentes para la página principal y la página secundaria. – Quinma

+0

¿Está esto en un subdominio o ruta de acceso diferente en el servidor? Debería usar la misma sesión si la cookie coincide. – drew010

+0

Acabo de ejecutar session_id() desde ambos archivos y es el mismo. pero todavía no tira de la variable. – Quinma

5

lo necesario para empezar la sesión session_start() en el otro archivo PHP también, la persona que está llamando a través de AJAX.

1

En el caso de utilizar un servicio de alojamiento web de pago predeterminada para guardar la sesión de ruta se establece automáticamente como esto:

http://php.net/session.save-path 
session.save_path = "/tmp/" 

Es necesario colocar la ruta estática a la carpeta raíz allí.

1

Me encontré con lo que pensé que era el mismo problema al ejecutar PHP 7 en IIS Server 2012 en la actualidad.

había añadido:

if(!isset($_SESSION)) 
{ 
    session_start(); 
} 

al inicio de cada archivo de AJAX, pero mantuvo que recibe el siguiente aviso de PHP:

PHP Notice: A session had already been started - ignoring session_start() 

Un poco de búsqueda me llevó a este hilo que me señaló en la dirección correcta para resolver los problemas que encontré. Esperamos que la siguiente información ayude a otros a enfrentar el mismo problema.

Después de verificar la sesión. Se estableció el valor de la ruta_save, en mi caso C: \ Windows \ Temp, consideré que los permisos de la carpeta coinciden con los de la cuenta de usuario con la que ejecutaba IIS.

En mi caso, resultó que el directorio que había designado para el almacenamiento de la sesión (en php.ini) no tenía el mismo usuario (permisos de seguridad) asignados como el que estaba ejecutando el sitio de IIS.

Es de interés que las sesiones funcionen bien cuando no se utilizan las solicitudes AJAX antes de agregar los nuevos permisos de usuario. Sin embargo, AJAX no retomó la sesión hasta que hubo corregido el problema de los permisos. Agregar la misma cuenta de usuario con la que se ejecuta IIS resolvió inmediatamente este problema.

0

Necesita inicializar la sesión antes de intentar iniciar sesión mediante una llamada jaja.

session_start(); 

Initialize en la parte superior de la página desde donde se inicia la llamada ajax inicio de sesión.

Para que SESSIONID se cree y almacene la cookie del navegador. Y enviado junto con el encabezado de solicitud durante la llamada ajax, si realiza la solicitud ajax al mismo dominio

Para las sucesivas llamadas ajax, el navegador utilizará el SESSIONID que creó y almacenó inicialmente en la cookie del navegador, a menos que borremos la cookie del navegador o cierre la sesión (o configure otra cookie)

0

Está tratando de utilizar los datos de sesión existentes de su aplicación en una llamada ajax. Para hacer eso, cambiar la forma en que está llamando session_start así:

// With ajax calls 
if (session_status()==1) { 
    session_start(); 
} 

Al hacer llamadas Ajax a php scripts que necesitan los datos de sesión existentes, utilice session_start después session_status.

http://php.net/session_status

Cuestiones relacionadas