将$ _POST表示为数组

时间:2010-02-14 08:35:20

标签: php

我注意到在发布表单时,字段会以数组形式出现。

就像我做的那样

if(isset($_POST['submit'])) {
print_r($_POST);
}

我通常对表单字段执行的操作如下。

让我说我有这样的事情(这就是我通常做的事情)

<form method="POST" action="">
<label>First Name: </label>
<input type="text" name="fname">

<label>Last Name: </label>
<input type="text" name="lname">

<label>Phone: </label>
<input type="text" name="phone">

<input type="submit" name="submit" value="submit">
</form>

然后我会(我不包括字段验证,使其看起来清晰)

if(isset($_POST['submit'])) {

$fname = $_POST['fname'];
$lname = $_POST['lname'];
$phone = $_POST['phone'];

mysql_query("insert into table(fname,lname,phone) values('$fname','$lname','$phone')");

header("Location: gosomewhere.php");

}

由于后期输出采用数组格式,当我处理超过100个字段时,我怎么写这个呢?

大家伙在那里做得怎么样?或者你是怎么做到的?

编辑:最隐秘的是大约60场。我建立这个cms,每个表单收集大量数据,以汇总客户的信息。

5 个答案:

答案 0 :(得分:6)

我认为我从来没有见过任何人以单一形式“处理100多个领域”。如果是这种情况,您可以考虑进行设计更改,以便在此过程中自动保存部分数据。表单数据总是将自己提交到服务器端的数组中,没有办法解决这个问题。

如果您希望一次迭代多个字段(假设您在表单中接受多个事件日期),则可以使用array-style naming-convention

<input type="text" name="events[]" />

在服务器端访问此数据后,您可以通过一个简单的循环快速迭代它:

foreach ($_POST["events"] as $event) {
  echo $event;
}

如果我误解了你的问题,我很抱歉。

答案 1 :(得分:2)

正如乔纳森所说,一种形式的100个领域是很多的。但是你总是可以动态地构建SQL。

E.g:

if(isset($_POST['submit'])) {

  // allow only entries that are database fields
  $allow = array(/*whatever*/);

  $fields = array();
  $values = array();

  foreach($_POST as $field => $value) {
     if(in_array($field, $allow) {
        // Do correct output escaping etc. here !!
        $fields[] = $field;
        $values[] = mysql_real_escape_string($value);
     }
  }

  mysql_query('insert into table(' . join(',', $fields) . ' values(' . join(',', $values) . ')');
}

这假定您的表单字段名称与数据库列名称相同。

如果像Cyro所说,array_keysarray_values保留顺序,那么这可以做得更好:

function clean($value, $field, &$params) {
    if(in_array($field, $params['allow']) {
       // custom validation goes here
       $params['data'][$field] = mysql_real_escape_string($value);
    }
} 

if(isset($_POST['submit'])) {

  // allow only entries that are database fields
  $allow = array(/*whatever*/);

  $params = array('allow' => $allow, 'data' => array());

  array_walk($_POST, 'clean', $params);

  if(!empty($params['data'])) {
      mysql_query('insert into table(' . join(',', array_keys($params['data'])) . ' values(' . join(',', array_values($params['data'])) . ')');
  }
}

请参阅array_walk

答案 2 :(得分:1)

如果您的表单包含超过100个字段,我会担心客户端而不是服务器端。考虑使用类似jQuery UI Tabs的内容将表单拆分为多个区域,使用字段集分隔,以增强可用性。

解决数组问题的一种方法是使用类似PHP的extract函数,但出于安全原因我不建议这样做,因为它不会真正使数据更容易使用。

答案 3 :(得分:1)

处理这么多字段的最佳方法是减少字段数量。没有人愿意填写数十个领域。

如果不这样做,PDO可以通过支持prepared statements提供很多帮助。有一件事是参数,它(不像你的示例代码)不容易受到SQL injection的攻击。参数还可用于使用数组中的值更轻松地构造查询。

$query = $db->prepare("INSERT INTO table (surname, given_name, main_phone, ...) 
    VALUES (:fname, :lname, :phone, ...)");

$values = array()
foreach($_POST as $key => $val) {
    $values[':' + $key] = $val;
}
try {
    $query->execute($values);
} catch (PDOException $exc) {
    ...
}

列名列表可以在别处定义,也可以自动生成,然后在创建预准备语句时implode d。

答案 4 :(得分:0)

如果表单字段名称与数据库表列直接相关,则可以从$ _POST数组动态构建查询。从你的例子中你可以做到:

$allowed_fields = array('fname', 'lname', 'phone');
foreach($_POST as $key => $value) {
  // if this isn't an expected field (user-injection) ignore it
  if(!in_array($key, $allowed_fields))
    continue;

  // do validation checks and data clean up here in a switch
  $data[$key] = mysql_real_escape_string($value);
}
mysql_query("INSERT INTO table(`" . implode('`, `', array_keys($data)) . "`) VALUES('" . implode("', '", array_values($data)) . "')");

但实际上,一个100多个字段的表格并不是我要填写的内容,我不相信我会独自一人。考虑将其分解为多个步骤,正如其他人建议或尝试重新接近您的初始设计。