2012-01-18 32 views
7

Tôi đang gặp một số vấn đề lạ với biến SESSION trên giỏ hàng trực tuyến PHP/Ajax của mình.

Khi tôi lần đầu tiên xem trang, SESSION được tạo và hoạt động trong trang. Sau đó, khi tôi điều hướng đến một trang PHP khác trong cùng thư mục thì SESSION hoàn toàn bị mất. Điều kỳ lạ là điều này chỉ xảy ra sau khi. Khi người dùng trải qua quá trình này hoàn toàn mất SESSION của họ khi thay đổi trang, SESSION hoạt động toàn bộ trên toàn bộ giỏ hàng.

Tôi bắt đầu gửi thư cho bản thân mình var_exports cả hai dữ liệu $ _SESSION và $ _SERVER trên mỗi lần xem trang. Dường như khi một trang được xem lần đầu tiên, SESSION tồn tại và chứa dữ liệu. Tuy nhiên, không có PHPSESSID được tạo trong biến $ _SERVER ['HTTP_COOKIE']. Khi điều hướng đến một trang khác, PHPSESSID được tạo và SESSION sẽ bắt đầu hoạt động, nhưng dữ liệu SESSION ban đầu của chế độ xem trang đầu tiên sẽ bị mất.

Có cách nào để tạo PHPSESSID nếu một chưa được tạo cho SESSION không? Hoặc là hành vi điển hình này và không liên quan đến vấn đề mất mát SESSION ngẫu nhiên của tôi? Tôi đang sử dụng PHP 5.2.

Mỗi trang trong giỏ hàng bắt đầu theo cùng một cách chính xác:

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

Và sau đó ở phía trên cùng của header_cart.php có:

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

Tất cả các loại đọc thú vị tại đây (http://php.net/manual/en/function.session-id.php). Tôi không biết bạn đã kiểm tra điều đó chưa. Bạn có chắc chắn 'session_start()' của bạn không bị thất bại trong lần gọi đầu tiên? – afuzzyllama

+0

Mọi trang trong giỏ hàng đều sử dụng cùng một tệp tiêu đề, vì vậy tôi không nghĩ đó là nó. Có thể sử dụng session_regenerate_id() nếu PHPSESSID không được đặt có thể hữu ích. – unsunghero

+0

Nhưng sau đó bạn có thể mất thông tin giỏ hàng của mình vì phiên thay đổi? =/ – afuzzyllama

Trả lời

1

Hóa ra nó đã nhận ra mydomain.com và www.mydomain.com là các phiên riêng biệt và đã lưu trữ 2 cookie với 2 PHPSESSID khác nhau.

Tôi đã thêm tệp này vào tệp .htaccess của mình để luôn chuyển hướng mydomain.com/shop đến www.mydomain.com/shop cho cả http và 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

Bạn đã kiểm tra rằng không có đầu ra trước cuộc gọi của bạn tới session_start()? (Ngay cả một nhân vật không gian trắng!).

Không thể gửi tiêu đề HTTP sau khi bất kỳ đầu ra nào đã được xóa để có thể khiến cho khách hàng tắt cookie phiên ban đầu.

1

Bạn đang chuyển đổi giữa http: và https:? Đôi khi chúng được coi là hai tên miền riêng biệt và một khóa có thể không được chia sẻ giữa chúng.

+0

Hai trang tôi đang chuyển đổi giữa hai trang đều là http: //. Tôi chuyển sang https: // khi tôi truy cập trang thanh toán nhưng phiên bị mất giữa hai trang http: //. – unsunghero

Các vấn đề liên quan