-6ren">
gpt4 book ai didi

来自多维数组的 PHP PDO 批量插入无法插入 MySQL

转载 作者:行者123 更新时间:2023-11-29 01:41:45 29 4
gpt4 key购买 nike

我有一个这样的数组,其中包含很多行,我需要使用 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) ""
}

我已经尝试了在这里提出的各种建议组合,但每个建议都会收到不同的错误消息

php PDO insert batch multiple rows with placeholders

PDO MySQL: Insert multiple rows in one query

我试过了

$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();

但是我收到这个错误信息

Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

我也试过了

$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”的每个长度都相同

Uncaught exception 'PDOException' with message 'SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'order_number' at row 1625'

如何让我的数组插入到数据库中?如果我必须执行很多次或只执行一次,我不会挑剔,只要我能插入它即可。

编辑

我想做的是读取一个文本文件并将其插入到一个完美工作的数组中,所以我只剩下一个包含大约 3000 行的关联数组,它们每个都包含一个名为“blah”的字段和“随便”。

获取数组后,我需要将它插入到 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();

您遇到的问题是您在绑定(bind)适当数量的参数之前调用 execute()。相反,您需要先绑定(bind)所有参数,然后调用 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();

关于来自多维数组的 PHP PDO 批量插入无法插入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com