多维数组中的PHP PDO批插入无法插入MySQL
我有一个这样的数组,其中包含很多行,我需要使用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"]=&
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();