【发布时间】:2017-06-06 10:31:04
【问题描述】:
给定以下数组;
[0] => array(
col1 => val1,
col2 => val2,
col3 => val3
),
[2] => array(
col1 => val1,
col2 => val2,
col3 => val3
),
[3] => array(
col1 => val1,
col2 => val2,
col3 => val3
)
还有一个列名相同的数据库表col1、col2和col3
将其插入数据库最有效的方法是什么?
我目前有这样的东西;
$i = 0;
$db_columns = '';
$column_values = array();
foreach ($rows as $k => $row)
{
$columns = array();
$fields = array();
foreach ($row as $a => $b)
{
$column_values[$a.$i] = $b;
$columns[] = ':'.$a.$i;
$fields[] = $a;
}
// build up sql values
$db_columns .= ($db_columns ? ', ' : '').'('.implode(', ', $columns).')';
$i++;
}
// perform insert
$sql = "INSERT INTO table (".implode(', ', $fields).")
VALUES $db_columns";
$query = $db->prepare($sql);
$status = $query->execute($column_values);
这将像这样构建查询字符串;
INSERT INTO table (col1, col2, col3)
VALUES (:col10, :col20, :col30), (:col11, :col21, :col31), (:col12, :col22, :col32)
用数组来匹配绑定变量:col10、:col20、:col30、:col11等...
所以一切都很好。它可以满足我的需求并且可以工作,但是考虑到输入数组键与表匹配,代码对我来说似乎过于复杂。必须有更清洁的方法来做到这一点。
【问题讨论】:
-
使用问号参数发送合并数组
-
这看起来很容易受到 SQL 注入的攻击,或者可能受到由字段内容创建的语法错误的攻击。
-
您没有发布完整的表结构,但是如果您要添加到表中的所有列,则无需命名列;意思是删除
(col1, col2, col3) -
splash58听起来确实会删掉一大块代码。我没有想到这一点。会尝试。ADyson数组不是由用户输入生成的。所有数组键都是在代码的其他地方手动设置的,所以 AFAIK 这些不应该是问题。 -
@Novocaine eval.in/812609