当 register_globals 关闭时 PHP5 $_SESSION 不工作
Posted
技术标签:
【中文标题】当 register_globals 关闭时 PHP5 $_SESSION 不工作【英文标题】:PHP5 $_SESSION not working while register_globals is off 【发布时间】:2011-12-12 05:59:02 【问题描述】:我知道,这个问题问了很多次,但我找不到解决办法。 我编写了一个 php/JS 脚本来从服务器获取数据并显示它们。我正在使用 Ajax 来验证用户是否经过身份验证?我正在使用以下方法来做到这一点; 我的 index.php:
>?php ... ... $.post("data.php", req:'登录', username:$('#username').val(), //用户输入给定的id pass:$('#password').val(), 工作:$('#job').val(), rand:Math.random() , 功能(数据) if (data == 'yes') // 用户已通过身份验证。 document.location='system.php'; ... ... // 我正在使用表单将收集到的数据发送到 data.php ?>data.php中的代码是这样的:
>?php session_start(); $link = mysql_connect("localhost", "user", "pass"); 如果(!$链接) die("没有连接:" .mysql_error()); mysql_select_db("数据库"); if ($_POST["req"] == "login") $user_id=($_POST["用户名"]); $user_pass=($_POST["pass"]); $user_job=($_POST["job"]); // 选择合适的表(与他/她的工作相关)并控制用户是否提供了正确的密码? if(密码正确) $_SESSION["id"]=$_POST["username"]; // 或 $_SESSION["id"]=$user_id; 回声“是”; 否则回显“否”; //登录无效 else if ($_POST["req"] == "userinfo") ... ... ... 别的 ... ... ?>系统在此处运行良好,我正在重定向到 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["注销"])) session_destroy(); $_SESSION["id"] = 假; header("位置:index.php"); ?> ... ... ... >脚本类型=“文本/javascript”> $.post("data.php", req:'userinfo',username:'>?php echo ($userno) ?>',rand:Math.random() ,function(data) // 确定 ?php 在脚本中是正确编写的 ;) //.. 再次从 data.php 获取数据并将结果放入页面.. ); >>脚本>此代码在我的 PC (xampp) 中正常工作,但在我的服务器上没有机会..echo ($userno) 不输出任何内容。 我搜索了很多地方,发现这是因为 register_globals 已关闭。我明白为什么会这样。 但是为什么我无法在我的 system.php 中获取 $_SESSION["id"] 的值并将其分配给 $userno注意:我我对许多其他请求使用相同的 data.php 文件,所有这些请求都取决于用户名,但不同的条件会更改用于数据源的表,因此我一开始无法获取信息。 现在谢谢... 注意:由于我找不到使用代码突出显示的正确方法,我将 >?php 用于启动 php 代码部分和 >script 用于 JS 代码部分..
【问题讨论】:
@Frank Farmer:我都试过了,没有改变/没有机会:( 在脚本顶部添加error_reporting(E_ALL);
。
@ mario :我做了但没有显示,我使用 HTTPFox 来定义问题,我看到,$userno 部分在页面中没有输出任何内容。所以 req:'userinfo',username:'' 看起来像 req:'userinfo',username:''
我不确定你的问题是什么,但是 PHP 中的变量名是区分大小写的,所以绝对可以肯定它不适用于 $_session
。你可能想改变它,只是为了确保你在那里是正确的。
@Alper:你不能。你当然不能自己调整服务器 php.ini。没关系。 -- 但请发布您的 real 当前代码。显示您添加 error_reporting() 的位置。 -- 还要比较浏览器中的 SID cookie 值。它会随着页面的变化而变化吗?
【参考方案1】:
我认为应该是$_SESSION
,而不是$_session
。它是一个超全局变量,并且区分大小写。
【讨论】:
【参考方案2】:echo '<pre>';
print_r($_SESSION);
die;
你得到了什么?
在服务器端检查$userno
的内容:
$userno = $_session["id"];
var_dump($userno);
die;
【讨论】:
$userno = $_session["id"]; var_dump($userno);死;返回NULL 那么你的会话变量有问题。如前所述,将会话变量更改为大写并尝试再次转储其内容。 我已更改为 $_SESSION["id"] ant 尝试转储,结果:NULL 您是否检查过会话是否有效?您确定您实际上是通过 AJAX 调用获得输入的吗?要找到问题的根源,最简单的方法就是沿着车道滚动,从输入开始,到输出结束。尝试转储每个重要变量,并确保在到达设置会话的位置之前正确设置它们。 感谢您的帮助和努力,但关于 BOM 编码的问题(我的错误)并已解决。再次感谢您。【参考方案3】:这很有趣,我已经在我的服务器上控制了 error.log 文件(我不知道为什么我之前没有控制)有一些错误说:会话已经发送...类似错误 我找到了一个论坛页面,上面写着: 有时问题是由 Include Unicode Signature (BOM) 属性引起的,然后我控制了我的编码类型,我看到它是 Unicode with BOM(我使用的是没有 BOM 但我不明白它是怎么发生的),当我转换 without bom 问题就解决了。
这完全是我的错误(甚至是错误信息)感谢您的所有帮助。
【讨论】:
【参考方案4】:注册变量的简单解决方案。
foreach ($_POST as $key => $value)
eval("$".$key."= '".$value."';");
【讨论】:
以上是关于当 register_globals 关闭时 PHP5 $_SESSION 不工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP 5.5 将 register_globals 添加到 XAMPP 1.8.4