我有一个像这样的数组,其中包含很多行,我需要使用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();
但我收到此错误信息
消息为“ SQLSTATE [HY093]”的未捕获异常“ PDOException”:无效的参数编号:绑定变量的数量与令牌的数量不匹配
而且我也尝试过
$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”的每个长度都相同,这没有任何意义
消息“ SQLSTATE [22001]”的未捕获异常“ PDOException”:字符串数据,右截断:1406行1625的列“ order_number”的数据太长
我怎样才能将数组插入数据库?如果我必须执行很多次或者只要能插入一次,我就不会太挑剔。
编辑
我想做的是在一个文本文件中读取并将其插入一个工作正常的数组中,所以我只剩下一个具有约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()
。
$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);
}
}
// NOW DO EXECUTE
$stmt->execute();
$db->commit();
根据您的评论,很难准确说明您要完成的工作,但是如果您只收到一条记录,那么正是由于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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句