pdo和在insert-recently期间绑定多个值集

r6hnlfcb  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(372)

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

所以我的问题是:有没有什么方法可以绑定到multi-insert语句中?比如:

INSERT INTO table (firstName, lastName) VALUES((:firstName, :lastName),(:firstName, :lastName));
kmpatx3s

kmpatx3s1#

只需创建查询文本 ? 占位符为:

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

qv7cva1a2#

从理论上讲,一条语句可能更有效,因为您可以避免多次调用mysql server,但实际情况是,这是一种微优化,您将代码过度复杂化,几乎没有任何好处。
prepared语句的酷之处在于它只准备了一次,可以执行多次。这已经节省了多次解析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();

相关问题