PHP在子类中设置cookie

时间:2010-04-16 15:57:05

标签: php cookies

我正在编写一个自定义会话处理程序,但就我而言,我无法在其中设置cookie。在设置cookie之前,我没有向浏览器输出任何内容,但它仍然不起作用。它杀了我。

如果我在我定义的脚本中设置cookie并使用调用会话处理程序,则会设置cookie。如有必要,我会发布代码。人们有什么想法?

<?php




/* require the needed classes comment out what is not needed */
require_once("classes/sessionmanager.php");
require_once("classes/template.php");
require_once("classes/database.php");


$title=" ";  //titlebar of the web browser
$description=" ";  
$keywords=" ";  //meta keywords
$menutype="default";  //default or customer, customer is elevated
$pagetitle="dflsfsf "; //title of the webpage
$pagebody=" ";  //body of the webpage


$template=template::def_instance();
$database=database::def_instance();

$session=sessionmanager::def_instance();
$session->sessions();
session_start();
?>

这是实际为会话设置cookie的那个

function write($session_id,$session_data)
{
    $session_id = mysql_real_escape_string($session_id);
    $session_data = mysql_real_escape_string(serialize($session_data));
    $expires = time() + 3600;
    $user_ip = $_SERVER['REMOTE_ADDR'];
    $bol = FALSE;
    $time = time();
    $newsession = FALSE;
    $auth = FALSE;
    $query = "SELECT * FROM 'sessions' WHERE 'expires' > '$time'";
    $sessions_result = $this->query($query);
    $newsession = $this->newsession_check($session_id,$sessions_result);
    while($sessions_array = mysql_fetch_array($sessions_result) AND $auth = FALSE)
    {
        $session_array = $this->strip($session_array);
        $auth = $this->auth_check($session_array,$session_id);
    }

    /* this is an authentic session. build queries and update it */
    if($auth == TRUE AND $newsession == FALSE)
    {   
        $session_data = mysql_real_escape_string($session_data);
        $update_query1 = "UPDATE 'sessions' SET 'user_ip' = '$user_ip' WHERE 'session_id' = '$session_id'";
        $update_query2 = "UPDATE 'sessions' SET 'data' = '$session_data' WHERE 'session_id = '$session_id'";
        $update_query3 = "UPDATE 'sessions' SET 'expires' = '$expires' WHERE 'session_id' = '$session_id'";
        $this->query($update_query1);
        $this->query($update_query2);
        $this->query($update_query3);
        $bol = TRUE; 
    }
    elseif($newsession == TRUE)
    {
        /* this is a new session, build and create it */
        $random_number = $this->obtain_random();
        $cookieval = hash("sha512",$random_number);
        setcookie("rndn",$cookieval,$expires,'/');
        $query = "INSERT INTO sessions VALUES('$session_id','0','$user_ip','$random_number','$session_data','$expires')";
        $this->query($query);
        //echo $cookieval."this is the cookie <<";
        $bol = TRUE;    
    }
    return $bol;
}

代码已更新。仍然没有运气

由于某种原因,如果在会话管理器启动后回显任何html,则在html之后调用cookie。这对我没有任何意义

3 个答案:

答案 0 :(得分:1)

问题可能发生在if/else声明中。您正在使用:

if($auth = TRUE AND $newsession = FALSE)
...
elseif($newsession = TRUE)

使用单个=表示您分配值,而不是比较它们。您需要使用 == 而不是 =

更改为:

if($auth == TRUE AND $newsession == FALSE)
...
elseif($newsession == TRUE)

使用您现在拥有的代码,代码的第一个if块每次都会运行,因此永远无法拨打setcookie()电话。

答案 1 :(得分:0)

根据游览代码,至少你必须在cookie参数中设置/目录 但无论如何,首先你必须从HTTP日志中嗅探cookie。您可以使用Firebug来监视服务器是否设置了任何cookie以及浏览器是否发送了任何cookie

答案 2 :(得分:0)

如果php无法添加标头,

setcookie()将返回false。所以对于调试尝试像

这样的东西
 setcookie("rndn",$cookieval) or die('setcookie failed');

您可以将它与测试结合起来是否首先调用setcookie()

$rc = setcookie("rndn",$cookieval);
/* DEBUG-code don't forget to remove me */
error_log(sprintf("%s %s\n", date('Y-m-d H:i:s setcookie():'), $rc?'success':'failed'));

(甚至更好地使用xdebug之类的调试器,例如netbeans作为前端。)

您是否在浏览器中检查了响应标头?例如。通过firebug extension。也许客户端收到cookie标头但不接受它。