回答:
あなたはこれを試すことができます
if (isset($_COOKIE['remember_user'])) {
unset($_COOKIE['remember_user']);
setcookie('remember_user', null, -1, '/');
return true;
} else {
return false;
}
unset($_COOKIE['Hello']);
です。削除しても何も変わりません。
unset($_COOKIE['Hello']);
は、後でコードのどこかでcookieをチェックする場合に実際に重要です。
値を ""に設定し、有効期限を昨日(または過去の任意の日付)に設定します
setcookie("hello", "", time()-3600);
そうすると、次にページが読み込まれたときにCookieが期限切れになります。
Cookieを削除するクリーンな方法は、$_COOKIE
値とブラウザCookieファイルの両方をクリアすることです。
if (isset($_COOKIE['key'])) {
unset($_COOKIE['key']);
setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}
setcookie
だけでなくコール:setcookie('key', '', time() - 3600, '/');
unsetting
成功しました。
null
値とともに存在するCookieに関心がある場合は、代わりにarray_key_exists()を使用する必要があります。これは、null
値を持つCookieがisset()
チェックによって検出されないためです。
Cookieを確実に削除するには、PHPサーバーによって計算されるように、過去のいつでも期限切れになるように設定するだけでは不十分です。これは、クライアントコンピューターがサーバーの時間と異なる時間を持つ可能性があるためです。
ベストプラクティスは、1秒に期限が切れる空白クッキーと現在のクッキーを上書きすることで、将来的にように、エポック後(1970年1月1日00:00:00):
setcookie("hello", "", 1);
これにより、コード内のCookieの設定が解除されますが、$ _ COOKIE変数はリクエストごとに更新されるため、次のページリクエストで返されるだけです。
実際にCookieを削除するには、過去の有効期限を設定します。
// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);
unset()
クッキーは必要ありませんか?
コードにも同じ問題があり、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']);
お役に立てば幸いです。
Cookieが過去に期限切れになるように設定した場合、ブラウザはそれを削除します。php.netのsetcookie()deleteの例を参照してください
PHPのドキュメントの「例#2 setcookie()delete example」というラベルの付いたサンプルを参照してください。ブラウザからCookieをクリアするには、Cookieの有効期限が切れていることをブラウザに通知する必要があります。ブラウザはそれを削除します。unset
使用したので、「hello」CookieをCOOKIE配列から削除するだけです。
これは、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をヘッダーで送信しなくなります
Cookieを削除するには、値をNULLに設定するだけです。
「有効期限、パス、またはドメインにデフォルト以外の値を使用してCookieを設定した場合、Cookieを削除するには、Cookieを削除するときに同じ値を再度指定する必要があります。」「Learning PHP5」の本からの引用。
したがって、このコードは機能するはずです(私にとっては機能します):
クッキーの設定:
setcookie('foo', 'bar', time() + 60 * 5);
Cookieを削除する:
setcookie('foo', '', time() + 60 * 5);
しかし、私は誰もが有効期限を過去に設定していることに気付きました、それは必要ですか、そしてなぜですか?
''
はと同じではありませんnull
。
あなたが書くことができるすべてのクッキーを削除するには:
foreach ($_COOKIE as $key => $value) {
unset($value);
setcookie($key, '', time() - 3600);
}
次のように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をご覧ください。
このトピックが作成されてから長い年月が経過していることはわかっていますが、このソリューションには少し間違いがありました(詳細なので、そのように呼ぶことができます)。より良い解決策はおそらくこの解決策であることに同意します
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;
}
ありがとう、そして良い一日を:)
$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.
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
サーバーの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']);
これはローカルマシンでのみ機能することを忘れています。ドメインでは、この例のようなパターンが必要になります。
setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);
setcookie
localhostかどうかに関係なく、どのドメインでも機能します。
$cookie->delete()
からgithub.com/delight-im/PHP-Cookie役立ちます。質問のコードは、サーバー側で解析されたプロパティを削除するだけです。クッキーはまだクライアント側にあります。