我目前在MySQL上使用这种类型的SQL在一个查询中插入多行值:
INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),...在PDO上的读数中,使用预准备语句应该比静态查询提供更好的安全性。
因此,我想知道是否可以使用准备好的语句生成“使用一个查询插入多行值”。
如果是,我是否可以知道如何实施呢?
发布于 2012-02-01 07:28:33
无论如何,我已经看到许多用户建议迭代INSERT语句,而不是像选择的答案那样构建单个字符串查询。我决定运行一个简单的测试,只有两个字段和一个非常基本的insert语句:
<?php
require('conn.php');
$fname = 'J';
$lname = 'M';
$time_start = microtime(true);
$stmt = $db->prepare('INSERT INTO table (FirstName, LastName) VALUES (:fname, :lname)');
for($i = 1; $i <= 10; $i++ ) {
$stmt->bindParam(':fname', $fname);
$stmt->bindParam(':lname', $lname);
$stmt->execute();
$fname .= 'O';
$lname .= 'A';
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Completed in ". $time ." seconds <hr>";
$fname2 = 'J';
$lname2 = 'M';
$time_start2 = microtime(true);
$qry = 'INSERT INTO table (FirstName, LastName) VALUES ';
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?), ";
$qry .= "(?,?)";
$stmt2 = $db->prepare($qry);
$values = array();
for($j = 1; $j<=10; $j++) {
$values2 = array($fname2, $lname2);
$values = array_merge($values,$values2);
$fname2 .= 'O';
$lname2 .= 'A';
}
$stmt2->execute($values);
$time_end2 = microtime(true);
$time2 = $time_end2 - $time_start2;
echo "Completed in ". $time2 ." seconds <hr>";
?>虽然整个查询本身花费了几毫秒或更少的时间,但后者(单字符串)查询的速度始终快8倍或更多。如果将其构建为在更多的列上反映数千行的导入,则差异可能是巨大的。
发布于 2009-07-24 09:28:53
两种可能的方法:
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:v1_1, :v1_2, :v1_3),
(:v2_1, :v2_2, :v2_3),
(:v2_1, :v2_2, :v2_3)');
$stmt->bindValue(':v1_1', $data[0][0]);
$stmt->bindValue(':v1_2', $data[0][1]);
$stmt->bindValue(':v1_3', $data[0][2]);
// etc...
$stmt->execute();或者:
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item)
{
$stmt->bindValue(':a', $item[0]);
$stmt->bindValue(':b', $item[1]);
$stmt->bindValue(':c', $item[2]);
$stmt->execute();
}如果所有行的数据都在单个数组中,我将使用第二种解决方案。
发布于 2009-07-24 09:04:41
这根本不是您使用预准备语句的方式。
每个查询插入一行是完全没有问题的,因为您可以使用不同的参数多次执行一条预准备语句。事实上,这是最大的优势之一,因为它允许您以高效、安全和舒适的方式插入大量行。
因此,也许可以实现您提出的方案,至少对于固定数量的行数是可能的,但几乎可以保证这不是您真正想要的。
https://stackoverflow.com/questions/1176352
复制相似问题