クッキーを削除する


260

クッキーを削除したいとき

unset($_COOKIE['hello']);

FirefoxのCookieブラウザーで、Cookieがまだ存在していることがわかります。どうすれば本当にクッキーを削除できますか?


あなたは見つけること$cookie->delete()からgithub.com/delight-im/PHP-Cookie役立ちます。質問のコードは、サーバー側で解析されたプロパティを削除するだけです。クッキーはまだクライアント側にあります。
2016

回答:


281

あなたはこれを試すことができます

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

141
これは一例であることを理解していますが、ユーザー名やパスワードをCookieに保存しないでください。
tamasd 2014

3
それは無意味unset($_COOKIE['Hello']);です。削除しても何も変わりません。
machineaddict

30
@machineaddict unset($_COOKIE['Hello']);は、後でコードのどこかでcookieをチェックする場合に実際に重要です。
Andreas Hultgren 14年

4
正常に動作していますが、ページを再読み込みしようとしています。古いデータが設定されたCookieが表示されるのはなぜですか。
Nilesh patel 2015

9
======= Chromeでは機能しません=======今日このコードを試しましたが、Google Chromeを使用してサイトにアクセスし、Chromeの開発者ツールにアクセスすると、有効期限が表示されますエポックの前の1秒に設定されていますが(たとえば、1969-12-31 23:59:59)、次にページを送信すると、Cookieがサーバーに送信されます。-1を1に変更すると(例:1970-01-01 00:00:01)、次のコマンドが表示されます。setcookie( 'Hello'、null、1、 '/'); その後、Chromeは期待どおりに動作し、Cookieを送信しませんでした
Peter Hinds、

284

値を ""に設定し、有効期限を昨日(または過去の任意の日付)に設定します

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

そうすると、次にページが読み込まれたときにCookieが期限切れになります。


10
時間を0(エポック)に設定してみませんか?=]
ストレッジャー2009年

12
過去の日付を入れすぎると、IEはそれを吠えて無視します。つまり、値は削除されません。
ジュリアン、

52
@strager マニュアルには次のように記載されています。0に設定するか、省略した場合、Cookieはセッションの終了時に(ブラウザーが閉じたときに)期限切れになります。 それは本当にクッキーを削除するのではありません。IEがジュリアンの言ったことを実行するかどうかは本当にわかりませんが、IEが奇妙なことをする可能性は十分にあります。
yannis

31
また、実際にunset($ _ COOKIE ["hello"])を忘れないでください。ページの残りの部分に$ _COOKIE ["hello"]を参照するコードがある場合でも、設定されていることがわかります。私はこれに少し噛みつきました。
マグマティック

12
さらに、パスを設定することをお勧めします。したがって、setcookie( 'hello'、 ''、time()-3600、 '/');
Stephan Weinhold 2014

227

Cookieを削除するクリーンな方法は、$_COOKIE値とブラウザCookieファイルの両方をクリアすることです。

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

3
ページを更新する必要がないため、これが最善の方法です。
MaxV 2013年

19
私はページを下に進み続け、答えはどんどん良くなっていきます。しかし、これは最高のものです。ここを見るのをやめてください。
Andrew

23
あなたがパスを使ってクッキーを設定した場合FYI、あなたはこのパスを含める必要がありますsetcookieだけでなくコール:setcookie('key', '', time() - 3600, '/');
ギャビン

1
@ギャビンその先端をありがとう。なぜ削除されなかったのかと思っていましたが、unsetting成功しました。
stinkysGTI 2014年

1
Cookieの存在をチェックしていて、null値とともに存在するCookieに関心がある場合は、代わりにarray_key_exists()を使用する必要があります。これは、null値を持つCookieがisset()チェックによって検出されないためです。
リース2016

27

Cookieを確実に削除するには、PHPサーバーによって計算されるように、過去のいつでも期限切れになるように設定するだけでは不十分です。これは、クライアントコンピューターがサーバーの時間と異なる時間を持つ可能性があるためです。

ベストプラクティスは、1秒に期限が切れる空白クッキーと現在のクッキーを上書きすることで、将来的にように、エポック後(1970年1月1日00:00:00):

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

