Rumah  >  Artikel  >  pembangunan bahagian belakang  >  php新手请教一个关于cookie的问题

php新手请教一个关于cookie的问题

WBOY
WBOYasal
2016-10-10 11:56:17838semak imbas

代码如下:

<code>function cookie($name) {
    return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
}

/**
 * 从客户端浏览器删除一个 Cookie。
 * @param  string $cookie_name 要删除的 Cookie 名称。
 * @return void
 */
function delete_cookie($cookie_name) {
    setcookie($cookie_name, '', time() - 2 * 24 * 3600);
    unset($_COOKIE[$cookie_name]);
}

delete_cookie('mycookie');
setcookie('mycookie', 'myvalue');
var_dump(cookie('mycookie')); // 为何这里总是输出NULL?为什么不是输出刚刚设置的'myvalue'?</code>

为何总是输出NULL?为什么不是输出刚刚设置的'myvalue'?

回复内容:

代码如下:

<code>function cookie($name) {
    return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
}

/**
 * 从客户端浏览器删除一个 Cookie。
 * @param  string $cookie_name 要删除的 Cookie 名称。
 * @return void
 */
function delete_cookie($cookie_name) {
    setcookie($cookie_name, '', time() - 2 * 24 * 3600);
    unset($_COOKIE[$cookie_name]);
}

delete_cookie('mycookie');
setcookie('mycookie', 'myvalue');
var_dump(cookie('mycookie')); // 为何这里总是输出NULL?为什么不是输出刚刚设置的'myvalue'?</code>

为何总是输出NULL?为什么不是输出刚刚设置的'myvalue'?

COOKIE 是你从你的客户端带过去的,所以读到COOKIE应该是上次脚本设置的,然而你每次执行这个脚本时, 都把上次设置的COOKIE删了,然后设置了一个新COOKIE,这个COOKIE只能被下次运行的脚本读取到。然后一直进行 删-设-删-设 的循环。。。所以读不到咯。
如果把COOKIE改为SESSION的话,就能读到了,SESSION不会像COOKIE这样慢一拍的。它是保存在服务器的。

因为对于COOKIE的赋值只有等下一次浏览请求时才能生效。但你等到下一次浏览的时候你delete掉了,所以就一直,这个COOKIE和你多大仇..

你在本次请求中已经删除了$_COOKIE['mycookie'],而setcookie需要下一次请求才生效.
$_COOKIE是浏览器把cookie信息传给PHP.
setcookie是PHP把cookie信息告诉浏览器.
也就是$_COOKIE['xxx']的生成需要setcookie('xxx')所在的请求先执行完成.

如果你想输出‘myvalue’,可以将unset($_COOKIE[$cookie_name]);注释掉。就可以输出了

unset 会立即生效,但是 set_cookie 需要下一次请求才会有效果。

同理,如果删除了 unset 这一句,输出的结果并不是刚刚 set_cookie 的,而是上一次 set_cookie 的。

例如,我把 unset 这一句删除,然后刷新,会显示 string(7) "myvalue",没有问题;

接着我把 myvalue 改成 myvalue2,然后刷新,还是显示 string(7) "myvalue"

再刷新一次,才会显示 string(8) "myvalue2"

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn