Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP旁路&x27;伪异步';setcookie()的定义;功能_Php_Cookies_Get_Setcookie - Fatal编程技术网

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的真实状态是必要的)

  • (糟糕的方式)您可以使用。将其边框、边距和填充设置为0,然后手动调整其高度将允许您使其看起来像另一个段落(假设您需要)。这将使您创建另一个只返回一句话的页面-无论访问者是否设置了指定的cookies;并设置IFrame的
    src
    属性指向新页面

  • 我建议使用object。这样,您仍然需要创建另一个页面,该页面将返回一个句子(无论浏览器是否发送cookie),
    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的真实状态是必要的)

  • (糟糕的方式)您可以使用。将其边框、边距和填充设置为0,然后手动调整其高度将允许您使其看起来像另一个段落(假设您需要)。这将使您创建另一个只返回一句话的页面-无论访问者是否设置了指定的cookies;并设置IFrame的
    src
    属性指向新页面

  • 我建议使用object。这样,您仍然需要创建另一个页面,该页面将返回一个句子(无论浏览器是否发送cookie),
    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())都不会再触摸这些数组,这不是“异步”的