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

Posted

技术标签:

【中文标题】使用全局变量作为数据源的 PHP 会话副作用警告【英文标题】:PHP session side-effect warning with global variables as a source of data 【发布时间】:2010-09-15 13:29:32 【问题描述】:

我正在尝试托管一个给我的 php 网站。我看到了这个警告:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

像魅力一样工作!竖起大拇指! 对于不擅长修改 php.ini 文件的人来说,上面的格式不是你使用的。一行应该是“session.bug_compat_42 = 0”,另一行应该是“session.bug_compat_warn = 0”(没有引号)。不过,请先在您的 php.ini 文件中进行搜索。很可能两者都已经被定义为 1,你只需要切换到 0【参考方案2】:

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

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;

【讨论】:

【参考方案3】:

这是找出导致警告的原因的好信息,但我建议不要关闭 Owen 提到的警告。这些运行时函数是removed in PHP 5.4.0,开发者应该练习避免这种变量的使用。

要解决这个问题,开发人员可能会很痛苦,但如果你有

$_SESSION["user"]
$user;

将会话重命名为

$_SESSION["sessuser"];

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

【讨论】:

【参考方案4】:

当您对 .htaccess 进行更改时,ini_set 不起作用。你需要这样做:

php_flag session.bug_compat_42 0
php_flag session.bug_compat_warn 0

【讨论】:

【参考方案5】:

在我的例子中,php.ini 由 on 变为 off

像这样:

session.bug_compat_42 = off
session.bug_compat_warn = off

如果不工作,重启apache

【讨论】:

以上是关于使用全局变量作为数据源的 PHP 会话副作用警告的主要内容,如果未能解决你的问题,请参考以下文章

PHP 全局变量 - 超全局变量

PHP预定义变量

PHP-作用域相关

作用域

PHP超级全局变量——Session 变量

Mysql变量简介