2012-04-08 23 views
13

こんにちは私はpdoで複数の挿入を行うクラスを作っています。PDO MySQL:1つのクエリで複数の行を挿入する

私は$data

0 => 
    array 
     'key1' => 'value1' 
     'key2' => 'value2' 
     'key3' => 'value3' 
1 => 
    array 
     'key1' => 'value1' 
     'key2' => 'value2' 
     'key3' => 'value3' 

etc 
あるこの $this->execute($data); で実行し

INSERT INTO $table (key1,key2,key3,etc) VALUE (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc) 

のようなものを構築する必要があることが分かった検索した後それはこの

INSERT INTO $table (key1,key2,key3,etc) VALUE (value1,value2,value3,etc), (value1,value2,value3,etc), (value1,value2,value3,etc) 

のようなものです

問題はまだ私はエラーArray to string conversion$insert->execute($data);に私はそれを修正することができますか?

ここは私が作っていることのスニペットです。合併症を避けるため、この

public function multipleInsert($table, $data = array()) 
{ 

    # INSERT (name) VALUE (value),(value) 
    if (count($data) > 1) 
    { 
     $fieldnames = array_keys($data[0]); 
     $count_inserts = count(array_values($data)); 
     $count_values = count(array_values($data[0])); 

     # array(????) untill x from first data 
     for($i = 0; $i < $count_values; $i++) 
     { 
      $placeholder[] = '?'; 
     } 

     # array((????),(????),(????)) for query 
     for ($i=0; $i < $count_inserts; $i++) 
     { 
      $placeholders[] = '('. implode(',',$placeholder) . ')'; 
     } 

     $query = 'INSERT INTO '. $table; 
     $query .= '(`'. implode('`, `', $fieldnames) .'`)'; 
     $query .= ' VALUES '. implode(', ', $placeholders); 

     $insert = $this->start->prepare($query); 

     $i = 1; 
     foreach($data as $item) 
     { 
      foreach ($item as $key => $value) 
      { 
       $insert->bindParam($i++, $item[$key]); 
      } 
     } 

     echo $query; 
     $insert->execute(); 

     $return['status'] = true; 
     $return['lastid'] = $this->start->lastInsertId(); 

     return $return; 
    } 
    else 
    { 
     die('$data is less then two array, use single insert instead.'); 
    } 
} 

答えて

27

簡単な方法は、しかし、これは、ステートメントを複数回実行し、この

$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)'); 
foreach($data as $item) 
{ 
    $stmt->bindValue(':a', $item[0]); 
    $stmt->bindValue(':b', $item[1]); 
    $stmt->bindValue(':c', $item[2]); 
    $stmt->execute(); 
} 

ようなものになるだろう。したがって、これを実行するために長い単一のクエリを作成する方が良いでしょう。

ここでは、これを行う方法の例を示します。

$query = "INSERT INTO foo (key1, key2) VALUES "; //Prequery 
$qPart = array_fill(0, count($data), "(?, ?)"); 
$query .= implode(",",$qPart); 
$stmt = $dbh -> prepare($query); 
$i = 1; 
foreach($data as $item) { //bind the values one by one 
    $stmt->bindValue($i++, $item['key1']); 
    $stmt->bindValue($i++, $item['key2']); 
} 
$stmt -> execute(); //execute 
+0

それで4回何が実行されますか?複数のデータを1つのクエリに挿入する方法を探しています。コードを調べることによって、データの量に応じて複数回実行されます。 –

+2

@AdamRamadhan、私が言ったように、それは合併症を避ける方法です。私は少し後で組み合わせたもので更新します。 – Starx

+0

@AdamRamadhan、更新をチェック – Starx

関連する問題