2012-01-18 8 views
7

Mam pewne dziwne problemy ze zmiennymi SESSION na moim koszyku zakupów online PHP/Ajax.

Kiedy po raz pierwszy wyświetlam stronę, SESJA jest tworzona i działa na stronie. Kiedy przejdę do innej strony PHP w tym samym katalogu, SESJA zostanie całkowicie utracona. Dziwne jest to, że dzieje się to tylko raz:. Gdy użytkownik przechodzi przez proces całkowitej utraty SESJI po zmianie strony, SESJA działa w całości na całym wózku.

Zacząłem osobiście wysyłać mailem dane o stanie zmiennym zarówno danych $ _SESSION, jak i $ _SERVER na każdym widoku strony. Wygląda na to, że po pierwszym wyświetleniu strony SESJA istnieje i zawiera dane. Jednak w zmiennej $ _SERVER ['HTTP_COOKIE'] nie ma generatora PHPSESSID. Po przejściu na inną stronę zostanie utworzony PHPSESSID i SESJA zacznie działać, ale początkowe dane SESJI z widoku pierwszej strony zostaną utracone.

Czy istnieje sposób na wygenerowanie PHPSESSID, jeśli nie został jeszcze wygenerowany dla SESJI? Czy jest to typowe zachowanie i jest nieistotne dla mojego losowego problemu utraty SESJI? Używam PHP 5.2.

Każda strona w koszyku rozpoczyna się dokładnie w ten sam sposób:

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

a następnie w górnej części header_cart.php znajduje się:

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

Wszystkie rodzaje zabawy czytania [tutaj] (http://php.net/manual/en/function.session-id.php). Nie wiem, czy to już sprawdziłeś. Czy jesteś pewien, że 'session_start()' nie ulega awarii podczas pierwszego połączenia? – afuzzyllama

+0

Każda strona w koszyku używa tego samego pliku nagłówkowego, więc nie sądzę, że to jest to. Być może użycie parametru session_regenerate_id(), jeśli nie ustawiono PHPSESSID, może pomóc. – unsunghero

+0

Ale możesz stracić informacje o koszyku, ponieważ sesja się zmienia? =/ – afuzzyllama

Odpowiedz

1

Okazało się, że rozpoznajemy mydomain.com i www.mydomain.com jako oddzielne sesje i przechowywaliśmy 2 pliki cookie z 2 różnymi PHPSESSIDami.

Dodałem to do mojego pliku .htaccess, aby zawsze przekierowywać witrynę mydomain.com/shop na adres www.mydomain.com/shop zarówno dla http, jak i 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

masz zaznaczone, że nie ma wyjścia przed twoje wywołanie session_start()? (Nawet nie ma białej litery!).

Nagłówki HTTP nie mogą być wysyłane po przepłukaniu żadnego wyjścia, co może spowodować próbę poinformowania klienta o niepowodzeniu początkowego pliku cookie sesji.

1

Czy przełączasz się między http: i https:? Czasami są traktowane jako dwie oddzielne domeny, a klucz nie może być dzielony między nimi.

+0

Dwie strony, które przełączam, to zarówno http: //. Po przejściu na stronę płatności przełączam się na https: //, ale sesja zostaje utracona między dwiema stronami http: //. – unsunghero