给出以下数组;
[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
等...
所以一切都很好。它做我想要的和工作,但考虑到输入数组键与表匹配,我的代码似乎过于复杂。必须有一个更清洁的方法来做到这一点。
答案 0 :(得分:1)
您可以使用问号参数简化一些代码。例如,顺便说一下:
$db_columns = '(' . implode('),(', array_fill(0, count($rows), implode(',', array_fill(0, count($rows[0]), '?')))) . ')';
$sql = "INSERT INTO table (".implode(', ', array_keys($rows[0])).")
VALUES $db_columns";
$query = $db->prepare($sql);
$status = $query->execute($column_values);
$query->execute(array_merge(...array_map('array_values', $rows)));