2010-02-14 64 views
2

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

一样,如果我做

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> 

然后我就会有(IM排除字段验证,使它看起来清晰)

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来汇总来自客户的信息。

回答

6

我不认为我见过任何一个“处理超过100个领域”的单一形式。如果是这种情况,您可以考虑一个设计更改,自动保存部分数据。表单数据将始终将自己提交到服务器端的数组中,这是无法解决的。

如果你想很多领域都在一次遍历(假设您接受您的形式多事件的日期),你可以使用array-style naming-convention

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

一旦你访问服务器上的这个数据最后,你可以在一个简单的循环中快速迭代它:

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

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

+0

它确定,我问这个的原因是因为我查看了第三方Web应用程序,并且表单提交的字段绝不是我这样做的方式。许多人都这样做,但这些应用程序有一个读取字段值并通过类提交给数据库的类。我不知道它是如何做到的。经历了很多工作,并了解他们如何做到这一点。 – sarmenhbbb 2010-02-14 08:46:06

+2

@sarmenhbbb:也许你想看看Zend Framework或Symfony。我猜你发现的例子使用ORM和一些表单框架的组合。如果你不得不用表格处理很多事情,那么它会变得很烦人。如果你至少使用一个表单框架,你可以节省很多时间;) Zend表格:http://framework.zend.com/manual/en/zend.form.html – 2010-02-14 08:59:28

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) . ')'); 
} 

这是假设你的表单字段名称与您的数据库列名。

如果如说西罗,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

+0

你会怎么做?如果你不介意你能告诉我吗? – sarmenhbbb 2010-02-14 08:44:07

1

如果表单包含了超过100场,我更担心更多关于客户端的信息比服务器端更多。考虑使用诸如jQuery UI Tabs之类的东西将表单分成多个区域,使用字段集分隔以提高可用性。

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

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多个字段的表格是不是我会永远填写,我不相信,我一个人在这。考虑将其分解为其他人所建议的多个步骤,或尝试重新处理您的初始设计。

+0

你确定'array_keys()'和'array_values()'保持顺序吗?找不到任何关于它的事情。 – 2010-02-14 08:56:40

+0

@Felix是的,我用过他们无数次,没有问题。 – nortron 2010-02-14 09:02:09

+0

使用列名作为表单输入名称公开信息并因此具有安全风险。这不被认为是最佳做法。 – outis 2010-02-14 09:24:05

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。