13
私が間違っている場合は修正してください。ただし、「1」に設定すると、エポックの1秒後ではなく、1秒後に設定されます。タイムゾーンの違いについては正しいと思いますが、最善の解決策は過去2日間に設定することです(そのため、最も遠いタイムゾーンでもCookieの設定が解除されます)。
PaulSkinner 2013

@PaulSkinnerエポック日付はタイムゾーンに依存しません。コンピュータが計算します。
AlexR 2014年

3
@AlexRはい。しかし、私の意見にはあまり答えません。私の理解では、上記のコード、私が誤っていない限り、Cookieを過去(エポックの1秒後)に期限切れに設定します。
PaulSkinner、2014年

@PaulSkinnerはもちろん、コメントの残りの部分は完全に問題ありません。
AlexR 2014年

9
「1」の+1。他のすべての人が、削除されたCookieを正確に1時間だけ設定することに固執している理由がわかりません。
Meisner

20

これにより、コード内のCookieの設定が解除されますが、$ _ COOKIE変数はリクエストごとに更新されるため、次のページリクエストで返されるだけです。

実際にCookieを削除するには、過去の有効期限を設定します。

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

1
unset()クッキーは必要ありませんか?
Pratik、2015年

2
@PratikCJoshiコードが後でそれを探す場合のみ。
AlphaMycelium 2017年

14

コードにも同じ問題があり、Cookieパスの問題であることがわかりました。このスタックオーバーフローの投稿を確認してください:PHPセットCookieを削除できません

「/」のパス値を使用してCookieを設定しましたが、クリアしようとしたときにパス値がなかったため、クリアされませんでした。だから、これがうまくいった例です:

クッキーの設定:

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

Cookieをクリアする:

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

お役に立てば幸いです。



7

PHPのドキュメントの「例#2 setcookie()delete example」というラベルの付いたサンプルを参照してください。ブラウザからCookieをクリアするには、Cookieの有効期限が切れていることをブラウザに通知する必要があります。ブラウザはそれを削除します。unset使用したので、「hello」CookieをCOOKIE配列から削除するだけです。


7

これは、PHP v7のsetcookie()コードが次のように機能する方法です。

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

ポート80でスニッフィング中のtcpdumpの出力から、サーバーはクライアント(ブラウザー)に次のHTTPヘッダーを送信します。

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

次のリクエストでパケットを監視すると、ブラウザはこれらのCookieをヘッダーで送信しなくなります


4

Cookieを削除するには、値をNULLに設定するだけです。

「有効期限、パス、またはドメインにデフォルト以外の値を使用してCookieを設定した場合、Cookieを削除するには、Cookieを削除するときに同じ値を再度指定する必要があります。」「Learning PHP5」の本からの引用。

したがって、このコードは機能するはずです(私にとっては機能します):

クッキーの設定: setcookie('foo', 'bar', time() + 60 * 5);

Cookieを削除する: setcookie('foo', '', time() + 60 * 5);

しかし、私は誰もが有効期限を過去に設定していることに気付きました、それは必要ですか、そしてなぜですか?


1
それは信頼できる、それが理由です。値をなしと過去の時間に設定することの組み合わせ(ただし、IEが時々、私が読んだものから遠く離れすぎないようにするのは遠くないので)は、全体にわたって機能します。
PaulSkinner 2013

空の文字列''はと同じではありませんnull
オレフ2017

3

あなたが書くことができるすべてのクッキーを削除するには:

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

3
setcookieのデフォルトと同じパスとドメイン設定がない限り、これは実際にはcookieを削除しません。
Noishe 2014年

2

次のようにCookieを「削除」する場合は、有効期限を1時間前に設定します。

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

または

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

ソース:http : //www.php.net/manual/en/function.setcookie.php

次のfilter_input()ように、ビジターが入力/操作できるすべてのグローバルに関数を使用する必要があります。

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

詳しくは、http//www.php.net/manual/en/function.filter-input.phpとこちら:http : //www.w3schools.com/php/func_filter_input.aspをご覧ください。


2

このトピックが作成されてから長い年月が経過していることはわかっていますが、このソリューションには少し間違いがありました(詳細なので、そのように呼ぶことができます)。より良い解決策はおそらくこの解決策であることに同意します

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

