【问题标题】:Mysqli and binding multiple value sets during insert [duplicate]Mysqli并在插入期间绑定多个值集[重复]
【发布时间】:2013-03-12 14:36:13
【问题描述】:

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

当必须一次向表中插入多行时,我使用了如下所示的 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 语句,而且似乎效率较低。

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

【问题讨论】:

  • 是的,但连接起来会不那么麻烦。顺便说一句重复的问题
  • 谢谢,但如果它是重复的,你能指出另一个问题在哪里吗?
  • 这是个坏消息。每天都有很多重复的问题(关于所有主题)出现,以至于不可能找到一个特定的问题。它可能已经被埋在 mysqli 标签下的 300 个以下的其他问题中了。
  • 是的,我很难找到答案
  • 我个人建议要么连接,要么 - 如果您想不惜一切代价坚持使用原生准备好的语句 - PDO 将花费大约十倍的精力来创建多插入查询。

标签: php mysql mysqli


【解决方案1】:

简单:

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

【讨论】:

  • 你也能以这种方式在循环中使用 bind_param 吗?例如,for(x=0 ...) { $name1 = $ar[$x]; $name2 = $ar[$x+1]; $stmt->bind_param($name1, $name2); }
  • 另外,我想您仍然需要知道初始准备好的语句中?s 的数量。
  • 您能解释一下为什么使用 S 作为第一个参数吗?我知道因为有 6 个字段,所以有 6 个,但我只是不明白为什么要这样做。这对我来说毫无意义(虽然是的,它确实有效,而且我确实 +1 了)。
  • 每个 's' 代表值的类型 - s 是“字符串”类型(这样 mysql 知道如何处理每个参数) - 类型是 i 表示整数,d 表示双精度(或浮点数),s 表示字符串,b 表示 blob:php.net/manual/en/mysqli-stmt.bind-param.php - 在本例中,所有参数都是字符串,因此您可以绑定 6 个 S :)
【解决方案2】:

你看错了。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 所以,这样的计算似乎占用了大部分资源,而实际的磁盘写入、表锁、索引重建、单独的网络调用什么都不用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多