【问题标题】:Multiple mysql INSERT statements in one query php [duplicate]一个查询php中的多个mysql INSERT语句[重复]
【发布时间】:2010-11-21 09:54:20
【问题描述】:

这合法吗?

$string1= "INSERT INTO....;";
$string1 .= "INSERT INTO....;";
$string1 .= "INSERT INTO....;";
mysql_query($string1) or die(mysql_error()); 

【问题讨论】:

  • 我解决了我的问题,使用这个mysqli方法在我的php项目上运行多个查询mysqli.multi-query.

标签: php mysql


【解决方案1】:

没有。它们是单独的查询,必须这样调用。

【讨论】:

    【解决方案2】:

    不,mysql_query() 一次只允许一个查询。

    你可以像这样插入多行:

    INSERT INTO table (col1, col2)
    VALUES (1, 2), (3, 4), (5, 6)
    

    【讨论】:

    • 这个更好 - 指定要转储数据的字段名称很重要!
    【解决方案3】:

    对于它的价值,取决于您是否将相同的数据插入 同一张桌子,it's much better to insert multiple values with the one insert 例如

    INSERT INTO a VALUES (1,23),(2,34),(4,33);
    INSERT INTO a VALUES (8,26),(6,29);
    

    【讨论】:

    • 特别感谢您参考“插入速度”页面。
    【解决方案4】:

    一般来说,这是有效的 SQL,因为每条语句都以分号结尾,但 PHP 不允许您一次发送多个查询,以防止可能利用编写不佳的脚本的 SQL 注入攻击。

    您仍然可以使用如下语法:

    INSERT INTO foo VALUES ('a1', 'b1'), ('a2', 'b2');
    

    【讨论】:

      【解决方案5】:

      来自 MySQL 开发支持MySQL dev forum

      INSERT INTO table (artist, album, track, length) 
      VALUES 
      ("$artist", "$album", "$track1", "$length1"), 
      ("$artist", "$album", "$track2", "$length2"),
      ("$artist", "$album", "$track3", "$length3"), 
      ("$artist", "$album", "$track4", "$length4"),
      ("$artist", "$album", "$track5", "$length5");
      

      所以插入照常进行:

      • 首先命名我们要插入新行的表名,
      • 然后在圆括号中命名列名(注意:如果要插入 ALL 列,则不需要),
      • 后跟 VALUES 键名,然后在圆括号中是您要为上表中的新 ROW 插入的值,
      • 接着是 COMMA,然后是另一对圆括号,上面提到的表格中的新行具有新值
      • 只要您有要插入的数据,此操作就会重复 N 次。

      使用 ONE insert 语句插入多个值很开心。 :)

      【讨论】:

        【解决方案6】:

        在函数和循环中复制/粘贴示例(假设 $ids 是一个数组)

        public function duplicateItem($ids)
        {
            if (isset($ids[0])){ //at least one item
        
                $sqlQuery = "INSERT INTO items (item_id, content) VALUES ";
        
                for($i=0; $i<count($ids); $i++) {
        
                        if ($i == count($ids)-1){
                            $sqlQuery .= "(".$ids[$i][0].", '".$ids[$i][1]."');";
                        }else{
                            $sqlQuery .= "(".$ids[$i][0].", '".$ids[$i][1]."'),";
                        }
        
                }
        
                 mysql_query($sqlQuery) or die('Error, insert query failed: '.mysql_error());   
        
            }   
        }
        

        【讨论】:

        • 最好避免串联。使用implode()。有关详细信息,请参阅此answer
        • 为什么在这种情况下使用 implode() 是有益的?在上面的问题中,我们有正常的 SQL 语句。在您指向的答案中,他们谈论大量文本(例如 1000 次插入大文本),是的,在这种情况下最好避免连接。
        • 我知道。可以在这里使用连接。昨天我注意到了这两个答案,并认为最好使用implode() 作为经验法则。
        【解决方案7】:
         INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4);
        

        【讨论】:

          【解决方案8】:
          // if $data is an array       
          $sqlQuery ="INSERT INTO tableName(col1, col2) VALUES ";
          for($i=0; $i<count($data); $i++) {
               $sqlQuery .="(".$data[$i][0].", '".$data[$i][1]."'),";
          }
          $sqlQuery = rtrim($sqlQuery, ','); // Remove last comma
          mysql_query($sqlQuery) or die('Error, insert query failed: '.mysql_error());
          

          【讨论】:

            猜你喜欢
            • 2018-12-13
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            • 2013-04-29
            • 2016-07-22
            • 2010-09-25
            • 1970-01-01
            相关资源
            最近更新 更多