0

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

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

cookie“设置”:(不起作用)

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 分钟无活动后,用户不再登录,

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

4

5 回答 5

6

如上所述,您无法从设置的同一页面读取 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'];
于 2011-07-24T01:12:16.300 回答
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() ; 
?>
于 2011-06-19T00:27:00.990 回答
1

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

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

于 2011-07-22T23:42:58.443 回答
1

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

你试一试:

error_reporting(E_ALL);

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

让我知道它是否有帮助:)

于 2011-07-27T09:42:12.167 回答
0

根据 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");

希望这现在有意义。

于 2011-07-22T12:52:04.827 回答