Xóa cookie


260

Khi tôi muốn xóa Cookie, tôi thử

unset($_COOKIE['hello']);

Tôi thấy trong trình duyệt cookie của mình từ firefox rằng cookie vẫn tồn tại. Làm thế nào tôi thực sự có thể loại bỏ cookie?


Bạn có thể tìm thấy $cookie->delete()từ github.com/delight-im/PHP-Cookie hữu ích. Mã từ câu hỏi chỉ xóa thuộc tính đã được phân tích cú pháp ở phía máy chủ. Các cookie sẽ vẫn sống ở phía khách hàng.
caw

Câu trả lời:


280

Bạn có thể thử cái này

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}

141
Tôi hiểu rằng đây là một ví dụ, nhưng vui lòng không bao giờ lưu tên người dùng hoặc mật khẩu trong cookie.
tamasd

3
Thật vô nghĩa unset($_COOKIE['Hello']);. Nó không thay đổi gì nếu bạn loại bỏ nó.
máy móc

30
@machineaddict unset($_COOKIE['Hello']);thực sự quan trọng nếu bạn có thể kiểm tra cookie ở đâu đó sau này trong mã.
Andreas Hultgren

4
hoạt động tốt nhưng khi thử tải lại trang. Nó thấy cookie được thiết lập với dữ liệu cũ tại sao?.
Nilesh tuần tra

9
======= KHÔNG LÀM VIỆC TRONG GIÁNG SINH được đặt thành 1 giây trước kỷ nguyên (ví dụ: 1969-12-31 23:59:59) tuy nhiên khi tôi gửi trang tiếp theo, cookie sẽ được gửi đến máy chủ. Khi tôi thay đổi -1 thành 1 (ví dụ 1970-01-01 00:00:01) để đưa ra lệnh sau: setcookie ('Hello', null, 1, '/'); sau đó chrome đã hành động như mong đợi và không gửi cookie
Peter Hinds

284

Đặt giá trị thành "" và ngày hết hạn thành ngày hôm qua (hoặc bất kỳ ngày nào trong quá khứ)

setcookie("hello", "", time()-3600);

Sau đó, cookie sẽ hết hạn vào lần tải trang tiếp theo.


10
Làm thế nào về việc đặt thời gian về 0 (kỷ nguyên)? =]
strager

12
Nếu bạn đặt một ngày quá xa trong quá khứ, IE sẽ sủa và igores nó, tức là giá trị sẽ không bị xóa.
Julien

52
@strager Các nhãn hiệu trạng thái: Nếu thiết lập để 0, hoặc bỏ qua, cookie sẽ hết hạn vào cuối phiên (khi đóng trình duyệt). Điều đó không thực sự xóa cookie. Tôi thực sự không biết IE sẽ làm những gì Julien nói, nhưng nhiều khả năng IE sẽ làm điều gì đó kỳ lạ.
yannis

31
Ngoài ra, đừng quên thực sự bỏ đặt ($ _ COOKIE ["xin chào"]), bởi vì nếu có mã trên phần còn lại của trang nhìn vào $ _COOKIE ["xin chào"], nó vẫn sẽ tìm thấy nó được đặt. Tôi chỉ có một chút bởi cái này
Magmatic

12
Ngoài ra, đó là một ý tưởng tốt để đặt đường dẫn, vì vậy setcookie ('xin chào', '', thời gian () - 3600, '/');
Stephan Weinhold

227

Một cách sạch để xóa cookie là xóa cả $_COOKIEtệp cookie giá trị và trình duyệt:

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}

3
Đây là phương pháp tốt nhất, vì bạn không cần làm mới trang!
MaxV

19
Tôi tiếp tục đi xuống trang và câu trả lời tiếp tục tốt hơn, hài hước. Nhưng đây là một trong những tốt nhất, ngừng tìm kiếm ở đây.
Andrew

23
FYI, nếu bạn đặt cookie bằng một đường dẫn, bạn cũng sẽ cần bao gồm đường dẫn trong setcookiecuộc gọi này :setcookie('key', '', time() - 3600, '/');
Gavin

1
@Gavin Cảm ơn vì mẹo đó. Tôi đã tự hỏi tại sao nó không xóa, nhưng đã unsettingthành công.
stinkysGTI

