php 5.5.7 register_global,关于php:PHP5 $ _SESSION在register_globals关闭时不起作用

我知道,这个问题问了很多遍,但是我找不到解决方案。

我已经编码了一个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):我都尝试过,没有变化/没有机会:(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值