php PDO和在插入期间绑定多个值集

ivqmmu1c  于 2023-02-03  发布在  PHP
关注(0)|答案(2)|浏览(101)

在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));
n9vozmp4

n9vozmp41#

理论上,这听起来像是单个语句更有效,因为您避免了对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);
}

如果你像你的常识在评论中建议的那样把整个事情 Package 在一个事务中,那么与一个大的语句相比,在性能上没有明显的区别。

$names = [['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();
0g0grzrc

0g0grzrc2#

只需使用?占位符创建查询文本,如下所示:

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);

相关问题