2009-03-04 30 views
36

Sau khi thực hiện một chút xử lý, tôi muốn đặt giá trị cookie cho đầu vào của người dùng và sau đó chuyển hướng chúng đến một trang mới. Tuy nhiên, cookie không được thiết lập. Nếu tôi nhận xét chuyển hướng, thì cookie được đặt thành công. Tôi cho rằng đây là một vấn đề tiêu đề của một số loại. Giải pháp tốt nhất cho tình huống này là gì?Làm cách nào để tôi có thể đặt cookie và sau đó chuyển hướng trong PHP?

if($form_submitted) { 
    ... 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30); 
    header("Location: $url"); 
    exit; 
} 

Lưu ý rằng setcookie trả về true trong cả hai trường hợp và tôi không nhận được lỗi/cảnh báo/thông báo.

EDIT: Tôi đang sử dụng Unix/Apache/MySQL/PHP

+1

Bạn hãy thử thiết lập cookie sau header()? –

+0

sikx - Cookie không được đặt nếu tôi sử dụng tiêu đề() trước tiên. – Wickethewok

+0

Tôi gặp sự cố trong đó 'Vị trí: http: // domain.com/asd' sẽ không lưu cookie. Làm 'Location:/asd' đã giải quyết nó cho tôi. – Znarkus

Trả lời

65

Nếu bạn có url của con người hoặc các thư mục con (như www.domain.com/path1/path2/), sau đó bạn phải thiết lập đường dẫn cookie để/làm việc cho tất cả các con đường, không chỉ là một hiện tại.

if($form_submitted) { 
    ... 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/'); 
    header("Location: $url"); 
    exit; 
} 

Từ PHP dẫn sử dụng:

Đường dẫn trên máy chủ trong đó cookie sẽ có mặt trên. Nếu được đặt thành '/', cookie sẽ có sẵn trong toàn bộ miền. Nếu được đặt thành '/ foo /', cookie sẽ chỉ là có sẵn trong thư mục/foo/ và tất cả các thư mục con như /foo/bar/of domain. Giá trị mặc định là thư mục hiện tại mà các cookie được thiết lập trong.

+4

Sau đó, bạn nên hỏi @QuestionMark. – Xeoncross

+3

slash ít khó chịu – petermeissner

2

How are you thử nghiệm nếu cookie được thiết lập? Cookie có sẵn trên trang tiếp theo sau khi được đặt.

Common cạm bẫy:

Cookies sẽ không trở thành có thể nhìn thấy cho đến khi nạp tiếp theo của một trang mà cookie nên rõ ràng cho. Để kiểm tra xem cookie đã được đặt thành công chưa, hãy kiểm tra cookie trên trang tải tiếp theo trước khi cookie hết hạn. Thời gian hết hạn được đặt qua thông số hết hạn. Cách tốt nhất để gỡ lỗi sự tồn tại của cookie là chỉ cần gọi print_r ($ _ COOKIE) ;.

+0

Tôi đã kiểm tra xem cookie có được đặt thông qua plugin trình duyệt hay không. Ngay cả khi tôi sau đó điều hướng đến một trang khác và kiểm tra cookie của tôi, nó chưa được đặt. – Wickethewok

4

Tôi giả sử bạn đang chạy IIS? Có một lỗi đã biết với các phiên bản IIS dưới 7 khi cố gắng đặt cả cookie và tiêu đề vị trí trong cùng một yêu cầu.

http://support.microsoft.com/kb/q176113/

+1

Tôi đang sử dụng IIS và nhấn vấn đề chính xác này. Bạn có biết cách giải quyết trong tập lệnh .php không? –

2

tôi đã có thể giải quyết vấn đề này bằng cách sử dụng một chút chậm trễ trong tiêu đề làm mới. Chúng tôi đặt tiêu đề (phải được thực hiện trước bất kỳ phương thức nào có thể xuất ra, như setcookie), rồi đặt cookie. Tôi đã thêm một tin nhắn để người dùng không nhìn thấy màn hình trống trong vài giây đó.

header("refresh: 2; url=$url"); 
    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/'); 
    echo "Processing, please wait..."; 
+2

đó là tiếng vang gây ra điều này để làm việc, không phải là tiêu đề. Bạn đang gửi phản hồi cho trình duyệt, điều này khiến cookie cũng được gửi đi. chỉ cần thiết lập các cookie sau đó chuyển hướng không làm một trạng thái 302 cho trình duyệt, nó chỉ chuyển phía máy chủ xử lý, vì vậy khách hàng không bao giờ biết về cookie. – frumbert

+0

Lưu ý và được bình chọn! – atonyc

+0

@frumbert "chỉ cần đặt cookie sau đó chuyển hướng không thực hiện trạng thái 302 cho trình duyệt" - có. "nó chỉ chuyển giao phía máy chủ xử lý" - không có nó không. (?) Câu hỏi này đã có một câu trả lời được chấp nhận mà chỉ làm điều đó (mà không làm việc). – MrWhite

0

Sử dụng một URL có liên quan trong tiêu đề:

@Header("Location: orders_9090_1.php"); 
+0

Dude, loại bỏ @ xin vui lòng, nó phải bị cấm từ mã hóa. Nếu một hàm cho bạn biết một tin nhắn, hãy đọc nó, hiểu nó, giải quyết nó. Không phải "giấu nó". – Runerod

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