我注意到在发布表单时,字段会以数组形式出现。
就像我做的那样
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,每个表单收集大量数据,以汇总客户的信息。
答案 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_keys
和array_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多个字段的表格并不是我要填写的内容,我不相信我会独自一人。考虑将其分解为多个步骤,正如其他人建议或尝试重新接近您的初始设计。