PHP 会话副作用警告,全局变量作为数据源


PHP session side-effect warning with global variables as a source of data

我正在尝试托管一个提供给我的PHP网站。 我看到此警告:

警告:未知:您的脚本可能 依赖于会话副作用 一直存在到 PHP 4.2.3。请 建议会话扩展 不将全局变量视为 数据源,除非 register_globals已启用。您可以 禁用此功能和此 通过设置警告 session.bug_compat_42或 session.bug_compat_warn关, 分别。在 未知 在第 0

这是什么意思? 如何在代码中追踪此问题的根源?

基本上你有一个与会话同名的变量。 例如:

$_SESSION['var1'] = null;
$var1 = 'something';

这将重现此错误。 您可以阻止 PHP 尝试查找现有变量,并通过在脚本中添加以下行来警告您:

ini_set('session.bug_compat_warn', 0);
ini_set('session.bug_compat_42', 0);

这些值也可以在PHP.ini或.htaccess中设置

这里似乎有一些问题的可能性:

http://www.spiration.co.uk/post/1231/Your-script-possibly-relies-on-a-session-side-effect

说这样的情况:

$_SESSION['firstname']=$_REQUEST['firstname'];

将触发警告。

此外,我解释这个php错误内容:http://bugs.php.net/bug.php?id=41540 意味着当您将变量分配给尚未初始化的会话超全局时,也可能发生此错误,例如

//Start of script
$_SESSION['bob'] = $bob;

这是找出导致警告的原因的好信息,但我建议不要关闭欧文提到的警告。这些运行时函数在 PHP 5.4.0 中删除,开发人员应该练习避免使用变量。

要解决此问题,开发人员可能会很痛苦,但是如果您有

$_SESSION["user"]
$user;

将会话重命名为

$_SESSION["sessuser"];

反之亦然,只要会话名称和变量名称不同。可以这样想:当你升级到最新版本时,无论如何你都必须调试你的代码。

当您对 .htaccess 进行更改时ini_set不起作用。您需要按以下方式执行此操作:

php_flag session.bug_compat_42 0
php_flag session.bug_compat_warn 0

在我的情况下,php.ini 从打开更改为关闭

喜欢这个:

session.bug_compat_42 = off
session.bug_compat_warn = off

如果不起作用,请重新启动 Apache