多维数组中的PHP PDO批插入无法插入MySQL

多维数组中的PHP PDO批插入无法插入MySQL,php,mysql,sql,pdo,bulkinsert,Php,Mysql,Sql,Pdo,Bulkinsert,我有一个这样的数组,其中包含很多行,我需要使用PDO将其插入MySQL数据库 array(3067) { [0]=> array(2) { ["order"]=> string(7) "2854811" ["consignment"]=> string(0) "" } [1]=> array(2) { ["blah"]=> string(7) "2854811" ["whatever"]=&

我有一个这样的数组,其中包含很多行,我需要使用PDO将其插入MySQL数据库

array(3067) {
  [0]=>
  array(2) {
    ["order"]=>
    string(7) "2854811"
    ["consignment"]=>
    string(0) ""
  }
  [1]=>
  array(2) {
    ["blah"]=>
    string(7) "2854811"
    ["whatever"]=>
    string(2) "someval"
  }
  [4]=>
  array(2) {
    ["blah"]=>
    string(7) "2864412"
    ["whatever"]=>
    string(0) ""
  }
我在这里尝试了各种建议组合,但每个建议都会收到不同的错误消息

我试过这个

$db->beginTransaction();

$stmt = $db->prepare("INSERT INTO mytable (column1, column2) VALUES (:blah, :whatever)");

foreach($test as $insertRow){

    // now loop through each inner array to match binded values
    foreach($insertRow as $column => $value){
        $stmt->bindParam(":{$column}", $value);
        $stmt->execute();
    }
}

$db->commit();
但是我收到了这个错误信息

未捕获异常“PDOException”,消息为“SQLSTATE[HY093]: 无效参数编号:绑定变量的数量不匹配 代币数量

我也试过了

$sql = 'INSERT INTO mytable (blah, whatever) VALUES ';
$insertQuery = array();
$insertData = array();
$n = 0;
foreach ($input as $row) {
    $insertQuery[] = '(:blah' . $n . ', :whatever' . $n . ')';
    $insertData['blah' . $n] = $row['blah'];
    $insertData['whatever' . $n] = $row['whatever'];
    $n++;
}

if (!empty($insertQuery)) {
    $sql .= implode(', ', $insertQuery);
    $stmt = $db->prepare($sql);
    $stmt->execute($insertData);
}
但是我得到了这个错误消息,它毫无意义,因为每个“blah”的长度都是相同的

未捕获异常“PDOException”,消息为“SQLSTATE[22001]: 字符串数据,右截断:1406数据对列太长 第1625行的“订单号”

如何将数组插入数据库?如果我必须执行很多次,或者只执行一次,只要我能让它插入,我就不挑剔

编辑

我要做的是读取一个文本文件并将其插入一个数组中,这个数组工作得很好,所以我只剩下一个关联数组,大约有3000行,每个数组都包含一个名为“blah”和“whatever”的字段

在获得数组后,我需要将其插入MySQL数据库

CREATE TABLE IF NOT EXISTS `tracker` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `blah` varchar(8) NOT NULL,
  `whatever` varchar(25) NOT NULL,
  `input_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
最后,我将从数组中插入大约3000行


我希望这是有道理的。如果没有,我会再加上一些

我相信你在这个例子中几乎做到了:

$db->beginTransaction();

$stmt = $db->prepare("INSERT INTO mytable (column1, column2) VALUES (:blah, :whatever)");

foreach($test as $insertRow){

   // now loop through each inner array to match binded values
   foreach($insertRow as $column => $value){
      $stmt->bindParam(":{$column}", $value);
      $stmt->execute();
   }
}

$db->commit();
您遇到的问题是在绑定正确数量的参数之前调用了
execute()
。相反,您需要首先绑定所有参数,然后调用
execute()

编辑 对于你的评论,很难确切地说出你想要完成什么,但是如果你只收到一条记录,那么这是因为Gerald提出的,这些是单独的查询,需要同时处理。看看这个修订版:

// Start Transaction
$db->beginTransaction();

// Insert each record
foreach($test as $insertRow){

   // Prepare statement
   $stmt = $db->prepare("INSERT INTO mytable (column1, column2) VALUES (:blah, :whatever)");

   // now loop through each inner array to match binded values
   foreach($insertRow as $column => $value){
      $stmt->bindValue(":{$column}", $value);
   }

   // Execute statement to add to transaction
   $stmt->execute();

   // Clear statement for next record (not necessary, but good practice)
   $stmt = null;
}

// Commit all inserts
$db->commit();

我认为
execute()
属于外部foreach循环的内部。在这种情况下,外部foreach也需要包装在
prepare()
语句的外部。很难判断参数何时为“:blah”和“:whatever”,因此我无法将其与数组数据进行匹配。谢谢您的建议。我没有收到任何错误,但我只插入了1条记录,而不是我预期的3000条记录,只是注意到除了我在database@cillosis感谢您的帮助,但现在我收到了关于字符串数据的帖子中的错误消息,右截断:。我将编辑我的帖子,试图解释我想做什么。您需要显示您的实际代码,以便我们进一步提供帮助,因为
值(:blah,:whatever)
几乎毫无用处。
// Start Transaction
$db->beginTransaction();

// Insert each record
foreach($test as $insertRow){

   // Prepare statement
   $stmt = $db->prepare("INSERT INTO mytable (column1, column2) VALUES (:blah, :whatever)");

   // now loop through each inner array to match binded values
   foreach($insertRow as $column => $value){
      $stmt->bindValue(":{$column}", $value);
   }

   // Execute statement to add to transaction
   $stmt->execute();

   // Clear statement for next record (not necessary, but good practice)
   $stmt = null;
}

// Commit all inserts
$db->commit();