Maison > base de données > tutoriel mysql > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-09 00:47:02
original
835 Les gens l'ont consulté

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();
}
Copier après la connexion

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.');
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal