我希望有人能就我面临的挑战给我一个建议。我不确定我是否能够按照我想象的方式做到这一点,所以请向更有经验的人寻求建议。
我有一个大约有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);