【问题标题】:Sensible method to insert multiple rows?插入多行的明智方法?
【发布时间】:2014-05-16 02:33:39
【问题描述】:

我有以下数据库关系:

|--------|             |-----------------|            |-------|
| Groups | ------- 1.* | GroupMembership | *.1------- | Users |
|--------|             |-----------------|            |-------|

我在 Groups 中有 group id,在 Users 中有 user id,在 group 成员中都有,因此在组和用户之间建立了关系。

GroupMembership 中的一条记录如下所示:

GroupID | UserID | datetime

我有一个从如下形式发布的数组:

["members"]=> array(5) { 
                          [0]=> "175" 
                          [1]=> "113" 
                          [2]=> "122" 
                          [3]=> "80" 
                          [4]=> "161"
}

每个值(175、113 等)都是一个用户 ID。我需要为该数组中的每个 ID 在 GroupMembership 表中插入一个新行。如何在不占用数据库和服务器资源的情况下完成这样的任务?

提前致谢!

【问题讨论】:

  • 等到最后一分钟做作业,嗯?
  • 不,我是一个全职工作的人,我称自己为学生,因为我是自学的,在这里说我是学生比解释我是学生更容易想学PHP的极客:)
  • 甚至安塞尔·亚当斯都认为自己是“学生”(艺术) ;-)
  • @Fred-ii- 我将永远是一个学生,是的,但是当我可以撕掉最高美元的代码时,我可能会使用不同的标题,例如“不-终身”或“专家”:)
  • 只是说尽管亚当斯先生是他的艺术/手艺(摄影)的大师,但他是一个谦虚的人,仍然认为自己是一个“学生”。 ;-) 意思是,他没有在他的名声中看不起别人。真的,一个伟人;干杯。

标签: php mysql arrays mysqli insert


【解决方案1】:

四个INSERT 语句不会杀死您的服务器。您可以执行以下操作:

["members"]=> array(5) { 
      [0]=> "175" 
      [1]=> "113" 
      [2]=> "122" 
      [3]=> "80" 
      [4]=> "161"
}

$db = new PDO('mysql:host=localhost;dbname=yourdbname', $user, $password);
$statement = $db->prepare("
        INSERT INTO GroupMembership(GroupID, UserId) VALUES (
            :__group_id,
            :__user_id
        )
    ");

$statement->bindParam(':__group_id', $DEFAULT_GROUP_ID, PDO::PARAM_INT);
$statement->bindParam(':__user_id', $user_id, PDO::PARAM_INT);
for($i = 0; $i < count($members); $i++) {
    $user_id = $members[$i];
    $DEFAULT_GROUP_ID = <your_group_id>
    $statement->execute();
}

mysqli版本

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
$stmt = $mysqli->prepare("
       INSERT INTO GroupMembership(GroupID, UserId) VALUES (
           ?,
           ?
       )
 ")
for($i = 0; $i < count($members); $i++) {
    $user_id = $members[$i];
    $stmt->bind_param('ii', $DEFAULT_GROUP_ID, $user_id);
    $stmt->execute();
}
$stmt->close();

【讨论】:

  • "4 插入语句不会杀死你的服务器。"我不打算在这里列出整个数组,从不同的 SaaS 实例定期向同一个数据库请求多达 500 多个插入。而且... 为什么要使用 PDO 哈哈 我还没有研究 PDO,我可以厚颜无耻地要求一个 MySQLi 版本来玩吗?感谢您提供 PDO 示例,尽管我可以看到您正在执行的操作的登录信息。
  • 在这种情况下,您需要查看 FIFO 队列。 500 个刀片对于任何东西来说都是很多的。我会做mysqli版本的
  • MySQLi 是否在一定程度上管理 FIFO?咀嚼执行的插入内容?有没有办法在不循环插入查询的情况下做到这一点,或者实际上不存在“多重查询”功能? (我看过,但找不到太多)
  • @RPM 您只需要在循环外使用一次bindParam(除非您使用的是bindValue-&gt;prepare 也是如此。在这种情况下,我什至建议批量插入,例如INSERT INTO GroupMembership(GroupID, UserID) VALUES (0, 175),(0, 113),(0, ...),...
  • @Arbiter 来自 Mysqli 和 PDO 的两个函数的行为相同,它们通过引用绑定变量。你可以,并且鼓励在循环之外绑定变量以节省函数开销的时间。
猜你喜欢
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多