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]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません

4

2 に答える 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();
于 2012-08-30T21:34:56.237 に答える
2

それを自動的に行うことはできません。代わりに、手動で繰り返し、各レコードを実行する必要があります。

for ($person as $row) {
    $sth->execute($row);
}
于 2012-08-30T21:00:35.280 に答える