我的PHP脚本处理一些POST变量。
而不是手动命名每个变量
$name = $_POST['name'];
$email = $_POST['account'];
我希望我的脚本从$_POST数组中获取所有变量名称,并自动创建具有这些名称的变量,例如(不是代码,只是说明原理)
foreach ($_POST as $name => $value) {
$[$name] = $value;
}
这样的事情可能发生吗?
您可以为此使用提取函数。但也存在风险,因为你无法知道发布了什么数据,它会在你调用它的范围内创建或覆盖变量,可能导致意外行为。
您可以使用extract
的一个标志来部分抵消这一点,例如:
extract($_POST, EXTR_SKIP);
无论如何,请确保阅读该函数文档页面上的两个警告(红色块)。当然,当您使用自己的foreach
循环执行此操作时,同样的警告也适用,因此建议这样做的答案不再安全。
php中有提取函数:
extract($_POST);
这是一个非常糟糕的想法,因为它允许用户在PHP脚本中创建任何变量(在使用此代码的范围内)。举个例子,如果你有一个$debugging
标志:
$debugging = false;
foreach ($_POST as $name => $value) {
$$name = $value;
}
// some time later, we do a query and output the SQL if debugging
if($debugging){
echo $sql;
}
如果恶意用户提交了一个名为debugging
、值为1
的输入,该怎么办?您的调试标志将被更改,用户可以看到敏感的调试数据。
试试这个(这是一个糟糕的做法):
foreach ($_POST as $name => $value) {
$$name = $value;
}
您可以使用以下变量执行此操作:
foreach ($_POST as $name => $value) {
$$name = $value;
}
如果您想更多地使用变量名,也可以使用以下格式:
foreach ($_POST as $name => $value) {
${$name.'_1'} = $value;
}
这里有评论说不要使用可变变量,主要是因为它们很难排除故障,让其他人很难阅读你的代码,而且(在大多数情况下)会造成比解决问题更多的麻烦。