【问题标题】:cookie won't setcookie 不会设置
【发布时间】:2011-09-17 23:02:22
【问题描述】:

这是关于我的一个旧问题的问题:cookie 不会取消设置: cookie wont unset 我在取消设置 cookie 时遇到问题(但它被设置为“正确”),

现在问题解决了; cookie 似乎没有设置

cookie 'set':(不起作用)

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');

cookie 检查:(似乎有效)

    function sesion(){

    if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
                    $_SESSION['logueado'] = true;
                    $_SESSION['id'] = $_COOKIE['id'];
                    $_SESSION['alias'] = $_COOKIE['alias'];

                    return true;  //THIS IS NEVER RETURNING TRUE
                }
if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){

                    return true;
                }
                 else{ return false;
    }



    }

cookie 未设置:(有效)

function cerrar_sesion(){
  session_start();
  $_SESSION['logueado']= false;
  $_SESSION['id']= NULL;
  session_unset();
  session_destroy();
  setcookie("id",false,time()-3600,"/");
  setcookie("alias",false,time()-3600,"/");
  unset($_COOKIE['id']);
  unset($_COOKIE['alias']);
}

发生的情况是登录仅通过 $_SESSION 起作用,因此在 30 分钟没有活动后,用户不再登录,

知道我做错了什么吗?非常感谢!

【问题讨论】:

  • 检查servertime是否正确。
  • 它比西班牙晚一小时(其 GMT 和西班牙 GMT 加 1),但我仍然应该设置整个月的 cookie,不是吗?谢谢!
  • 如果服务器时间不正确,部分浏览器拒绝设置cookies。
  • 回声时间(); == 13084374070。我怎么知道那是几点?顺便说一句,格林威治标准时间加上一个 Mysql NOW(),apache 和 mysql 是同一时间吗?谢谢
  • 查看脚本返回的标题。它应该返回有问题的时间。还要检查是否在浏览器中设置了 cookie。

标签: php cookies session-cookies setcookie


【解决方案1】:

如上所述,您无法从设置的同一页面读取 cookie。我看到你已经尝试使用 ajax 来欺骗这个,但我不相信这是一个有效的技巧,因为 Ajax 调用不会改变你仍然在页面上的状态。因此您可以进行完全刷新或重定向,或者在使用 setcookie 的同时,您还可以在 $_COOKIE 中定义所需的值,以便在同一页面上使用它。像这样:

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
$_COOKIE['id'] = $data['id'];  
$_COOKIE['alias'] = $data['nombre'];

