Php 插入期间PDO和绑定多个值集-最近

Php 插入期间PDO和绑定多个值集-最近,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,在PHP中使用PDO时,当必须同时向表中插入多行时,我使用的sql如下所示: INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce'); 如您所见,我用一条语句插入了三行。我这样做的原因是我相信它比执行三条不同的语句来插入行更有效 所以我的问题是:如果我希望能够像在单个语句中一样将我的值绑定到一个语句,那么如何在PHP中做到这一点: $que

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

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

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

从理论上讲,一条语句听起来可能更有效,因为您可以避免多次调用MySQL服务器,但现实情况是,这是一个微观优化,您正在过度复杂化代码,几乎没有任何好处

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);
}
如果您按照评论中的常识将整个事务包装在一个事务中,那么与一个大声明相比,性能上没有明显的差异

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

只需绑定
并传递您的所有数据。“我相信它更有效”-不,它不是。您能想出一个更合适的标题吗?@您的常识是,向数据库发出多个请求与发出一个请求是一样的吗?@这取决于您的想法。这个咒语是一个很好的通用指南,但是在上面的情况下,性能的提高可以忽略不计,并且会使代码变得不必要的复杂。您所说的主要适用于N+1问题,或者在不影响代码可读性的情况下可以轻松避免进行额外调用的情况。多个调用会带来开销,但您应该问的问题是,什么时候避免这种开销是明智的。我建议在一个事务中包装多个插入,以克服可能的延迟,并总体上提高完整性