我目前在MySQL上使用这种类型的SQL在一个查询中插入多行值:
INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),...
在PDO的阅读资料中,使用预先准备好的语句应该比静态查询更安全.
因此,我想知道是否可以使用准备好的语句生成"使用一个查询插入多行值".
如果是的话,请问我怎样才能实施呢?
我目前在MySQL上使用这种类型的SQL在一个查询中插入多行值:
INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),...
在PDO的阅读资料中,使用预先准备好的语句应该比静态查询更安全.
因此,我想知道是否可以使用准备好的语句生成"使用一个查询插入多行值".
如果是的话,请问我怎样才能实施呢?
Multiple Values Insert with PDO Prepared Statements个
在一个execute语句中插入多个值.为什么,因为根据this page,它比常规插入更快.
$datafields = array('fielda', 'fieldb', ... );
$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);
$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);
更多的数据值,或者您可能有一个填充数据的循环.
对于准备好的插入,您需要知道要插入的字段,以及要创建插入的字段的数量?用于绑定参数的占位符.
insert into table (fielda, fieldb, ... ) values (?,?...), (?,?...)....
这基本上就是我们希望的INSERT语句的外观.
现在,代码:
function placeholders($text, $count=0, $separator=","){
$result = array();
if($count > 0){
for($x=0; $x<$count; $x++){
$result[] = $text;
}
}
return implode($separator, $result);
}
$pdo->beginTransaction(); // also helps speed up your inserts.
$insert_values = array();
foreach($data as $d){
$question_marks[] = '(' . placeholders('?', sizeof($d)) . ')';
$insert_values = array_merge($insert_values, array_values($d));
}
$sql = "INSERT INTO table (" . implode(",", $datafields ) . ") VALUES " .
implode(',', $question_marks);
$stmt = $pdo->prepare ($sql);
$stmt->execute($insert_values);
$pdo->commit();
虽然在我的测试中,当使用多个插入和常规准备的单值插入时,只有1秒的差异.