我已经玩了几个小时并试图解决这个问题,但看起来很难解决。
我可以进行单个数组插入
$person = array('name' => 'Wendy', 'age' => '32');
但如果我想要这样的多个:
$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));
它不起作用?任何帮助将不胜感激。
多次插入:
public function insertPdo($table, $data){
try{
if (!is_array($data) || !count($data)) return false;
$bind = ':' . implode(', :', array_keys($data));
$sql = 'INSERT INTO ' . $table . ' (' . implode(', ',array_keys($data)) . ') ' . 'values (' . $bind . ')';
$sth = $this->__dbh->prepare($sql);
$result = $sth->execute($data);
}
catch(PDOException $e){
echo $e->getMessage();
}
}
单次插入
$person = array('name'=>'Dan', 'age'=>'30');
$db->insertPdo('test_pdo',$person);
// For Multi Insertion, I'm trying to use this in above function
foreach ($data as $row) {
$result = $sth->execute($row);
};
$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));
$db->insertPdo('test_pdo',$person);
错误:
错误:SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配
答案 0 :(得分:3)
要利用MySQL(http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html)中多个插入的插入速度,您可以使用构建较大查询的预准备语句。这确实增加了复杂性,而不是更多的迭代方法,因此可能只适用于高需求系统或大数据集。
如果您拥有上述建议的数据:
$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' =>
'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));
我们希望生成一个如下所示的查询:
insert into table (name, age) values (?,?), (?,?), (?,?);
要把它拉到一起,你会想要一些不完全不同的东西:
$pdo->beginTransaction() // also helps speed up your inserts
$insert_values = array();
foreach($person as $p){
$question_marks[] = '(?,?)';
$insert_values = array_merge($insert_values, array_values($p));
}
$sql = "INSERT INTO table_name (name, age) VALUES " . implode(',', $question_marks);
$stmt = $pdo->prepare ($sql);
try {
$stmt->execute($insert_values);
} catch (PDOException $e){
// Do something smart about it...
}
$pdo->commit();
答案 1 :(得分:2)
你不能自动这样做。相反,您必须手动迭代并执行每条记录:
for ($person as $row) {
$sth->execute($row);
}