我正在编写一个自定义会话处理程序,但就我而言,我无法在其中设置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。这对我没有任何意义
答案 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)
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标头但不接受它。