cookie不会设置

时间:2011-06-18 22:20:28

标签: php cookies session-cookies setcookie

这是一个关于我的旧问题的问题:cookie不会被取消: cookie wont unset 我忘记了cookie的问题(但是设置'正确'),

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

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

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

5 个答案:

答案 0 :(得分: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'];

答案 1 :(得分:2)

设置cookie行可以正常使用。

至于}else if(isset($_COOKIE['id']) && i 如果你在这里删除其他你返回仍然没关系,如果上面没有返回你必须保留其他在这里,以便不评估这个块 一般来说,我不确定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() ; 
?>

答案 2 :(得分:1)

尝试从setcookie()调用中删除path参数,这可能就是问题所在。

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

答案 3 :(得分:1)

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

试试吧:

error_reporting(E_ALL);

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

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

答案 4 :(得分:0)

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

请尝试以下方法(请根据您的需要进行优化)。我在这里尝试刷新页面本身后设置cookie和“sesion()”函数是一个动态函数,可能有也可能没有任何参数。因此,当您向其传递任何参数时,将设置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,我想您正在尝试将此脚本包含在页面中。因此,在使用以下行更改setcookie()行之后,我将接受call_user_func()和最后“else”部分的帮助:

call_user_func("sesion");

希望现在这样有意义。