在PHP中使用PDO,当必须一次向一个表中插入多行时,我使用了看起来像这样的sql:
INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce');
您可以看到,我要用一条语句插入三行。我这样做的原因是,我认为它比执行三个不同的语句插入行更有效。
所以我的问题是这样的:如果我希望能够像在单条语句中一样将值绑定到一条语句,该如何在PHP中执行此操作:
$query= ("INSERT INTO table (firstName, lastName) VALUE (:firstName, :lastName)", array = (
"firstname"=>$firstName,
"lastName"=>$lastName));
所以我的问题是:有什么方法可以在多插入语句中进行绑定?类似于:
INSERT INTO table (firstName, lastName) VALUES((:firstName, :lastName),(:firstName, :lastName));
理论上,这听起来像一条语句会更有效,因为避免了对MySQL服务器的多次调用,但是现实是,这是一个微优化,并且使代码过于复杂,几乎没有任何好处。
关于准备好的语句的妙处在于,它只能准备一次,并且可以多次执行。这已经节省了您多次分析SQL语句的时间。只需在循环外准备一条语句,然后在循环内执行它。
$names = [['Joe', 'Smith'], ['Fred', 'Sampson'], ['Lisa', 'Pearce']];
$stmt = $pdo->prepare('INSERT INTO table (firstName, lastName) VALUES(?,?)');
foreach ($names as $name) {
$stmt->execute($name);
}
如果您按照注释中的常识将整个事情包装在事务中,那么与一个大的陈述相比,性能没有明显的区别。
$names = [['Joe', 'Smith'], ['Fred', 'Sampson'], ['Lisa', 'Pearce'], ['Joe', 'Smith'], ['Fred', 'Sampson'], ['Lisa', 'Pearce']];
$stmt = $pdo->prepare('INSERT INTO people (firstName, lastName) VALUES(?,?)');
$pdo->beginTransaction();
foreach ($names as $name) {
$stmt->execute($name);
}
$pdo->commit();
只需使用?
占位符将您的查询文本创建为:
INSERT INTO table (firstName, lastName) VALUES (?, ?),(?, ?),(?, ?)
并执行它。示例代码可以是:
$data = ['Joe', 'Smith','Fred','Sampson','Lisa','Pearce'];
$placeholders = ['(?, ?)', '(?, ?)', '(?, ?)']; // but you should define this data according to your data
$query = 'INSERT INTO table (firstName, lastName) VALUES ' . implode(',', $placeholders);
$stmt = $dbh->prepare($query);
$stmt->execute($data);
这对您来说可能有点太多,但是我在大量条目上使用INSERT,而我不知道正手有多少个。 (也比本示例中使用的字段多一些)。
$entries = count($myEntries);
$insert_placeholder = "(%d, %s, %s, %s)";
$insert_placeholders = implode(',', array_fill(0, $entries, $insert_placeholder));
在VALUES之后添加到您的查询中>