【问题标题】:Insert unknown number of rows into MySQL using PHP使用PHP将未知数量的行插入MySQL
【发布时间】:2011-05-27 23:33:28
【问题描述】:

我正在尝试使用 PHP 将未知数量的行插入 MySQL。它应该是这样工作的:

  1. Javascript 解析 HTML DOM 以创建基于 css 类的多维数组。该数组将具有一定数量的行(或子数组),对应于具有该类的元素的数量。 (这可以是任何整数 0 或更大......显然)。

  2. 然后,在 JavaScript 事件中,数组被发送到 PHP 脚本。

  3. PHP 脚本会将数组中的数据插入 MySQL。

我的问题是我不知道如何告诉我的 PHP 脚本数组中有多少值。而且我不知道如何编写 mysql_query() 而不知道应该插入的值(或行)的数量。

【问题讨论】:

  • 不,多维数组的情况和数组中子数组的可能性是有区别的

标签: php arrays mysql multidimensional-array


【解决方案1】:

使用 foreach 循环循环遍历数组。

//  Example:
    foreach($submitted_array as $insert_array)
    {
         //php and mysql insert query here
    }

也许准备好的陈述会在你的努力中帮助你。本质上,您将声明一个通用插入语句,然后将值“绑定”到每个输入。阅读更多on PHP PDO Prepared Statements

【讨论】:

    【解决方案2】:

    为什么不准备一个二维数组,同时用这样的css类标识符进行搜索?

    //This is jquery code - you can write javascript to do the same
    $(`.class`).each(function(i,e){resultsArray.push($(this).val());}); 
    

    这将使您免于在后端遍历多维数组的麻烦,您只需在 PHP 代码中执行 count() 并准备以下查询。

    查询准备
    假设您有一个二维数组,您可以使用这样的批量插入查询:-

    INSERT INTO tablename (a,b)
    VALUES 
     ('1', 'one'),
     ('2', 'two'),
     ('3', 'three')
    

    并像这样使用 PHP 动态准备查询 -

    $counter = 0;
    $valuesPart = NULL;
    foreach($_POST as $each)
    {
      if($counter > 0)
         $appendComma = ",";
      else
         $appendComma ="";
      $valuesPart .= $appendComma."(".$each['key1'].",".$each['key2'].")";
      $counter++;
    }
    
    if(!empty($valuesPart))
        $mysql_query = "INSERT INTO tablename (a,b)  VALUES ".$valuesPart;
    

    因此,您无需知道实际要插入多少个结果。

    如果您继续使用多维数组,您可能需要编写代码或搜索代码来遍历多维数组,这可能涉及递归和大量复杂代码。出错的机会很多,而且速度会更慢(可能很少,但数量有限,这不是必需的)。

    【讨论】:

      【解决方案3】:

      您可以一次向 MySQL 插入多行:

      INSERT INTO table1 (column1, column2, ...) VALUES (value_col1, value_col2), (value2_col1, value2_col2), ...;

      在 PHP 中,您可以通过遍历行并将它们添加到 SQL 字符串来构建查询:

      $sql = "INSERT INTO table1 (col1, col2) VALUES ";
      foreach($rows as $i=>$row) {
          if ($i>0) {
              $sql .= sprintf(",(%s,%s)", $row["col1_value"], $row["col2_value"]);
          } else {
              $sql .= sprintf("(%s,%s)", $row["col1_value"], $row["col2_value"]);
          }
      }
      mysql_query($sql);
      

      您必须确保根据实际插入的内容正确转义您的值。

      【讨论】:

      • 第 4 行和第 6 行的代码 $row["col2_value"] 是什么?为什么你不直接写 $row?
      【解决方案4】:

      所以我假设数组通过 $_POST 或其他方式成功到达 PHP?如果您不确定,请执行 var_dump 或 echo_r 以便我们查看。

      编辑 - 哇,我把explode 放在我的意思是implode 的地方好几次了。固定。

      假设它是,并且每个“子”数组都是形式上的关联数组

      [0]
           'id' => 1
           'name' => 'Billy'
           'DOB'  => .....
      [1]
          etc.
      

      以及构建插入所有行的单个查询的代码,例如INSERT INTO table ('f1','f2',f3') VALUES ('v11', 'v22', 'v33'), ('v21', 'v22', 'v23'), ......

       $escapeAndQuote = function($x) {return "'".mysql_real_escape_string($x)."'";};
       $rowwise = function($x) {return '('. implode(', ', array_map($escapeAndQuote, $x)) .')'; 
      
       $fieldString = $rowwise(array_keys($arr[0]));
       $valString = implode(', ', array_map($rowwise, $arr));
      
       $sql = "INSERT INTO table $fieldString VALUES $valString";
       mysql_query($sql, $conn);
      

      【讨论】:

      • 在我和其他人的回答中,可以在 foreach 循环中检查和忽略任何不好的事情。这不应该成为在这里进行多个查询的理由
      • 猜你可能是对的,没有理由有很多小查询和低效的网络来回来回。重写
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2019-05-21
      • 1970-01-01
      • 2012-12-13
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多