【问题标题】:Checking and setting cookie in a function在函数中检查和设置 cookie
【发布时间】:2013-06-08 14:43:22
【问题描述】:

我写了一个函数来检查是否设置了cookie,如果没有设置则设置cookie。

因为 cookie 不是马上可用的,所以我需要刷新一次页面,所以我可以访问该值。

但是,当我调用该函数时,它只会不断重新加载页面。在功能之外时,它可以正常工作。只有当它在函数内部并且我调用它时才会发生。

function getCookie (){
    if(isset($_COOKIE['ID'])){
        $cookieID = $_COOKIE['ID'];
    }
    else{
        //generate random value for cookie id
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $uuid =  substr($charid, 0, 8)
                 .substr($charid,20,12);

        setcookie( "ID", $uuid, strtotime( '+7 days' ) ); 
        $cookieID = $_COOKIE['ID'];
        echo "<META HTTP-EQUIV='Refresh' CONTENT='0'>  ";
    }
    echo $cookieID;
}

【问题讨论】:

  • 在哪里可以调用get_cookie() 函数?
  • 在包含 header.php 文件的 index.php 文件中 > 其中包含包含此函数的 functions.php
  • 检查以正确方式包含的函数,例如echo 'hello'; 之类的。
  • 是的,已经尝试过了,包含被正确包含。

标签: php cookies setcookie


【解决方案1】:

这是一个正常工作的 php 页面...

<?php

function getCookie (){
    if(isset($_COOKIE['ID'])){
        $cookieID = $_COOKIE['ID'];
    }
    else{
        //generate random value for cookie id
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $uuid =  substr($charid, 0, 8)
                 .substr($charid,20,12);

        setcookie( "ID", $uuid, strtotime( '+7 days' ) ); 
        $cookieID = $_COOKIE['ID'];

        //just assign the cookie the value as if it was in the header. 
        //no refresh needed.
        $_COOKIE['ID'] = $uuid;

    }
}

?>
<html>
<body>
<?php 
  getCookie();
  echo $_COOKIE['ID']; 
?>
</body>
</html>

【讨论】:

  • 我会将strtotime( '+7 days' ) 更改为time()+(60*60*24*7)time()+604800 ...但它在刷新和没有刷新时都对我有用
  • 引发标头已发送错误:警告:无法修改标头信息 - 标头已发送(输出开始于 **************/header.php: 6)
  • 我已经编辑了答案以包含一个完整的 php 页面。它测试良好,因此您需要检查您的页面结构。
  • @DaveAbad 我已将您的代码复制并粘贴到空白 php 文件中。但是,我的投掷标头已经发送错误,检查浏览器中的 cookie 没有被设置。我在另一台服务器上有这个并且工作正常。
  • @DaveAbad 啊,我发现了问题,我需要 ob_start();在开始之前我可以使用cookies
【解决方案2】:

检查 isset 返回的内容。从您的描述看来,在第一次执行此代码后根本没有设置 cookie。在 FireFox 中,您可以使用 firebug 工具检查 cookie 是否设置。

一个好主意是比较任何if 中的数据类型,例如if(isset($some_var) === true){ 而不是if(isset($some_Var)){。请记住:

$v = 0;

if($v == 0){ } 返回真

if($v === 0){ } 返回真

if($v == false){ } 返回真

if($v === false){ } 返回假

【讨论】:

  • 实际上我需要某种全局变量来将其包含在函数中吗?该函数是否可以访问 $_COOKIE['ID'] ?
  • 如果您的 PHP(比我在手册中看到的 4.1.0 更高)版本使用 $_COOKIE,它应该可以从函数或类中的任何代码点访问。
  • 我检查了你的第一个代码。一切似乎都很好,所以如果您遇到问题,我强烈建议您检查 PHP 设置和版本。你可以抛出像var_dump($_COOKIE); 这样的行,如果有正确的版本,它总是应该是一个数组,如果你的 cookie 将被设置,这行应该抛出一个 cookie(所有 cookie :))值。
  • $_COOKIE['ID'] 应该在您的代码的任何位置返回 cookie 的值。要检查返回值,请使用例如 var_dump($_COOKIE['id']);isset 函数 var_dump(isset($_COOKIE['id'])); 的情况。这应该可以让您准确了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2015-03-16
  • 2014-11-16
相关资源
最近更新 更多