2012-05-23 69 views
5

Tôi làm theo các câu trả lời từ đây nhưng nó đã không làm việc cho tôi:
Is possible to keep session even after the browser is closed?Làm thế nào để giữ một phiên mở sau khi trình duyệt đóng trong PHP?

Đây là mã tôi đã cố gắng:

$session_life = 2592000; // 30 days 
session_set_cookie_params($session_life); 
session_name('my_cart'); 
session_start(); 
// update the session_life 
setcookie(session_name(),session_id(),time()+$session_life); 

Vấn đề ở đây là rằng mỗi khi trình duyệt Tôi vẫn nhận được một session_id mới, không phải là session_id cũ.

Tôi đang sử dụng cơ sở dữ liệu để lưu trữ các mục trong 'my_cart' và session_id chỉ được sử dụng để xác định người dùng hiển thị cho họ giỏ hàng của riêng họ.

Cách tốt nhất để giữ cho giỏ hàng của người dùng tồn tại trong 30 ngày là gì?


Đây là mã tôi đã kết thúc với:

$cart_name = "my_cart"; 
$cart_life = 2592000; // 30 days 
session_start(); 
if (isset($_COOKIE[$cart_name])) { 
    session_id($_COOKIE[$cart_name]); 
} 
setcookie($cart_name, session_id(), time()+$cart_life); 
+1

Có lẽ đây là một công việc cho cookie chứ không phải phiên. – mawburn

+0

Phiên của bạn cũng có thể hết hạn trên máy chủ. Tham số php [session.gc_maxlifetime] (http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime) xác định thời gian tối đa mà thông tin phiên được giữ xung quanh trước khi nó là rác được thu thập. –

Trả lời

3

Tôi đã phải làm một điều tương tự với một trang web tôi đã viết (cho phép một khoảng thời gian 30 phút cho một khách hàng nhập mã)

Thay vì sử dụng cookie (vì bạn không thể đảm bảo rằng khách hàng sẽ quay lại trang web trong cùng một trình duyệt), tôi đã lưu trữ thời gian hết hạn cho mã chống lại hồ sơ của người dùng. Bằng cách đó, bất kỳ trình duyệt nào họ truy cập trang từ (ví dụ: bắt đầu từ thiết bị di động, hoàn tất trên máy tính để bàn), chúng sẽ luôn hết hạn cùng một lúc.

Khi trở về khách hàng vào trang web, tôi so sánh thời điểm hiện tại đến thời điểm hết hạn và hành động phù hợp

Như bạn đã lưu trữ giỏ của khách hàng, tôi sẽ thêm một thời gian hết hạn so với kỷ lục và sau đó chạy so sánh khi khách hàng quay trở lại. Đó là khá dễ dàng để làm:

update basket set expiryDateTime=date_add(now(),interval 7 day) where basketID=[xyz] 

Nếu bạn muốn, bạn thậm chí có thể thiết lập thời gian trong ngày để có một giá trị tiêu chuẩn (20:00) bằng cách sử dụng thủ đoạn gian trá hơn một chút trong MySQL

+0

Cảm ơn nhưng điều đó chỉ hoạt động khi khách hàng đăng nhập. Tôi cũng muốn cho phép khách hàng thêm các mặt hàng vào giỏ mà không phải đăng ký. Bên cạnh đó mà tôi đã giữ một lĩnh vực last_update trong cơ sở dữ liệu chống lại hồ sơ giỏ hàng. (Ý tôi là, tôi sẽ làm điều này cho các khách hàng đã đăng ký). – user1275136

+0

Trong trường hợp đó, lưu trữ giỏ trong một cookie (như một chuỗi JSON) với một giá trị ngày hết hạn quá. Khi họ quay trở lại, hãy kiểm tra cookie và hết hạn bất kỳ mục nào cần phải có. Chỉ cần đảm bảo rằng không có thông tin cá nhân nào được lưu trữ trong cookie. Nếu họ cần đăng ký để thực sự đến phần thanh toán/thanh toán, chuyển thông tin cho DB khi họ đã đăng ký thành công và chỉ sử dụng DB từ đó vào (ví dụ: cookie chưa đăng ký, DB đã đăng ký) . Điều này cũng sẽ cho phép tìm kiếm lịch sử đơn đặt hàng. – DaveyBoy

+0

Xin lỗi tôi không nghĩ rằng bạn hiểu tôi. Tôi đang lưu trữ giỏ hàng trong cơ sở dữ liệu, và đối với khách hàng đã đăng ký, tôi sẽ tìm thấy những chiếc xe mà họ sở hữu từ cơ sở dữ liệu. Tất cả những gì tôi đang cố gắng làm ở đây là khi trình duyệt được đóng, hãy duy trì session_id từ trước để khách hàng chưa đăng ký sẽ thấy giỏ hàng của họ từ trước. Vì vậy, tôi đã tạo một phiên theo tên phiên và đặt phiên hết hạn sau 30 ngày, nhưng nó vẫn có vẻ hết hạn khi trình duyệt bị đóng.Tôi phải làm gì để sửa lỗi đó? Tôi chỉ cần id phiên từ trước để xác định giỏ hàng đã được lưu trữ trong cơ sở dữ liệu. cảm ơn – user1275136

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