基于PHP的会话变量不保留值。适用于localhost,但不适用于服务器

时间:2010-03-19 05:12:45

标签: php

我一直试图将这个问题调试好几个小时,但无济于事。我已经使用PHP很多年了,经过长时间的中断后又回到了它,所以我还是有点生气。

无论如何,我的$ _SESSION变量并没有因为我无法弄清楚的某些原因而保留它们的价值。该网站完全适用于localhost,但将其上传到服务器似乎打破了它。

我检查的第一件事是PHP.ini服务器设置。一切似乎都很好。事实上,我的登录系统是基于会话的,它完美地运行。所以现在我知道$ _SESSIONS正常工作并保留了我的登录价值,我假设服务器已经设置好了,问题出现在我的脚本中。

这是导致问题的代码的剥离版本。通过GET变量设置后,$ type,$ order和$ style不会被保留。用户单击一个链接,该链接通过GET设置变量,并且该变量将在其剩余的会话中保留。

我的逻辑是否存在一些我没有看到的问题?

<?php
require_once('includes/top.php'); //first line includes a call to session_start();
require_once('includes/db.php');

$type = filter_input(INPUT_GET, 't', FILTER_VALIDATE_INT);
$order = filter_input(INPUT_GET, 'o', FILTER_VALIDATE_INT);
$style = filter_input(INPUT_GET, 's', FILTER_VALIDATE_INT);

/*
According to documentation, filter_input returns a NULL when variables
are undefined. So, if t, o, or s are not set via URL, $type, $order and $style
will be NULL. 
*/    

print_r($_SESSION);
/* 
All other sessions, such as the login session, etc. are displayed here. After 
the sessions are set below, they are displayed up here to... simply with no value. 
This leads me to believe the problem is with the code below, perhaps?
*/


// If $type is not null (meaning it WAS set via the get method above)
// or it's false because the validation failed for some reason,
// then set the session to the $type. I removed the false check for simplicity.
// This code is being successfully executed, and the data is being stored...
if(!is_null($type))
{
    $_SESSION['type'] = $type;
}
if(!is_null($order))
{
    $_SESSION['order'] = $order;
}
if(!is_null($style))
{
    $_SESSION['style'] = $style;
}


 $smarty->display($template);

?>

如果有人能指出我正确的方向,我会非常感激。感谢。

3 个答案:

答案 0 :(得分:7)

<强>难以置信!

经过三个小时的调试,我发现了问题

HostGator,我不再钟爱的主机,使用 register_globals ON

运行默认的ini

我无法相信。

因此我的$ type变量被$ _SESSION ['type']覆盖,并且它们被视为相同。所以这是导致问题的服务器问题,而不是我的编码。很高兴知道,但我希望我的头发可以拉回5个小时。

我希望这可以帮助那些使用HostGator并且被困惑的人。

答案 1 :(得分:1)

您需要调用session_start()函数。在访问$_SESSION变量之前。

然后它将保留所有SESSION变量给你..

答案 2 :(得分:0)

我想你曾指出你在top.php中调用了session_start()吗?我注意到的另一件事是你通过PHP过滤器验证整数字段。确保它们是整数值,或者您最终会得到空值。进行测试以确定在验证之前是否设置了TYPE,ORDER和STYLE值。请记住,使用php过滤器是为了验证某种类型而不是存储。我不认为$ type会存储你的数据,它宁可是一个布尔检查。尝试将$ _GET []变量分配给SESSION VARIABLES。希望这会有所帮助。