将整个表单循环到MySQL数据库行中


Looping an entire form into a MySQL db row?

我希望有人能就我面临的挑战给我一个建议。我不确定我是否能够按照我想象的方式做到这一点,所以请向更有经验的人寻求建议。

我有一个大约有20列的数据库表。它有很多专栏,不幸的是我无法改变这一点。目标是接受表单提交并将其插入此表中。所以我得到的是,字段名与数据库中的列名相同。

为了保持代码的简洁性,我只想把整个表单(键和值)拉进去,而不是做传统的$varWhatever=$_POST['watever'];20次。使用类似的东西:foreach($_POST为$key=>$value)

现在我的问题是,如果可能的话,我如何运行foreach循环,使我能够将键和值放入一个SQL语句中?

"INSERT INTO table_name (Loop all keys here) VALUES (Loop related values here)"

这可能吗,还是我应该回到我上面提到的更传统的方式?

我的一种想法是,在开始循环之前,我可以创建空行并获取它的ID,然后在循环中,我可以对匹配ID的行运行更新查询。不过听起来很草率。

这是我提出的一个解决方案。您首先必须定义一个字段名称数组,该数组充当预期输入的白名单。然后,您只需循环遍历该数组,即可构建一个参数数组来绑定提交的值。并且implode在构建查询时使用逗号表示数组。

$fields = array('field1','field2','field3');
$binds = array();
foreach ($fields as $field) {
    $binds[":$field"] = $_POST[$field];
}
$sql = "INSERT INTO table_name (" . implode(',',$fields) . ") VALUES (" . implode(',',array_keys($binds)) . ")";
$db->prepare($sql);
$db->execute($binds);

这假设您正在使用PDO。

是的,您可以循环查找所有键(例如,执行array_keys),但我不建议盲目地获取任何提交参数并将其放入SQL查询中。

相反,我会保留一个表单中所有有效列的列表,并使用它,记住每个值也需要净化。

例如:

<?php
$columns = array('column1', 'column2', 'column3', …);
foreach ($columns as $column) {
    if (!isset($_POST[$column])) {
       die("No data for column $column'n");
    }
 }
 if (!check_csrf($_POST['csrt_token'])) { … }
 # (setup database connection)
 $SQL = "INSERT INTO table_name (" . implode(", ", $columns) . ") VALUES (";
 foreach ($column as $column) {
       $SQL .= "'" . $mysqli->real_escape_string($_POST[$column]) . "',";
 }
 $SQL[strlen($SQL)-1] = ')';
 $mysqli->query($SQL);