2012-04-08 14 views
13

Witam Robię klasę do robienia wielu wstawek w pdo.PDO MySQL: Wstaw kilka wierszy w jednym zapytaniu

Jest coś takiego

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

Po przeszukaniu okazało się, że muszę zbudować coś podobnego

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

następnie wykonać z tego $this->execute($data); gdzie $data jest

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

etc 

problemem jest nadal otrzymuję błąd Array to string conversion na $insert->execute($data); jak mogę to naprawić?

Oto fragment tego, co robię.

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

Odpowiedz

27

Łatwym sposobem na uniknięcie komplikacji to byłoby coś takiego

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

Jednak ta wykonuje instrukcję wielokrotnie. Dlatego lepiej jest, jeśli utworzymy długie pojedyncze zapytanie, aby to zrobić.

Oto przykład tego, jak możemy to zrobić.

$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

więc co robi 4 razy? Zamierzamwdrożyć sposób wstawiania wielu danych w jednym zapytaniu, patrząc na swój kod, wykonywany wiele razy w zależności od ilości danych. –

+2

@AdamRamadhan, Jak już mówiłem, jest to sposób na uniknięcie komplikacji. Zaktualizuję połączoną wersję nieco później. – Starx

+0

@AdamRamadhan, Sprawdź aktualizację – Starx

Powiązane problemy