2012-04-08 28 views
13

Hola estoy haciendo una clase para hacer varias inserciones en pdo.PDO MySQL: inserte varias filas en una consulta

Es algo como esto

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

Después de buscar descubrí que tengo que construir algo así como

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

luego ejecutar con este $this->execute($data); donde $data es

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

etc 

el problema es que todavía recibo un error Array to string conversion en $insert->execute($data); ¿cómo puedo solucionarlo?

aquí hay un fragmento de lo que estoy haciendo.

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

Respuesta

27

Una manera fácil para este evitando las complicaciones sería algo como esto

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

Sin embargo, esto ejecuta la sentencia varias veces. Entonces, es mejor si creamos una consulta larga larga para hacer esto.

Aquí hay un ejemplo de cómo podemos hacer esto.

$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

¿qué es lo que ejecuta 4 veces? Estoy buscando una manera de insertar datos múltiples en una sola consulta, al mirar su código se ejecuta varias veces dependiendo de la cantidad de datos. –

+2

@ AdamRamadhan, como te dije, es una forma de evitar complicaciones. Voy a actualizar con el combinado un poco más tarde. – Starx

+0

@AdamRamadhan, Compruebe la actualización – Starx

Cuestiones relacionadas