【讨论】:

    【解决方案2】:

    设置 cookie 行适合我。

    }else if(isset($_COOKIE['id']) && i 因为如果你在这里删除 else 仍然可以返回,如果上面没有返回,你将不得不将 else 保留在这里,以免评估这个块 一般来说,我不确定elseif 在所有情况下都与else if 相同

    函数会话的构建方式如下:

    • 在第一次加载时,它会显示:没有 cookie,没有会话,因为在重新加载之前你看不到 cookie(我猜你已经知道了)。 - 在第二次加载时,您将看到 cookie 活动会话集。 - 在第二次加载后,您总是会看到会话已设置。

    我只想说会话完全按照预期工作,所以我真的没有看到任何问题。

    <?php
    
    $data='Hello'; 
    setcookie("id",$data['id'], time()+3600*24*30,'/');
    setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
    
    session_start(); 
    
    function sesion()
         {
    
            if(isset($_SESSION['id']) && isset($_SESSION['logueado']) 
                && $_SESSION['logueado'] == true)
            {
                echo 'SESSION IS SET<br>';
                return true;
            } 
            if(isset($_COOKIE['id']) && isset($_COOKIE['alias']))
            {
                $_SESSION['logueado'] = true;
                $_SESSION['id'] = $_COOKIE['id'];
                $_SESSION['alias'] = $_COOKIE['alias'];
                echo 'COOKIE is alive and session set'.$_SESSION['alias'].'<br>';
                return true;  //THIS IS NEVER RETURNING TRUE
             }
            else
            {  
                echo 'NO SESSION,   NO COOKIE YET, WAIT UNTIL REFRESH<br>';
                return false;
            } 
    } 
     sesion() ; 
    ?>
    

    【讨论】:

    • 我正在尝试这样(如果没有),会告诉你的,非常感谢
    • 好吧,不幸的是这并没有解决我的问题......还有其他想法吗?非常感谢
    【解决方案3】:

    尝试从 setcookie() 调用中删除路径参数,也许这就是问题所在。

    另外,您是否检查过 $data 是否实际包含任何数据?

    【讨论】:

      【解决方案4】:

      可能您确实知道设置 cookie 的问题,并且您已禁用有关警告的错误报告。

      试试吧:

      error_reporting(E_ALL);
      

      您可能会在您的页面上看到类似“无法修改标题。标题已发送”之类的内容。那是因为您需要在页面上显示任何内容之前设置 cookie。因此,解决您的问题的解决方案是实现您的代码以在页面底部设置 cookie 或使用 ob_start/ob_clean。

      如果有帮助请告诉我:)

      【讨论】:

        【解决方案5】:

        根据 PHP 中的“setcookie()”实现,在您将控件从您正在创建 cookie 的页面中移出之前,cookie 值检查将不起作用。因此,您的“SET”将在一个页面中创建 cookie,并且应该从其他页面调用“session()”来检查您设置的 cookie 的值。试试看,希望对您有所帮助!

        尝试以下方法(请根据您的需要进行改进)。在设置 cookie 和“会话()”函数后,我在这里尝试刷新页面本身是一个动态函数,可能有也可能没有任何参数。因此,当您将任何参数传递给它时,cookie 将被设置,否则将检查它是否存在。 func_num_args() 的附带函数是 func_get_args()。它将帮助您清理函数中的预期参数。

        <?php
        error_reporting(E_ALL);
        ini_set("display_errors", 1);
        ini_set("log_errors", 0);
        
        session_start();
        
        function sesion(){
          // func_num_args() number of arguments passed to the function
          if (func_num_args() == 0) { // if no arguments were passed, means the page is refreshed and cookie won't be set further
            if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
              $_SESSION['logueado'] = true;
              $_SESSION['id'] = $_COOKIE['id'];
              $_SESSION['alias'] = $_COOKIE['alias'];
        
              return true;  //THIS IS NEVER RETURNING TRUE
            }
            if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){
              return true;
            }
            else {
              return false;
            }
          }
          else { // if number of args > 0, means you need to cookie here and refresh the page itself
            global $data; // set this to global as the $data will be available outside of this function
            setcookie("id",$data['id'], time()+3600*24*30,'/');
            setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
            /**
             * refresh the page by javascript instead of header()
             * as header already being sent by the session_start()
             */
            echo '<script language="javascript">
            <!--
            window.location.replace("' . $_SERVER['PHP_SELF'] . '");
            //-->
            </script>';
            die();
          }
        }
        
        sesion(1); // passed an argument to set the cookie
        ?>
        

        我认为您将面临 JavaScript 部分的问题,因为它会更改页面 URL,并且我猜您正在尝试将此脚本包含到页面中。因此,我将借助call_user_func() 的帮助,setcookie() 行之后的最后“else”部分将更改为以下行:

        call_user_func("sesion");
        

        希望这现在有意义。

        【讨论】:

        • 我不确定我是否理解您建议我尝试的内容:(
        • 对不起,如果我的建议对您来说不清楚。我不确定您是否在创建它们的同一页面中检查 cookie 的存在?如果您这样做,它将无法正常工作。需要中间页面刷新。可以给我你的代码吗?
        • 嗯,真的很长。您是否建议在重新加载之前对设置 coockie 的文件进行 ajax 调用?
        • 听起来是个不错的“把戏”。试试看,让我知道结果。我可以进一步指导。
        • 我已经用另一种可能的方法编辑了答案。请也尝试一下。
        猜你喜欢
        • 2013-07-14
        • 1970-01-01
        • 2011-01-30
        • 2011-07-25
        • 2013-08-22
        • 2020-11-08
        • 2017-06-20
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多