PHP旁路&x27;伪异步';setcookie()的定义;功能
下面是一个代码示例:PHP旁路&x27;伪异步';setcookie()的定义;功能,php,cookies,get,setcookie,Php,Cookies,Get,Setcookie,下面是一个代码示例: if (!empty($_GET['supahCookie'])) { setcookie("myCookie", $_GET['supahCookie'], time()+3600*24*31); } $foo = empty($_COOKIE['myCookie'])?'Empty! :(':$_COOKIE['myCookie']; echo $foo; 输出如下: 空的!:( 首先,它看起来像是异步执行的setcookie(),但如果你不考虑一下se
if (!empty($_GET['supahCookie']))
{
setcookie("myCookie", $_GET['supahCookie'], time()+3600*24*31);
}
$foo = empty($_COOKIE['myCookie'])?'Empty! :(':$_COOKIE['myCookie'];
echo $foo;
输出如下:
空的!:(
首先,它看起来像是异步执行的setcookie()
,但如果你不考虑一下setcookie()
只设置一个cookie头就行了
问题是我需要立即访问新创建的cookie。我该如何做
我唯一能想到的方法是:
if (!empty($_GET['supahCookie']))
{
setcookie("myCookie", $_GET['supahCookie'], time()+3600*24*31);
unset($_GET['search_type']); // to avoind redirect loop
header('Location: ./?'.http_build_query($_GET));
}
嗯……还有一个,有点混乱:
$foo = empty($_GET['supahCookie'])?(empty($_COOKIE['myCookie'])?'Empty! :(':$_COOKIE['myCookie']):$_GET['supahCookie'];
我又在这里发明轮子了吗
有人有其他更优雅的解决方案吗?只需手动在数组
$\u COOKIE
中赋值(比如$\u COOKIE['mycookie']=$\u GET['supahCookie']
),同时调用setcookie
编辑: 如其他答案所述,不建议“违反”请求状态数组,判断是否确实设置了cookie是不可靠的,因为浏览器可以简单地拒绝它。我的第一个解决方案旨在让您在处理cookie的同时关注真实事物,而不是实现细节(例如检测浏览器拒绝cookie) 我仍然可以看到至少有两种方法可以在不重新加载整个页面的情况下处理此问题,但是这两种方法都需要用户的浏览器发送第二个请求(已经向您解释过,这对于了解客户端cookie的真实状态是必要的)
src
属性指向新页面XMLHttpRequest
将在JavaScript
中接收和处理该句子。下面是此解决方案的代码片段
,您可以在
右侧更改span的定义中放置以下代码:
var xhttp = new XMLHttpRequest;
xhttp.onreadystatechange=function()
{
if (xhttp.readyState==4 && xhttp.status==200)
{
document.getElementById("cookie_state").innerHTML=xhttp.responseText;
}
}
xhttp.open("GET","cookie_info.php",true);
xhttp.send();
当然,如果您只想在交付新cookie的脚本中使用新cookie,您可以首先检查是否设置了cookie,如果已经将其分配给某个变量,如果没有,则创建它,然后分配给该变量,无需每次在$\u cookie数组中查找它的值。只需在数组中分配值。$\u cookie手动ly(如
$\u COOKIE['mycookie']=$\u GET['supahCookie']
)以及调用setcookie
编辑: 如其他答案所述,不建议“违反”请求状态数组,判断是否确实设置了cookie是不可靠的,因为浏览器可以简单地拒绝它。我的第一个解决方案旨在让您在处理cookie的同时关注真实事物,而不是实现细节(例如检测浏览器拒绝cookie) 我仍然可以看到至少有两种方法可以在不重新加载整个页面的情况下处理此问题,但是这两种方法都需要用户的浏览器发送第二个请求(已经向您解释过,这对于了解客户端cookie的真实状态是必要的)
src
属性指向新页面XMLHttpRequest
将在JavaScript
中接收和处理该句子。下面是此解决方案的代码片段
,您可以在
右侧更改span的定义中放置以下代码:
var xhttp = new XMLHttpRequest;
xhttp.onreadystatechange=function()
{
if (xhttp.readyState==4 && xhttp.status==200)
{
document.getElementById("cookie_state").innerHTML=xhttp.responseText;
}
}
xhttp.open("GET","cookie_info.php",true);
xhttp.send();
当然,如果您只想在交付新cookie的脚本中使用新cookie,您可以首先检查是否设置了cookie,如果已经将其分配给某个变量,如果没有,则创建它,然后分配给该变量,无需每次在$cookie数组中查看它的值。否。
$\u cookie
和supergloba的其余部分ls作为PHP启动例程的一部分填充。启动完成后,在脚本执行期间,PHP将不再触摸ls(除了$u会话,正如Khez在下面指出的)。基本上设置它+忘记它。没有影响超全局的PHP函数(特别是Set_cookie())再次接触这些数组时,它不是“异步的”。它是完全断开关联的。cookie在$\u cookie中出现的唯一时间是当它出现在导致脚本执行的请求的HTTP头中时
您可以重载setcookie来做您想做的事情,但通常不应该这样做。$\u COOKIE表示客户端发出请求时的状态。如果您开始向$\u COOKIE写入新数据,您将丢失客户端的状态。否。
$\u COOKIE
其余超全局变量将作为PHP启动路由的一部分填充es.启动完成后,在脚本执行期间,PHP将不再触摸它们(Khez在下面指出的$\u会话除外)。基本上,设置它+忘记它。影响超全局的PHP函数(特别是Set\u cookie())都不会再触摸这些数组,这不是“异步”的