[PDO并在插入过程中绑定多个值集-最近

问题描述 投票:-1回答:3

在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));
php mysql sql pdo
3个回答
1
投票

理论上,这听起来像一条语句会更有效,因为避免了对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();

0
投票

只需使用?占位符将您的查询文本创建为:

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

-2
投票

这对您来说可能有点太多,但是我在大量条目上使用INSERT,而我不知道正手有多少个。 (也比本示例中使用的字段多一些)。

$entries = count($myEntries);
$insert_placeholder   = "(%d, %s, %s, %s)";
$insert_placeholders  = implode(',', array_fill(0, $entries, $insert_placeholder));

在VALUES之后添加到您的查询中>

© www.soinside.com 2019 - 2024. All rights reserved.