【问题标题】:php pdo multi array insertphp pdo多数组插入
【发布时间】:2012-08-25 16:28:31
【问题描述】:

我已经玩了几个小时并试图解决这个问题,但看起来很难破解。

我可以进行单个数组插入

$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]:参数号无效:绑定变量的数量与标记的数量不匹配

【问题讨论】:

  • 向我们展示如何执行单个数组插入。还有你在执行多重时遇到的错误。

标签: php arrays insert pdo


【解决方案1】:

要利用 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();

【讨论】:

  • 除非您遇到性能问题 - 此解决方案过于复杂。准备好的语句旨在多次使用不同的参数执行相同的查询。很少有理由不遵循这个直截了当的想法。
  • @acrosman - 我试过这个,但没有成功...没有错误没有插入...
  • @Dan 你在 try 语句的 catch 子句中添加了什么吗?否则它可能会在出错后静默停止。
  • @acrosman - 很棒的 m8 .. 它的工作......但是它没有给我最后插入的 id ......我正在使用这个 $this->__dbh->lastInsertId();对此有什么想法吗?
  • @Dan @acrosman,我认为这里可能存在的问题是,您使用array_merge 将值数组展平,而不是拥有 22 条“姓名”和“年龄”记录' (一个多维数组),你会在一个平面数组中有 44 条记录吗? [0] => "John", [1] => 24, [2] => "Sally", [3]=> 39, ... , [42] => "Mohammed", [43] => "42"
【解决方案2】:

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

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

【讨论】:

  • 嘿,谢谢你的帖子.. 我试过了,但它抛出了一个错误:SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
  • @Dan:如果它适用于单行数组 - 它也适用于二维数组。无论如何 - 如果没有一些特定的代码,就不可能给你任何进一步的帮助。简短的回答:它应该工作,如果没有 - 你犯了一些错误
  • 您不必遍历每条记录。您可以使用多重插入功能,但您需要稍微转换数组(更完整的答案即将到来,但同时请参阅:stackoverflow.com/questions/1176352/…)。
  • 嗯,这就是我添加的内容。 foreach ($data as $row) { print_r($row); $sth->执行($row); }; Array ( [name] => Dan [age] => 30 ) SQLSTATE[HY093]: Invalid parameter number: 绑定变量数与标记数不匹配
  • @acrosman:如果您没有每秒数百次插入 - 使用该解决方案只是过于复杂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多