我知道,这个问题问了很多遍,但是我找不到解决方案。
我已经编码了一个php / JS脚本来从服务器获取数据并显示它们。我正在使用Ajax验证用户是否经过身份验证?我正在使用下面的方法来做到这一点;
我的index.php:
>?php
...
...
$.post("data.php",{ req:'login',
username:$('#username').val(), //user enters given id
pass:$('#password').val(),
job:$('#job').val(),
rand:Math.random() } ,
function(data)
{
if (data == 'yes') // user is authenticated.
document.location='system.php';
}
...
...
// i am using a form to send collected data to data.php
?>
在data.php代码中是这样的:
>?php
session_start();
$link = mysql_connect("localhost","user","pass");
if (!$link) {
die("No connection :" . mysql_error());
}
mysql_select_db("database");
if ($_POST["req"] =="login"){
$user_id=($_POST["username"]);
$user_pass=($_POST["pass"]);
$user_job=($_POST["job"]);
// select proper table (related to his/her job) and control did user supplied correct password?
if( password is correct ){
$_SESSION["id"]=$_POST["username"];
// or $_SESSION["id"]=$user_id;
echo"yes";
}
else echo"no"; //Invalid Login
} else if ($_POST["req"] =="userinfo"){
...
...
...
} else
...
...
?>
系统工作正常,直到这里,我将重定向到system.php,在system.php中,我想使用$ _SESSION变量来获取JavaScript中已记录的用户名。
我的system.php的一部分;
>?php
session_start();
if ((isset($_SESSION["id"]))||(!empty($_SESSION["id"]))) header("Location:index.php");
$userno = $_SESSION["id"];
if(isset($_GET["logout"]))
{
session_destroy();
$_SESSION["id"] = FALSE;
header("Location:index.php");
}
?>
...
...
...
>script type="text/javascript">
$.post("data.php",{ req:'userinfo',username:'>?php echo ($userno) ?>',rand:Math.random() } ,function(data){
// sure ?php is written corrctly in script ;)
//.... again get data from data.php and put results into page..
});
>/script>
该代码在我的PC(xampp)中正常运行,但是在我的服务器上没有任何机会。
echo($ userno)不输出任何内容。
我搜索了很多地方,发现这是因为register_globals已关闭。我明白为什么会这样。但是,为什么我不能获得$ _SESSION [" id"]的值并将其分配给system.php中的$ userno的原因
注意:我对许多其他请求使用相同的data.php文件,所有这些请求都依赖于用户名,但是不同的条件会更改用于数据源的表,因此一开始我无法获得信息。
现在谢谢...
注意:因为我找不到使用代码突出显示的正确方法,所以我将>?php用作php代码部分的开始,而将> script作为JS代码部分的开始。
// @弗兰克·法默(Frank Farmer):我都尝试过,没有变化/没有机会
在脚本顶部添加error_reporting(E_ALL);。
@ mario:我没有做,但是什么也没显示,我用HTTPFox定义了问题,我看到$ userno部分在页面中什么也没输出。所以req:userinfo,username:看起来像req:userinfo,username:
我不确定您的问题是什么,但是PHP中的变量名称区分大小写,因此可以肯定地确定它不能与$_session一起使用。您可能要更改它,只是要确保您在那右脚。
@zneak:IVE用作大写字母,但如果可行,我只是尝试小写字母:)(绝望),实际上代码是$ _SESSION
@Alper:然后显示您当前的代码(这是您的编辑链接)。它应该给您有关小写$_session[]数组的通知。大概会为您警告session_start。在您的php.ini中调整它,否则,重新启动Apache。
@mario:香港专业教育学院纠正了问题$ _SESSION并且我的主机是bluehost,如何重启Apache?
@Alper:你不能。您当然不能自己修改服务器php.ini。没关系。 -但是请发布您当前的真实代码。显示您在哪里添加了error_reporting()。 -同时在浏览器中比较SID cookie值。它会在页面之间变化吗?
@mario:感谢您的帮助和努力,但有关BOM编码的问题(我的错)并已解决。再次感谢你。
简单易用的解决方案来注册您的变量。
foreach ($_POST as $key => $value) {
eval("$".$key."= '".$value."';");
}
很有意思,我已经控制了服务器上的error.log文件(我不知道为什么以前没有控制过),其中有些错误说:会话已经由...发送,就像错误一样
我发现一个论坛页面显示:
有时问题是由"包含Unicode签名(BOM)"属性引起的,然后我控制了我的编码类型,我看到它是带有BOM的Unicode(我使用的是没有BOM的产品,但我不知道它是怎么发生的),当我转换时 没有宝的问题就解决了。
这完全是我的虚假(甚至是错误的信息),感谢您的所有帮助。
echo '[cc lang="php"]';
print_r($_SESSION);
die;
你得到了什么?
在服务器端检查$userno的内容:
$userno = $_session["id"];
var_dump($userno);
die;
页面源代码中只有[cc lang="php"]
$ userno = $ _session [" id"]; var_dump($ userno);死;返回NULL
然后,您的会话变量存在问题。如前所述,将会话变量更改为大写并尝试再次转储其内容。
Ive更改为$ _SESSION [" id"] ant尝试转储,结果:NULL
您是否检查过会话是否正常工作?您确定要通过AJAX调用获取输入吗?要找到问题的根源,最简单的方法就是从输入端开始到输出端为止。尝试转储每个有意义的变量,并确保在设置会话之前就已正确设置了所有变量。
谢谢您的帮助和努力,但有关BOM编码的问题(我的错)已经解决。再次感谢你。
我很高兴您发现它是因为BOM问题是一个容易被忽视的问题,并且会引起许多令人烦恼的无法解释的问题。如果我是你,我还要确保在IDE和保存的输出文件中,默认字符集均为UTF-8。确保正确覆盖文件以完全删除BOM。祝好运!
我相信应该是$_SESSION,而不是$_SESSION。 这是一个超级全局变量,区分大小写。
// @布莱恩·罗斯(Bryan Ross):我都尝试过,没有变化/没有机会:(