PHP PDO多数组插入(php pdo multi array insert)

2019-06-27 15:19发布

我一直在玩弄了几个小时,试图理清了这一点,但看起来像一个难啃的骨头。

我可以做一个单一的阵列插入

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

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


Answer 2:

你不能这样做自动。 相反,你必须手动循环并执行每一条记录:

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


文章来源: php pdo multi array insert