自动从$_POST数组命名变量


Naming variables automatically from $_POST array.

我的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;
}

这里有评论说不要使用可变变量,主要是因为它们很难排除故障,让其他人很难阅读你的代码,而且(在大多数情况下)会造成比解决问题更多的麻烦。