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

时间:2014-12-12 13:41:31

标签: php

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

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

因为它会以太多代码行结束。

8 个答案:

答案 0 :(得分:0)

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

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

建议书

人们在这里推荐使用extract()。请不要。正如您可以阅读php documentation

  

不要对不受信任的数据使用extract(),例如用户输入(即$ _GET,   $ _FILES等)。如果您这样做,例如,如果您想运行旧代码   暂时依赖register_globals,请确保使用其中一个   非重写的extract_type值,如EXTR_SKIP,并且要注意   您应该按照定义的顺序提取   php.ini中的variables_order。

建议的做法是直接使用 $_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>

答案 1 :(得分:0)

使用extract($ _ POST)函数

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

它extract()函数将执行变量赋值工作。

答案 2 :(得分:0)

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

其中一个是

  

警告:不要对不受信任的数据使用extract(),例如用户输入(即   $ _GET,$ _FILES等)。如果你这样做,例如你想要老去   暂时依赖register_globals的代码,请确保使用   其中一个非重写标志值,如EXTR_SKIP,并且要注意   您应该按照定义的相同顺序提取   php.ini中的variables_order。

请记住始终对来自用户或服务客户端的输入数据执行验证以避免注入。详细了解here

答案 3 :(得分:0)

正如其他人所写,您可以使用extract($_POST),但请注意security implications

此外,您可以选择定义提取如何处理具有相同名称的现有变量,或者甚至告诉它将字符串添加到变量之前。

假设您发布了以下数据:

$_POST['id'] => 3, 
$_POST['description'] => "ford pinto"
$_POST['color'] => "mustard yellow"

extract($_POST, EXTR_PREFIX_ALL, 'fd1_');

会产生以下变量:

$fd1_id
$fd1_description
$fd1_color

检查documentation以获取有关提取选项的更多信息。

答案 4 :(得分:0)

好的,在我之前的回答由于安全问题而被拒绝后,我将再次尝试。

在一个文件中,例如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]; 
}
...
?>

答案 5 :(得分:0)

没有银弹,这完全取决于用例。

在某些情况下,您可能只是直接使用$_POST['foo'],但大多数情况下,您需要在尝试使用之前检查数据是否已设置,同时请确保在没有正确替换的情况下不直接输出数据。这就是为什么答案说的; 直接使用它可能意味着变量总是被设置并且在非危险的上下文中使用,在大多数情况下并非如此......

大多数情况下,您希望使用要检索的数据执行 stuff 。在这种情况下,重要的是不要直接修改$_POST['foo'],因为您不应修改全局数据,而是将其封装。

有时你可能做的很好,你问的是什么;避免:因为您可以将从请求中获取的所有值传输到特定变量名称。如果您决定更改客户端标记,这将使重构变得更容易。通常,在尝试直接使用或分配值之前,您可能需要检查值是否已经过了。

这也许是期待php7和https://wiki.php.net/rfc/isset_ternary

的好时机

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

之类的东西

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

而且我相信你可以很容易地将类似的内容映射到一个函数中。在这种情况下你正在寻找的是代码行,而不是更多。

答案 6 :(得分:-1)

我不推荐它,但要获得您想要的解决方案,您需要使用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()函数。

答案 7 :(得分:-1)

我认为这会解决问题:

extract($_POST);

Ref)简单而有效。