将每个'name'值输入传递给动态创建的变量

时间:2010-09-17 08:14:29

标签: php

我正在创建一个非常大的表单,所有输入都包含类似

的表单
<input type="text" id="first_name" name="first_name" />

所以不必做

$first_name = $_POST['first_name'];
对于每个输入

等等,有没有办法从<form></form>中的每个输入中获取每个'name'或'id',并应用于'name'或'的相同值的变量ID”。

我在考虑类似foreach语句的内容?

有什么想法吗?

编辑:

鉴于此处有一小段代码,现在如何使用下面给出的示例?

function filter($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
    echo $value . '<br />';
}

2 个答案:

答案 0 :(得分:5)

使用extractforeach这是一个坏主意,它会允许某人劫持您代码中的变量。

想象一下以下

$my_user_id = 10;
extract($_POST);
// Load the user for $my_user_id using MYSQL
// Change some value of the user for $my_user_id
// Update the database for user $my_user_id

当用户攻击您的表单并更改my_user_id的值时会发生什么?

他们将能够更改您希望他们更改的用户的值。

你应该只获得你知道的$_POST的值,并且应该在那里。不要抓住所有东西,并假设它应该在那里。

答案 1 :(得分:2)

这样的变量赋值是非常糟糕的主意。恶意用户可以通过这种方式重写程序中的任何变量 永远不要做这样的事情 你对foreach声明是正确的。但是不要用它来设置变量 - 只需使用它来完成脚本目标。迭代$ _POST并将其值放入查询或邮件正文或其他任何内容中。不需要全局范围变量

正如我上面所说,使用foreach进行真正的自动化 您可以使用此函数从字段名称数组和$ _POST数组中生成SET SQL语句:

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "INSERT INTO $table SET ".dbSet($fields);