Maison  >  Article  >  base de données  >  Comment insérer plusieurs lignes dans une seule requête MySQL avec PDO ?

Comment insérer plusieurs lignes dans une seule requête MySQL avec PDO ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 00:47:02834parcourir

How to Insert Multiple Rows in a Single MySQL Query with 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn