从提交表单声明变量的最佳方式


Best way to declare varibles from a submit form

提交的表单中定义变量的最佳方法是什么,而不是:

$username = $_POST['username'];
$email = $_POST['email'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
etc

因为它最终会得到太多的代码行。

使用extract($_POST(函数

它会将数组键转换为变量,之后您可以直接用作$username、$email、$firstname和$lastname等。

它 extract(( 函数将执行变量分配工作。

您可以使用提取方法,但请记住阅读与之相关的警告,以便在您在这里处理什么之前了解

其中之一是

警告:不要对不受信任的数据使用 extract((,例如用户输入(即 _GET 美元、_FILES 美元等(。如果你这样做,例如如果你想跑旧的 暂时依赖register_globals的代码,请确保使用 其中一个非覆盖标志值,例如EXTR_SKIP和注意 应按照中定义的相同顺序提取 variables_order在 php.ini 中。

请记住始终对来自用户或服务客户端的输入数据执行验证,以避免注入。在这里阅读更多关于它的信息

正如

其他人所写的那样,您可以使用extract($_POST)但要注意安全隐患。

此外,您可以选择定义 extract 如何处理具有相同名称的现有变量,甚至可以告诉它为变量添加字符串。

假设您发布了以下数据:

$_POST['id'] => 3, 
$_POST['description'] => "ford pinto"
$_POST['color'] => "mustard yellow"
extract($_POST, EXTR_PREFIX_ALL, 'fd1_');

将产生以下变量:

$fd1_id
$fd1_description
$fd1_color

有关数据提取选项的更多信息,请查看文档。

好的,在我之前的回答因为安全问题而被否决后,我将再次尝试。

在一个文件中,比如说 inputs_definitions.php ,定义您期望哪些字段:

<?php
$inputsDefinitions = [
  'name' => ['type' => 'text', 'placeholder' => 'Your name'],
  ...
];

然后将此文件包含在视图中并生成动态表单:

<?php
include("inputs_definitions.php");
for ($inputsDefinitions as $field => $properties) {
  echo '<input type="' . $properties['type'] . '" placeholder="' . $properties['placeholder'] . '" name="' . $field . '" />';
}
?>

在处理数据的代码中,再次包含此文件并执行以下操作:

<?php
include("inputs_definitions.php");
for ($inputsDefinitions as $field => $properties) {
   $$field = $_POST[$field]; 
}
...
?>

你已经回答了自己:你提到的那个是在纯PHP世界中声明表单变量的最佳方式。

你可以在上面写任意多的抽象,但你明白了,如果你提交一个帖子,你需要通过你刚刚发布的快照......

建议书

人们在这里推荐使用extract()。拜托,不要。正如您可以从 php 文档中读到的:

不要对不受信任的数据使用 extract((,例如用户输入(即 $_GET, _FILES 美元等(。如果你这样做,例如如果你想运行旧代码 暂时依赖于register_globals,请确保使用以下之一 非覆盖extract_type值,例如EXTR_SKIP和注意 应按照中定义的相同顺序提取 variables_order在 php.ini 中。

建议的做法是直接使用 $_POST[<varname>]。这样,Web 应用程序的用户就无法设置应该安全的变量。

常见模式如下所示:

<?php
   if(isset($_POST['submit']) 
   {
      echo("First name: " . htmlentities($_POST['firstname']) . "<br />'n");
      echo("Last name:  " . htmlentities($_POST['lastname'])  . "<br />'n");
   }
?>
<form action="myform.php" method="post">
   <p>First name: <input type="text" name="firstname" /></p>
   <p>Last name: <input type="text" name="firstname" /></p>
   <input type="submit" name="submit" value="Submit" />
</form>

没有灵丹妙药,这完全取决于用例。

在某些情况下,您可能只是直接使用$_POST['foo'],但大多数时候,您需要在尝试使用它之前检查数据是否已设置,并确保不要在没有正确 Santization 的情况下直接输出它。这就是为什么答案说;直接使用它可能以某种方式暗示该变量始终被设置并在非危险上下文中使用,

在大多数情况下并非如此......

大多数时候,您想对要检索的数据执行操作。在这种情况下,重要的是不要直接修改$_POST['foo']因为您不应该修改全局数据,而应该将其封装。

有时,按照您的要求去做可能会很好;避免:因为您将有一个地方将从请求中获得的所有值转移到特定的变量名称。如果您决定更改客户端标记,这使得重构变得更加容易。通常,在尝试直接使用或分配值之前,您可能需要检查值是否已传递。

这也可能是期待 php7 和 https://wiki.php.net/rfc/isset_ternary 的好时机

请记住,您发送的数据越多,您必须编写代码才能正确管理它。而你要求不做的事情,可能正是你想做的......或者也许是这样的

$foo = isset($_POST['foo']) ? $_POST['foo'] : null;

而且我相信您可以轻松地将类似的东西放入函数中。在此上下文中,您要查找的不是更少的代码行,而是更多。

我认为这可以解决问题:

extract($_POST);

(参考(简单有效。

我不推荐它,但要获得您想要的解决方案,您需要使用 filter_input(( 和一个数组:

$aArray = array_keys($_POST);
foreach($aArray as $sField) {
    ${$sField}= filter_input(INPUT_POST, $sField);
    // and You can make some extra filtering here
    // for example: filter it by previously prepared array of acceptable field keys
}

但是,如果您只是想要不太安全的解决方案,请使用extract()功能。