使用PHP将未知行数插入MySQL

时间:2010-12-19 21:37:52

标签: php arrays mysql multidimensional-array

我试图使用PHP将未知数量的行插入MySQL。这是它应该如何工作:

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

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

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

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

4 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

为什么不用这样的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;

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

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

答案 2 :(得分:1)

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

编辑 - 哇我把explode放在implode几次的位置。固定的。

假设它是,并且每个'sub'数组是形式

的关联数组
[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);

答案 3 :(得分:0)

使用foreach循环遍历数组。

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

或许准备好的陈述可以帮助您完成工作。基本上,您将声明一个通用的insert语句,然后将值“绑定”到每个输入。阅读更多on PHP PDO Prepared Statements