Maison > Article > base de données > Comment insérer plusieurs lignes dans une seule requête MySQL avec PDO ?
PDO MySQL : insérer plusieurs lignes dans une requête
Insérer plusieurs lignes dans une seule requête à l'aide de PDO peut être une tâche ardue. Cependant, en utilisant la puissance des instructions préparées, nous pouvons simplifier ce processus et éviter les erreurs courantes.
Le problème : conversion d'un tableau en chaîne
Lorsque vous rencontrez un " Erreur de conversion de tableau en chaîne lors de la tentative d'exécution d'une requête INSERT avec plusieurs lignes, il est probable que votre instruction PDO tente de lier un tableau à un espace réservé au lieu d'un individu. valeurs.
Solution : lier des valeurs individuelles
Pour résoudre ce problème, vous devez parcourir les valeurs de chaque ligne et les lier individuellement à l'instruction préparée. Ceci peut être réalisé en utilisant la méthode bindParam() de l'objet instruction PDO.
Par exemple, considérons le code suivant :
$query = "INSERT INTO $table (key1, key2, key3) VALUES (:key1, :key2, :key3)"; $stmt = $pdo->prepare($query); foreach ($data as $item) { $stmt->bindParam(':key1', $item['key1']); $stmt->bindParam(':key2', $item['key2']); $stmt->bindParam(':key3', $item['key3']); $stmt->execute(); }
Ce code lie chaque valeur du tableau $data à l'espace réservé correspondant dans l'instruction préparée et exécute la requête plusieurs fois, une pour chaque ligne du tableau.
Solution alternative : utiliser un tableau Liaisons
Alternativement, certains pilotes PDO prennent en charge les liaisons de tableau, qui vous permettent de lier un tableau complet de valeurs à un seul espace réservé. Cependant, cette fonctionnalité n'est pas universellement prise en charge et peut ne pas être disponible dans tous les cas.
Exemple de code amélioré
Voici une version améliorée de votre fonction multipleInsert() qui utilise des instructions préparées et lie les valeurs individuellement :
public function multipleInsert($table, $data = array()) { if (count($data) > 1) { $fieldnames = array_keys($data[0]); $query = "INSERT INTO $table (`" . implode('`, `', $fieldnames) . "`) VALUES "; $query .= implode(', ', array_fill(0, count($data), "(:" . implode(', :', $fieldnames) . ")")); $stmt = $this->start->prepare($query); $i = 1; foreach ($data as $item) { foreach ($item as $key => $value) { $stmt->bindParam(":$key$i", $item[$key]); $i++; } } $stmt->execute(); $return['status'] = true; $return['lastid'] = $this->start->lastInsertId(); return $return; } else { die('$data is less than two arrays, use single insert instead.'); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!