2013-06-13 23 views
5

tôi muốn sử dụng cookie trong trang web và tôi muốn sử dụng nó để lưu bất kỳ biến tùy chọn nào. nhưng sau khi sử dụng setcookie và làm mới trang isset() không thể phát hiện, tôi phải có nhiều trang làm mới để sử dụng trang đó,Cookie PHP được đặt ở trang làm mới thứ hai

tôi không thể sử dụng nó trong trang làm mới hoặc truy cập đầu tiên.

PHP:

setcookie("user", "Alex Porter", time()+3600); 
if (isset($_COOKIE["user"])) 
    echo "Welcome " . $_COOKIE["user"] . "!<br>"; 
else 
    echo "Welcome guest!<br>"; 

//unset($_COOKIE['user']); 
//setcookie('user', '', time() - 3600); 

KẾT QUẢ:

sau khi lưu và làm mới trang

Welcome guest! 

refresh thứ hai:

Welcome Alex Porter 
+5

Đó là cách nó hoạt động. Cookie được đặt trên phản hồi và được gửi lại với yêu cầu tiếp theo – mplungjan

+0

bản sao có thể có của [PHP Đọc cookie được tạo bằng setcookie()] (http://stackoverflow.com/questions/4148126/php-read-cookies-created-with -setcookie) – mplungjan

Trả lời

6

Khi bạn thiết lập một cookie, nó được gửi tới trình duyệt. Lần sau khi trình duyệt gửi yêu cầu cho một trang, trình duyệt sẽ gửi lại thông tin cookie và trang có thể sử dụng nó.

  1. Trang truy cập trình duyệt (đăng nhập hoặc nội dung tương tự) và gửi KHÔNG có dữ liệu cookie.
  2. Máy chủ đặt cookie (có nghĩa là bao gồm chúng trong tiêu đề của trả lời HTTP).
  3. Trang truy cập trình duyệt và gửi lại dữ liệu cookie.
  4. Máy chủ có thể xem dữ liệu cookie và tận dụng dữ liệu đó.

Để khắc phục, chuyển hướng người dùng đến trang mà bạn muốn hiển thị dữ liệu sau khi cookie đã được đặt, thay vì chỉ hiển thị trang. Bằng cách này, bạn có thể sử dụng dữ liệu cookie.

+0

Tôi đang chuyển hướng trên cùng một trang với một số nhận được biến nhưng tôi nhận được lỗi đã được gửi tiêu đề. – Vikram

+0

Lỗi "tiêu đề đã gửi" được đưa ra bởi vì bạn xuất một cái gì đó trước khi thay đổi tiêu đề (cookie là một phần của tiêu đề). Bạn phải thiết lập cookie của bạn trước khi bạn trả về bất kỳ đầu ra nào từ PHP. –

0

Tôi đoán bạn muốn một cái gì đó như thế này:

if (isset($_COOKIE["user"])) 
    echo "Welcome " . $_COOKIE["user"] . "!<br>"; 
else { 
    echo "Welcome guest!<br>"; 
    setcookie("user", "Alex Porter", time()+3600); 
} 
0

Cookie được thiết lập để một con đường cụ thể và tên miền. Bạn nên thay đổi setcookie() thành

setcookie ("user", "Alex Porter", time()+3600, "/", "youdomain.com"); 

Nếu được đặt thành '/', cookie sẽ có sẵn trong toàn bộ miền (youdomain.com).

Cookie sẽ hiển thị sau khi làm mới trang.

Mã của bạn có thể được simplifed cũng như:

echo "Welcome " . isset($_COOKIE["user"]) ? $_COOKIE["user"] : "guest" . "!<br>"; 
+0

Điều này liên quan đến câu hỏi như thế nào? – Leri

+0

anh ta nói rằng cookie không hiển thị có thể là vấn đề với việc thiết lập đường dẫn cookie thích hợp. – Robert

+0

Đọc lại câu hỏi, vui lòng. OP cho biết cookie không có sẵn trong lần sử dụng đầu tiên (tức là khi mã này thực thi trước). – Leri

0

Dữ liệu $_COOKIE được đọc từ dữ liệu yêu cầu của khách hàng và không được viết ngay lập tức bởi setCookie(). Đây là hành vi bình thường và nên được tích hợp vào luồng chương trình của bạn.

Nếu bạn muốn dữ liệu cookie có sẵn ngay lập tức trong trường hợp của bạn, bạn có thể thử một cái gì đó như thế này:

if (isset($_COOKIE["user"])) 
    echo "Welcome " . $_COOKIE["user"] . "!<br>"; 
else { 
    $user = "Alex Porter"; 
    setcookie("user", $user, time()+3600); 
    echo "Welcome $user!<br>"; 
} 
2

Vâng, không có gì sai ở đây là. Lần đầu tiên bạn làm mới, bạn thực sự chạy tập lệnh để đặt cookie. Vì vậy, nó thực hiện các tuyên bố khác.

Khi bạn làm mới lần thứ hai, hàm isset() trả về true và câu lệnh if được thực hiện.

Dưới đây là một mô tả bằng hình ảnh:

enter image description here

Tuy nhiên, có một vấn đề với kịch bản của bạn. Làm mới trang của bạn mọi lúc sẽ cập nhật thời gian cookie thành 3600 seconds. Vì vậy, bạn cần phải thiết lập cookie chỉ khi không có bánh đặt trên trình duyệt của người dùng như thế này:

if (isset($_COOKIE["user"])) 
    echo "Welcome " . $_COOKIE["user"] . "!<br>"; 
else 
{ 
    echo "Welcome guest!<br>"; 
    setcookie("user", "Alex Porter", time()+3600); 
} 
Các vấn đề liên quan