1
Đối với bất kỳ ai đang kiểm tra sự tồn tại của cookie và quan tâm đến các cookie tồn tại với nullcác giá trị, bạn sẽ cần sử dụng mảng_key_exists () , vì một cookie có nullgiá trị sẽ không được tìm thấy bằng isset()séc.
Leith

27

Để xóa một cách đáng tin cậy một cookie, nó không đủ để đặt nó hết hạn bất cứ lúc nào trong quá khứ, như được tính toán bởi máy chủ PHP của bạn. Điều này là do các máy khách có thể và thường có thời gian khác với máy chủ của bạn.

Cách thực hành tốt nhất là ghi đè cookie hiện tại bằng cookie trống sẽ hết hạn một giây trong tương lai sau kỷ nguyên (ngày 1 tháng 1 năm 1970 00:00:00 UTC), như vậy:

setcookie("hello", "", 1);

13
Chỉnh sửa cho tôi nếu tôi sai, nhưng đặt nó thành "1" sẽ đặt nó thành một giây sau kỷ nguyên, không phải một giây trong tương lai ..? Tôi tin rằng bạn đã đúng về sự khác biệt múi giờ, vì vậy giải pháp tốt nhất là đặt nó thành 2 ngày trong quá khứ (vì vậy ngay cả múi giờ xa nhất vẫn sẽ không đặt cookie).
PaulSkinner

@PaulSkinner ngày kỷ nguyên không phụ thuộc vào múi giờ, máy tính thực hiện tính toán đó cho bạn.
AlexR

3
@AlexR Có. Không thực sự trả lời quan điểm của tôi mặc dù. Theo hiểu biết của tôi, đoạn mã trên không đặt cookie hết hạn trong quá khứ (một giây qua kỷ nguyên), trừ khi tôi nhầm.
PaulSkinner

@PaulSkinner tất nhiên, phần còn lại của bình luận của bạn là hoàn toàn tốt.
AlexR

9
+1 cho "1". Tôi không hiểu tại sao tất cả những người khác đã cố định như vậy khi đặt cookie bị xóa chính xác một giờ trong quá khứ.
Meisner

20

Điều đó sẽ bỏ đặt cookie trong mã của bạn, nhưng vì biến $ _COOKIE được làm mới trên mỗi yêu cầu, nên nó sẽ quay lại yêu cầu trang tiếp theo.

Để thực sự thoát khỏi cookie, hãy đặt ngày hết hạn trong quá khứ:

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

1
Không có bất kỳ nhu cầu cho unset()cookie?
Pratik

2
@PratikCJoshi Chỉ khi mã của bạn tìm kiếm nó sau này.
AlphaMycelium

14

Tôi đã có cùng một vấn đề trong mã của tôi và thấy rằng đó là một vấn đề đường dẫn cookie. Kiểm tra bài viết tràn ngăn xếp này: Không thể xóa cookie đặt php

Tôi đã đặt cookie bằng cách sử dụng giá trị đường dẫn là "/", nhưng không có bất kỳ giá trị đường dẫn nào khi tôi cố gắng xóa nó, vì vậy nó không rõ ràng. Vì vậy, đây là một ví dụ về những gì đã làm việc:

Đặt cookie:

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

Xóa cookie:

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

Mong rằng sẽ giúp.



7

Xem mẫu có nhãn " Ví dụ xóa ví dụ # 2 setcookie () " từ các tài liệu PHP. Để xóa cookie khỏi trình duyệt, bạn cần thông báo cho trình duyệt biết rằng cookie đã hết hạn ... trình duyệt sẽ xóa nó. unsetvì bạn đã sử dụng, nó chỉ xóa cookie 'xin chào' khỏi mảng COOKIE.


7

Đây là cách mã PHP v7 setcookie () hoạt động khi bạn thực hiện:

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

Từ đầu ra của tcpdump trong khi đánh hơi trên cổng 80, máy chủ sẽ gửi cho khách hàng (Trình duyệt) các tiêu đề HTTP sau:

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

Quan sát các gói trong các yêu cầu sau, Trình duyệt không còn gửi các cookie này trong các tiêu đề


4

Để xóa cookie, bạn chỉ cần đặt giá trị thành NULL:

