2009-08-30 30 views
6

Tôi đang sử dụng mã sau để làm mất hiệu lực phiên. Tôi đã liên kết với logout.php ở nhiều trang. Nếu liên kết đăng xuất đó được nhấp, trang logout.php sẽ được gọi. Sau đây là mã số trong logout.php.Các sự cố phiên PHP

unset($_SESSION['admin']); 
session_destroy(); 
header('Location: index.php'); 

Khi phiên không hợp lệ, tôi muốn mở trang index.php. Nhưng tôi gặp phải lỗi sau:

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in C:\xampp\htdocs\Selection\logout.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\Selection\logout.php:3) in C:\xampp\htdocs\Selection\logout.php on line 4

Điều gì là sai?

Trả lời

16

Tôi nghĩ rằng bạn không thể gọi hàm session_start() trước khi hủy phiên.

+0

Tại sao lại bao giờ bị giảm giá, anh ấy đúng. –

+0

Cảm ơn ... dù sao session_start() phải được gọi khi bắt đầu tập lệnh. – mck89

8

Bạn sẽ cần gọi session_start() trên đầu trang để nhắc nhở php rằng pagecall này thuộc về phiên. - Ít nhất PHP manual cho biết điều đó.

Các ghi chú trên trang hướng dẫn sử dụng đó gợi ý rằng session_unset() chỉ được sử dụng trong các môi trường cũ hơn không sử dụng biến $ _SESSION.

+0

cũng là một điều tốt khi anh ấy không sử dụng 'session_unset()' sau đó ... – nickf

+0

@nickf: đúng, không nhận ra chính xác –

2

Bạn phải mở phiên đầu tiên:

header('Location: index.php'); 
session_start(); 
session_unset(); 
session_destroy(); 
+1

Tôi nghĩ rằng chuyển hướng phải được đặt ở cuối, bởi vì viết mã như thế này thực hiện chuyển hướng và không thực hiện các chức năng khác – mck89

+0

Không, nó hoạt động như mong đợi. – rodrigoap

+1

Nó chỉ hoạt động như mong đợi vì tập lệnh vẫn hoàn tất việc thực thi sau khi tiêu đề được gửi. Tuy nhiên bạn nên đặt tiêu đề sau khi phiên bị hủy để giảm bớt sự nhầm lẫn của mã. – MitMaro

1

Vấn đề là bạn không thể phá hủy một phiên mà chưa được khởi động. Đó là sau đó nâng cao một cảnh báo đang được lặp lại cho trình duyệt. Vấn đề tiếp theo là bạn không thể gửi tiêu đề sau khi có đầu ra cho trình duyệt, do đó, nó đưa ra một cảnh báo khác.

Bạn chỉ cần kiểm tra xem một phiên tồn tại đầu tiên:

if (session_name() != '') { 
    session_destroy(); 
} 
0

Bạn luôn luôn phải sử dụng session_start(); TRƯỚC KHI sử dụng hàm/biến phiên. Vì vậy, bắt đầu tất cả các tệp PHP với session_start() ;. Ngoài ra logout.php:

session_start(); 
session_destroy(); 
header('Location: index.php'); 

Bạn cũng không cần phải bỏ đặt nó.

+0

Tài liệu PHP rất rõ ràng để tự xóa mảng $ _SESSION với '$ _SESSION = array();'. Tại sao bạn nói bạn không cần phải bỏ đặt nó. [Đây là tài liệu tôi đang đề cập đến] (http://php.net/manual/en/function.session-destroy.php). – doug65536