PHP PDO多维数组插入

4

我已经折腾了几个小时,试图解决这个问题,但似乎很难。

我能够进行单个数组插入操作。

$person = array('name' => 'Wendy', 'age' => '32');

但如果我想要多个像这样的呢:
$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));

无法工作?希望有所帮助。

对于多次插入:

public function insertPdo($table, $data){
    try{
        if (!is_array($data) || !count($data)) return false;

        $bind = ':' . implode(', :', array_keys($data));      
        $sql = 'INSERT INTO ' . $table . ' (' . implode(', ',array_keys($data)) . ') ' . 'values (' . $bind . ')';

        $sth = $this->__dbh->prepare($sql);
        $result = $sth->execute($data);

    }
    catch(PDOException $e){
        echo $e->getMessage();
    }
}

单次插入操作

$person = array('name'=>'Dan', 'age'=>'30');
$db->insertPdo('test_pdo',$person);

// For Multi Insertion, I'm trying to use this in above function
foreach ($data as $row) {
    $result = $sth->execute($row);
};

$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' => 'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));
$db->insertPdo('test_pdo',$person);

出现错误:

错误:SQLSTATE[HY093]:无效的参数数量:绑定变量的数量与标记的数量不匹配


展示一下您如何执行单个数组插入。同时也展示一下在执行多个插入时出现的错误。 - j0k
2个回答

3
为了利用MySQL中多个插入的插入速度 ( http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html ),您可以使用一个构建更大查询的预处理语句。这会比较迭代式方法增加复杂性,因此可能只适用于高需求系统或大型数据集。
如果您已经按照上述方式准备好了数据:
$person = array(array('name'=>'Dan', 'age'=>'30'), array('name' =>
'John', 'age' => '25'), array('name' => 'Wendy', 'age' => '32'));

我们希望生成一个类似于以下内容的查询:
insert into table (name, age) values (?,?), (?,?), (?,?);

为了整合这个,你需要类似于这样的东西:
$pdo->beginTransaction() // also helps speed up your inserts
$insert_values = array();
foreach($person as $p){
   $question_marks[] = '(?,?)';
   $insert_values = array_merge($insert_values, array_values($p));
}

$sql = "INSERT INTO table_name (name, age) VALUES " . implode(',', $question_marks);

$stmt = $pdo->prepare ($sql);
try {
    $stmt->execute($insert_values);
} catch (PDOException $e){
    // Do something smart about it...
}
$pdo->commit();

1
除非您遇到性能问题-否则此解决方案是一种可怕的过度复杂化。准备好的语句旨在多次使用不同参数执行相同的查询。很少有理由不遵循这个直接的想法。 - zerkms
@acrosman - 我尝试过了,但它没有起作用...没有错误,也没有插入... - Dan
1
@Dan 你在try语句的catch子句中加入了什么吗?否则它可能会在出现错误后悄无声息地停止。 - acrosman
@acrosman - 太棒了,伙计..它正在工作...但是它没有给我最后插入的ID...我正在使用这个 $this->__dbh->lastInsertId(); 你对此有什么想法吗? - Dan
@Dan @acrosman,我认为这里的问题可能是您正在使用array_merge将值数组展平,因此您将不再拥有22个“名称”和“年龄”的记录(一个多维数组),而是只有44个记录的平坦数组? [0] =>“约翰”,[1] => 24,[2] =>“莎莉”,[3] => 39,...,[42] =>“穆罕默德”,[43] =>“42” - bafromca

2

无法自动完成此操作。相反,您必须手动迭代并执行每个记录:

for ($person as $row) {
    $sth->execute($row);
}

嘿,感谢您的帖子。我尝试了一下,但是出现了错误:SQLSTATE[HY093]:无效的参数数量:绑定变量的数量与标记的数量不匹配。 - Dan
@Dan:如果它可以使用单行数组工作,那么它也可以使用二维数组。无论如何,如果没有一些特定的代码,我们就无法给你提供更多的帮助。简短的回答是:它应该可以工作,如果不能工作,那么你肯定犯了一些错误。 - zerkms
1
你不必遍历每条记录。你可以使用多重插入功能,但需要对数组进行一些转换(更完整的答案即将到来,但在此期间请参见:https://dev59.com/oXM_5IYBdhLWcg3w43pt)。 - acrosman
这就是我添加的内容。 foreach ($data as $row) { print_r($row); $sth->execute($row); };数组([name] => Dan [age] => 30)SQLSTATE [HY093]:无效参数号码:绑定变量的数量与标记的数量不匹配。 - Dan
@acrosman:如果你每秒钟没有数百个插入操作,使用那种解决方案只是过于复杂化了。 - zerkms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接