ただし、この場合は、unset機能が機能するすべてのケースでCookieを削除し、unset機能が機能しない場合にすぐに新しい有効期限切れのCookieを作成します。

つまり、設定解除機能が機能しても、コンピューター上に2つのCookieが存在します。論理的には、尋ねられた目標は、可能な場合はCookieを削除し、実際にはできない場合は期限切れにすることです。「最もクリーンな」結果を得るために。

だから、私たちはもっとやるべきだと思います:

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

ありがとう、そして良い一日を:)


関数unsetは、PHPのロジック用です(変数$ _COOKIE ['Hello']を使用する場合は、設定されていないため使用できません)。そして、関数setcookieはナビゲーター用です。2つの異なる目的、関数の順序は実際のコードに影響を与えません。
カルゼム2014年

実際、私はそれを知っていますが、Cookieが未設定/削除されていることを絶対に確認して、2つのソリューションをすぐに使用する場合は、これらを期限切れにしてから設定を解除するよりも、設定を解除するよりもクリーンです。次に、有効期限が切れたCookieを再作成します。
グレッグ

はい、申し訳ありませんが今返信します:)他の方法で他の人がやっているのを見たので送信しました。
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

現在のすべてのドメインからCookieを完全に削除したい場合は、次のコードが間違いなく役立ちます。

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

このコードは、すべてのドメインからcookie変数を完全に削除します。「/」-現在のドメインまたはパスだけでなく、すべてのドメインにcookie変数の値がすべて設定されていることを示します。time()-300は、期限切れになる前の時刻に設定されることを示します。

それはそれが完全に削除された方法です。


1

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

このカスタマイズ機能を使用するだけです。

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

$ _COOKIE ['user_account']を削除したい場合。
ただ使う:

unset_cookie('user_account');

1

それは簡単です!

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

削除するCookieの値を設定する必要はありません。
Amir Fo

1

0時間を入力すると、ブラウザーの「今」(今から+ 0sは実際は今)を意味し、Cookieを削除します。

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

私はそれを与えるクロムブラウザでそれをチェックしました:

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

いいえ。ドキュメントを読んでください。「0に設定するか、省略した場合、Cookieはセッションの終了時に(ブラウザーが閉じたときに)期限切れになります。」
DrLightman

@DrLightmanご出席いただきありがとうございます。ドキュメントを引用していただけますか?
Amir Fo

function.setcookie.phpexpiresパラメータ。「0に設定するか、省略した場合、Cookieはセッションの終了時に(ブラウザーが閉じたときに)期限切れになります。」
DrLightman

1

設定falseを解除するには、cookieの値をに設定するだけです。

setcookie('cookiename', false);

PS:-それが最も簡単な方法です。


-1

サーバーのphpとブラウザーのjsでcookieを削除する必要があります。(phpで作成されていますが、cookieファイルはブラウザークライアントにもあります):

例:

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']);

Cookieの値を設定/削除するためにJavaScriptは必要ありません。php関数setcookieは、php.net / manual / en / function.setcookie.phpの
Michael Khalili

-5

これはローカルマシンでのみ機能することを忘れています。ドメインでは、この例のようなパターンが必要になります。

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

1
domainパラメーターは、省略されている場合、現在のドメインを意味します。
DustWolf 2016

私はあなたの答えが間違っていると言うつもりでした。現在のドメインを自動的に使用するため、ローカルマシンだけでなく、どのドメインでも機能します。そしてあなたのコメントはあなたが気分を害したか何かを言うことを意味しますか?
DustWolf 16

コードの上にあるテキストを読んでいますか?私を悩ませないで、私は働いています。私はあなたと話し終わった。
Peter Gruppelaar 16

他のユーザーがあなたの答えの間違いを指摘している場合、なぜ他のユーザーに迷惑をかけるのかわかりません。setcookielocalhostかどうかに関係なく、どのドメインでも機能します。
xorinzor 16

だから、みんながそうだとしたら、それは私の答えで明らかに間違っているはずです...この投稿全体で指摘されているfctの帽子は問題ではありません... 、そして同様の状況で作業しているグローバルユーザーは無視してください...わかりました...
Peter Gruppelaar 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.