2012-01-18 13 views
7

Estoy experimentando algunos problemas extraños con las variables de SESIÓN en mi carrito de compras en línea PHP/Ajax.

Cuando veo la página por primera vez, la SESIÓN se crea y funciona dentro de la página. Luego, cuando navego a otra página PHP dentro del mismo directorio, SESSION se pierde por completo. Lo extraño es que esto solo ocurre una vez. Una vez que el usuario pasa por este proceso de perder completamente su SESIÓN al cambiar de página, la SESIÓN funciona en su totalidad en todo el carro.

Empecé a enviar mis propias var_exportaciones de los datos $ _SESSION y $ _SERVER en cada vista de página. Parece que cuando una página se ve por primera vez, la SESIÓN existe y contiene datos. Sin embargo, no hay PHPSESSID generado en la variable $ _SERVER ['HTTP_COOKIE']. Al navegar a otra página, se crea el PHPSESSID y la SESIÓN comenzará a funcionar, pero los datos iniciales de SESSION de la primera vista de la página se perderán.

¿Hay alguna manera de generar un PHPSESSID si todavía no se ha generado uno para SESSION? ¿O es este comportamiento típico y es irrelevante para mi problema de pérdida SESSION al azar? Estoy usando PHP 5.2.

Cada página en el carro comienza exactamente de la misma manera:

$title="Title"; 
$keywords="keywords"; 
$description="description"; 
@include('../header_cart.php'); 

Y a continuación, en la parte superior de header_cart.php existe:

session_start(); 
if(!isset($_SESSION['active'])){ 
    $_SESSION['active']=$_SERVER['REMOTE_ADDR']; 
} 
+0

Todo tipo de lectura divertida [aquí] (http://php.net/manual/en/function.session-id.php). No sé si ya lo has comprobado. ¿Estás seguro de que 'session_start()' no está fallando en tu primera llamada? – afuzzyllama

+0

Todas las páginas del carro usan el mismo archivo de encabezado, así que no creo que sea eso. Tal vez usar session_regenerate_id() si el PHPSESSID no está configurado podría ayudar. – unsunghero

+0

¿Pero luego puede perder la información de su carrito porque la sesión cambia? =/ – afuzzyllama

Respuesta

1

Resulta que estaba reconociendo mydomain.com y www.mydomain.com como sesiones separadas y almacenaba 2 cookies con 2 PHPSESSID diferentes.

He añadido esto a mi archivo .htaccess para siempre redirigir mydomain.com/shop a www.mydomain.com/shop para http y https.

RewriteEngine On 

#force http://www. to make sure SESSION data is always the same 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{REQUEST_URI} shop 
RewriteRule ^(.*)$ http://www.mydomain.com/shop/$1 [R,L] 

#force https://www. to make sure SESSION data is always the same 
RewriteCond %{HTTPS} on 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{REQUEST_URI} shop 
RewriteRule ^(.*)$ https://www.mydomain.com/shop/$1 [R,L] 
1

Ha comprobado que no hay salida antes su llamada a session_start()? (¡Ni siquiera un personaje de espacio en blanco!).

No se pueden enviar encabezados HTTP después de que se haya descargado ningún resultado, por lo que podría estar causando el intento de decirle al cliente que falle la cookie de sesión inicial.

1

¿Está cambiando entre http: y https:? A veces se tratan como dos dominios separados, y una clave puede no ser compartida entre ellos.

+0

Las dos páginas que estoy cambiando son ambas http: //. Cambio a https: // cuando llego a la página de pago, pero la sesión se pierde entre las dos páginas http: //. – unsunghero

Cuestiones relacionadas