PHP Post变量

3

在我的旧项目中,POST变量使用的是$var_name而不是$_POST["var_name"]。因此,我需要在所有文件中更改代码。那么我是否需要更改php.ini中的任何内容(自动提取选项),以便在不更改编码的情况下处理这个问题。谢谢。

4个回答

5
您的旧项目使用了一个现在已被弃用(自5.3以来)和删除(自5.4以来)的功能,称为“register globals”。请阅读以下内容,了解为什么要删除此功能:http://php.net/manual/en/security.globals.php 简而言之,不,您不需要更改php.ini文件,以使您的旧应用程序可以工作。相反,您更有可能希望修复旧应用程序以在没有register globals的情况下工作。
话虽如此,如果这不是公共应用程序或者安全性不是问题,那么您可以配置php.ini文件,即使对于PHP 5.4也可以让您的应用程序工作。 警告: 这涉及更改php.ini文件,以便模拟register globals的效果。这意味着所有 PHP脚本都将受到register globals的影响,而不仅仅是您想要的脚本。
正如提到的,extract($_REQUEST);实质上实现了register globals的功能。现在,使用auto_prepend_file指令,您可以在每个脚本之前运行此代码行。
也就是说,将此文件保存在某个地方(最好是在您的PHP包含路径中),并将其命名为register_globals.php
<?php
extract($_POST);

现在在php.ini中添加这一行(路径可能相对于您的PHP包含路径)。

auto_prepend_file = "register_globals.php" ; emulates register_globals

这个改变的影响是在脚本运行之前,require("register_globals.php"); 会被执行。

警告不要在不可信的数据上使用extract(),例如用户输入(即$_GET、$_FILES等)。如果您这样做,例如,如果您想运行依赖于register_globals的旧代码,请确保使用非覆盖extract_type值之一,如EXTR_SKIP,并且要注意应按照php.ini中定义的variables_order顺序提取。 - Your Common Sense
我不太理解Shrapnel上校所说的几件事。首先,什么是临时使用register_globals?其次,如果在脚本中调用extract是第一件事,使用不覆盖提取选项有什么意义?但是,如果存在冲突,提取顺序的确可能会产生影响,但我不认为它必须与variables_orders匹配,除非这个指令的一致性至关重要。 - erisco
所以,如果你不理解基本的东西,最好问而不是回答。 - Your Common Sense
我对Shrapnel上校的语气感到不满。我承认在extract中可能会漏掉一些关于register_globals重要的东西,这些东西并没有被正确捕捉到。我在之前的评论中请求澄清,因为我还不理解你的推理,而不是因为我想说你的理由是错误的。我正在努力帮助Act DEV,并且感谢你的指导。 - erisco

3

我理解你不愿意改动很多代码,但是不良的设计应该被纠正,无论它带来多少麻烦。将全局变量更改为正确的POST变量,否则你将会后悔。有99%的机会你最终会得出这个结论,现在就做吧。


我在想为什么没有人抨击这种权宜之计的方法。 - John Cartwright

2

Anupam Jain... 非常感谢 :-) - Act DEV

1

register_globals是一种旧的方式,可以通过变量名获取提交的值,而不是使用post、get或request变量。但这在新版本中已被弃用。您需要修改代码以接受$_POST['email']而不是$email。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接