"Nếu bạn đã đặt cookie với các giá trị không giới hạn cho thời gian hết hạn, đường dẫn hoặc tên miền, bạn phải cung cấp lại các giá trị đó khi bạn xóa cookie để xóa cookie đúng cách." Trích dẫn từ cuốn sách "Học PHP5".

Vì vậy, mã này sẽ hoạt động (làm việc cho tôi):

Đặt cookie: setcookie('foo', 'bar', time() + 60 * 5);

Xóa cookie: setcookie('foo', '', time() + 60 * 5);

Nhưng tôi nhận thấy rằng tất cả mọi người đang thiết lập ngày hết hạn thành quá khứ, điều đó có cần thiết không, và tại sao?


1
Nó đáng tin cậy, đó là lý do tại sao. Một sự kết hợp của việc đặt giá trị thành không có gì và một thời gian trong quá khứ (nhưng không quá xa vì thỉnh thoảng IE không thích nó quá xa so với những gì tôi đã đọc) hoạt động trên bảng.
PaulSkinner

Chuỗi rỗng ''không giống như null.
orev

3

Để xóa tất cả các cookie bạn có thể viết:

foreach ($_COOKIE as $key => $value) {
    unset($value);
    setcookie($key, '', time() - 3600);
}

3
Điều này sẽ không thực sự xóa cookie trừ khi chúng có cùng cài đặt tên miền và đường dẫn như mặc định cho setcookie.
Noishe

2

Chỉ cần đặt ngày hết hạn thành một giờ trước, nếu bạn muốn "xóa" cookie, như thế này:

setcookie ("TestCookie", "", time() - 3600);

hoặc là

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

Nguồn: http://www.php.net/manual/en/feft.setcookie.php

Bạn nên sử dụng filter_input()chức năng cho tất cả các toàn cầu mà khách truy cập có thể nhập / thao tác, như thế này:

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

Bạn có thể đọc thêm về nó ở đây: http://www.php.net/manual/en/feft.filter-input.php và tại đây: http://www.w3schools.com/php/func_filter_input.asp


2

Tôi biết rằng đã có một thời gian dài kể từ khi chủ đề này được tạo ra nhưng tôi đã thấy một lỗi nhỏ trong giải pháp này (tôi có thể gọi nó như thế, bởi vì đó là một chi tiết). Tôi đồng ý rằng giải pháp tốt hơn có lẽ là giải pháp này:

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

Nhưng, trong trường hợp hiện tại, bạn xóa cookie trong mọi trường hợp chức năng unset hoạt động và ngay lập tức bạn tạo cookie mới hết hạn trong trường hợp chức năng unset không hoạt động.

Điều đó có nghĩa là ngay cả khi chức năng unset hoạt động, nó vẫn sẽ có 2 cookie trên máy tính. Mục tiêu được hỏi, theo quan điểm logic, là xóa cookie nếu có thể và nếu thực sự không, hãy làm cho nó hết hạn; để có được kết quả "sạch nhất".

Vì vậy, tôi nghĩ rằng chúng ta nên làm tốt hơn:

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

Cảm ơn và có một ngày tốt đẹp :)


Bỏ đặt hàm có nghĩa là logic của PHP (nếu bạn muốn sử dụng biến $ _COOKIE ['Xin chào'], bạn không thể vì nó không được đặt). Và hàm setcookie có nghĩa là cho hoa tiêu. 2 mục đích khác nhau, thứ tự của các chức năng không có tác động đến mã thực tế.
Kalzem

Trên thực tế, tôi biết nó yep nhưng nếu bạn hoàn toàn muốn chắc chắn rằng cookie đã bị hủy / xóa và vì vậy bạn sử dụng hai giải pháp ngay lập tức, nó sẽ sạch hơn trước khi làm cho chúng hết hạn và sau đó bỏ đặt ra các luận điểm hơn là không đặt ra các luận điểm và sau đó tạo lại một cookie đã hết hạn ... nếu bạn hiểu ý tôi là gì?
Greg

Đúng, xin lỗi trả lời ngay bây giờ :) Tôi đã gửi nó bởi vì tôi đã thấy mọi người làm theo cách khác .. nhưng nó có vẻ thông minh hơn như vậy, tôi nghĩ.
Greg

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

