2012-04-08 6 views
13

Bonjour Je fais une classe pour faire plusieurs insertions dans pdo.PDO MySQL: Insérer plusieurs lignes dans une requête

Il est quelque chose comme ça

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

Après la recherche, je trouve que je dois construire quelque chose comme

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

execute puis avec ce $this->execute($data);$data est

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

etc 

le problème est que je reçois toujours une erreur Array to string conversion sur $insert->execute($data); comment puis-je résoudre ce problème?

Voici un extrait de ce que je fais.

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.'); 
    } 
} 

Répondre

27

Un moyen facile pour ce qui évite les complications serait quelque chose comme ça

$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(); 
} 

Cependant, cette exécute plusieurs fois la déclaration. Il est donc préférable de créer une longue requête unique pour cela.

Voici un exemple de comment nous pouvons le faire.

$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

alors qu'est-ce qu'il exécute 4 fois? Je cherche un moyen d'insérer plusieurs données dans une seule requête, en regardant votre code, il exécute plusieurs fois en fonction de la quantité de données. –

+2

@AdamRamadhan, Comme je vous l'ai dit, c'est une façon de faire en évitant les complications. Je vais mettre à jour avec le combiné un peu plus tard. – Starx

+0

@AdamRamadhan, Vérifiez la mise à jour – Starx

Questions connexes