2011-04-22 35 views
3

我正在尝试将网站从一台主机迁移到另一台主机。在第一台主机上,当你提交一个表单时,所有的表单值都会自动粘贴到输入名称(这是PHP)的变量中。在新的主机,这些值均为空,除非我这样做:如何在PHP中获取所有提交的表单值并自动将它们分配给变量?

$data = $_GET['data'];

是否有导致此PHP的配置设置?如果没有,是否有简单的方法循环遍历所有$ _GET变量并自动将它们的值赋给一个具有相同名称的变量?

谢谢!

+2

配置是'register_globals',可以通过'extract($ _ GET);'来模拟。但是真的,***不要做这个***。 'register_globals'已被弃用 - 它存在严重的安全问题。相反,更好的重写你的代码。 – NikiC 2011-04-22 15:52:20

回答

6

该设置是register_globals,但现在已被弃用,强烈建议不要使用它,因为它存在安全风险。任何人都可以在脚本中设置可能与您的代码以负面或意想不到的方式进行交互的变量。

如果你绝对必须,你可以做这样的:

foreach ($_GET as $key=>$value) { 
    $$key = $value; 
} 

,或者更简单地说:

import_request_variables("g"); 

,或者使它稍微更安全:

import_request_variables("g", "myprefix_"); // This way forces you to use "myprefix_" 
// in front of the variables, better ensuring you are not unaware 
// of the fact that this can come from a user 

提取($ _GET)也可以像其他人指出的那样工作,它还允许指定(通过额外的参数)添加前缀或什么如果你的提取与已经存在的变量冲突(例如,如果你在定义了其他变量后提取)。

1

你可以做这样的事情:

foreach ($_GET["data"] as $name => $value){ 
    $$name = $value; 
} 

这样做的问题是,它很容易让人们在你的脚本变量拨弄。我可以访问http://yoursite.com/?sql=DELETE+FROM ...

我建议不要这样做,只是坚持使用$ _GET。

0

你的问题推断分配时$ _GET [“数据”]到$的数据,除非你正在做这几样检查的进一步下跌脚本你没有做任何过滤或验证。

从我所看到的大多数程序员会做这第一个,在努力,如果预期的数据没有达到预期,所以,在期待一个积极INT的情况下,上述的分配将成为早期失败是这样的:

if(isset($_GET['data']) && (int)$_GET['data'] === 0){ 
//fail 
}else{ 
$data = $_GET['data']; 
} 

所以看到只是普通

$data = $_GET['data'] 

让我退避三舍。

相关问题