Nếu bạn muốn xóa cookie hoàn toàn khỏi tất cả các tên miền hiện tại của bạn thì đoạn mã sau đây chắc chắn sẽ giúp bạn.

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

Mã này sẽ xóa hoàn toàn biến cookie khỏi tất cả tên miền của bạn; "/" - nó biểu thị tất cả giá trị của biến cookie được đặt cho tất cả tên miền không chỉ cho tên miền hoặc đường dẫn hiện tại. time () - 300 biểu thị rằng nó đặt thành thời gian trước nên nó sẽ hết hạn.

Đó là cách nó hoàn toàn bị xóa.


1

Bạn có thể đặt biến phiên dựa trên giá trị cookie

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

Bạn chỉ có thể sử dụng chức năng tùy chỉnh này:

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

Nếu bạn muốn xóa $ _COOKIE ['user_account'].
Chỉ dùng:

unset_cookie('user_account');

1

Thật đơn giản!

setcookie("cookiename", "cookievalue", 1);

Không cần thiết phải đặt giá trị cho việc xóa cookie!
Amir cho

1

Khi bạn nhập 0thời gian, bạn có nghĩa là "ngay bây giờ" (+ 0 từ bây giờ thực sự là bây giờ) cho trình duyệt và nó sẽ xóa cookie.

setcookie("key", NULL, 0, "/");

Tôi đã kiểm tra nó trong trình duyệt chrome cung cấp cho tôi:

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

Không. Chỉ cần đọc tài liệu. "Nếu được đặt thành 0 hoặc bị bỏ qua, cookie sẽ hết hạn vào cuối phiên (khi trình duyệt đóng)."
DrLightman

@DrLightman Cảm ơn bạn đã tham dự, Bạn có thể vui lòng trích dẫn tài liệu không?
Amir cho

function.setcookie.php , hết hạn tham số. "Nếu được đặt thành 0 hoặc bị bỏ qua, cookie sẽ hết hạn vào cuối phiên (khi trình duyệt đóng)."
DrLightman

1

Chỉ cần đặt giá trị của cookie falseđể bỏ đặt nó,

setcookie('cookiename', false);

Tái bút: - Đó là cách dễ nhất để làm điều đó.


-1

Bạn phải xóa cookie bằng php trong máy chủ của bạn và cả js cho trình duyệt của bạn .. (Chúng đã được tạo bằng php, nhưng các tệp cookie cũng nằm trong ứng dụng trình duyệt):

Một ví dụ:

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

Bạn không cần JavaScript để đặt / xóa giá trị cookie. Hàm php setcookie sẽ làm điều đó cho bạn php.net/manual/en/feft.setcookie.php
Michael Khalili

-5

Hầu hết các bạn đang quên rằng điều này sẽ chỉ hoạt động trên một máy cục bộ. Trên một miền, bạn sẽ cần một mẫu như ví dụ này.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
Tham số miền sẽ có nghĩa là tên miền hiện tại nếu nó bị bỏ qua.
DustWolf

Tôi muốn nói rằng câu trả lời của bạn là không chính xác. Nó sẽ hoạt động cho bất kỳ tên miền nào, không chỉ máy cục bộ, vì nó sẽ tự động sử dụng tên miền hiện tại. Và bình luận của bạn có nghĩa là nói bạn bị xúc phạm hay gì đó?
DustWolf

Bạn thậm chí đang đọc văn bản được cung cấp trên mã? đừng làm phiền tôi, tôi đang làm việc tôi nói xong với bạn
Peter Gruppelaar

Tôi không hiểu tại sao bạn lại cảm thấy khó chịu với những người dùng khác nếu họ chỉ ra một lỗi trong câu trả lời của bạn. setcookiehoạt động cho bất kỳ tên miền, cho dù localhost hay không.
xorinzor

Vì vậy, nếu mọi người nói, đó là trường hợp ... thì chắc chắn là có gì đó không đúng với câu trả lời của tôi ... chiếc mũ fct nó đã được chỉ ra trên bài đăng này không quan trọng? ... bạn chỉ muốn một số câu trả lời theo hướng và bỏ qua bất kỳ người dùng toàn cầu nào đang làm việc trong một tình huống mô phỏng ... tôi hiểu rồi ... đừng làm phiền tôi, câu trả lời của tôi không sai.
Peter Gruppelaar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.