3

希望有人可以在这里给我一些见解。

当不得不一次向表中插入多行时,我使用了如下所示的 sql:

INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce')

如您所见,我用一条语句插入三行。我这样做的原因是我相信它比执行三个不同的语句来插入行更有效。

所以我的问题是:如果我希望能够将我的值绑定到一个语句,我该怎么做?不幸的是,我一直在寻找整个网络,我只能找到以下形式的单个语句示例:

$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?)");
$stmt->bind_param('ss', $firstName, $lastName);
$firstName = "Joe";
$lastName = "Smith";
$stmt->execute();
$firstName = "Fred";
$lastName = "Sampson";
$stmt->execute();

这似乎相当于执行单独的 INSERT 语句,并且似乎效率较低。

所以我的问题是:有没有办法在多插入语句中绑定?请在这里教育我!谢谢

4

3 回答 3

7

简单的:

$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?),(?,?),(?,?)")
$stmt->bind_param('ssssss', 'Joe', 'Smith','Fred','Sampson','Lisa','Pearce');
于 2013-03-23T11:36:11.183 回答
4

这似乎相当于执行单独的 INSERT 语句,并且似乎效率较低。

不,它的效率并不低——因为一条语句只准备一次(以弄清楚它应该做什么),之后只有数据被发送到数据库。

于 2013-03-22T16:52:00.217 回答
0

您以错误的方式看待这个问题。

你几乎永远不会做上面展示的事情,它几乎总是在一个循环中完成。即使您动态构建(?, ?), (?, ?), (?, ?),您仍然需要循环构建查询字符串并绑定数据(由于 MySQLi 对 by-ref 绑定的荒谬坚持,这将变得更加复杂),因此它不会为您带来任何好处需要由 PHP 完成的工作——你只是移动了循环——它会在可读性方面给你带来很多损失。

它确实在数据库的往返行程中有所收获(假设您总是插入不止一行) - 但这只会在插入数百或数千行或行时产生有意义的差异,在这种情况下,您很可能会执行某种导入操作,在这种情况下,额外的几秒钟可能无关紧要(例如,它不会减慢页面加载速度)。

于 2013-03-22T16:42:35.810 回答