Insérer plusieurs enregistrements dans une base de données MySQL avec PHP
Découvrez comment insérer plusieurs enregistrements à la fois dans MySQL avec PHP en utilisant INSERT multiple, les requêtes préparées et mysqli_multi_query().
Insérer des enregistrements un par un implique un aller-retour vers le serveur de base de données par ligne — lent et inefficace lorsque vous devez charger des centaines ou des milliers de lignes. Les regrouper dans une seule instruction INSERT permet à MySQL d'analyser, de planifier et de valider l'ensemble du lot en une seule fois, ce qui est beaucoup plus rapide.
Ce chapitre présente trois façons d'insérer plusieurs lignes avec l'extension mysqli de PHP :
- Une seule instruction
INSERT ... VALUES (...), (...)— l'insertion en masse la plus simple et la plus rapide. - Une requête préparée bouclée sur vos données — sûre contre les injections SQL, idéale lorsque les valeurs proviennent des utilisateurs.
mysqli_multi_query()— exécution de plusieurs instructions distinctes regroupées dans une seule chaîne.
Si vous n'avez pas encore établi de connexion à une base de données, commencez par Se connecter à MySQL avec PHP. Pour insérer une seule ligne, consultez Insérer des données dans MySQL.
Établir une connexion
Chaque exemple ci-dessous suppose qu'une connexion mysqli ouverte est stockée dans $conn. Nous en créons une avec mysqli_connect() et interrompons l'exécution en cas d'échec :
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>Méthode 1 : Un seul INSERT avec plusieurs ensembles de valeurs
La façon la plus rapide d'ajouter plusieurs lignes est une seule instruction INSERT INTO qui liste plusieurs ensembles de valeurs séparés par des virgules. MySQL les insère tous en une seule opération :
<?php
$sql = "INSERT INTO users (firstname, lastname, email)
VALUES ('John', 'Doe', '[email protected]'),
('Mary', 'Moe', '[email protected]'),
('Julie', 'Dooley', '[email protected]')";
if (mysqli_query($conn, $sql)) {
// mysqli_affected_rows() reports how many rows were inserted
$count = mysqli_affected_rows($conn);
echo "$count records inserted successfully.";
} else {
echo "Error inserting records: " . mysqli_error($conn);
}
?>mysqli_query() prend deux arguments — la connexion et la chaîne SQL — et retourne true en cas de succès ou false en cas d'échec. Après une insertion réussie, mysqli_affected_rows() indique combien de lignes ont réellement été écrites (ici, 3).
Utilisez cette méthode lorsque les données sont fiables (codées en dur ou déjà assainies). Étant donné que les valeurs sont directement concaténées dans la chaîne SQL, cette approche n'est pas sûre pour les saisies brutes des utilisateurs — c'est ce que la Méthode 2 résout.
Méthode 2 : Requête préparée dans une boucle
Lorsque les valeurs proviennent d'un formulaire, d'une API ou de toute source non fiable, construisez la requête avec une requête préparée afin que les données soient envoyées séparément du SQL. Cela bloque les injections SQL et vous permet de réutiliser la même instruction compilée pour chaque ligne :
<?php
$users = [
['John', 'Doe', '[email protected]'],
['Mary', 'Moe', '[email protected]'],
['Julie', 'Dooley', '[email protected]'],
];
// Prepare once with placeholders
$stmt = mysqli_prepare($conn, "INSERT INTO users (firstname, lastname, email) VALUES (?, ?, ?)");
// Bind PHP variables to the placeholders ("sss" = three strings)
mysqli_stmt_bind_param($stmt, "sss", $firstname, $lastname, $email);
foreach ($users as [$firstname, $lastname, $email]) {
mysqli_stmt_execute($stmt); // runs with the current variable values
}
echo count($users) . " records inserted safely.";
mysqli_stmt_close($stmt);
?>La chaîne de type "sss" indique à MySQL que les trois paramètres liés sont des chaînes de caractères. Utilisez i pour les entiers, d pour les doubles/flottants, et b pour les blobs. Pour une explication complète, consultez Requêtes préparées PHP MySQL.
Pour des performances optimales avec des milliers de lignes, encapsulez la boucle dans une transaction afin que MySQL valide une seule fois au lieu de le faire après chaque exécution :
<?php
mysqli_begin_transaction($conn);
foreach ($users as [$firstname, $lastname, $email]) {
mysqli_stmt_execute($stmt);
}
mysqli_commit($conn);
?>Méthode 3 : mysqli_multi_query()
Les méthodes précédentes insèrent dans une seule table avec une seule instruction. Lorsque vous devez exécuter plusieurs instructions différentes à la fois — par exemple insérer dans deux tables — utilisez mysqli_multi_query(), qui exécute plusieurs instructions SQL séparées par des points-virgules à partir d'une seule chaîne :
<?php
$sql = "INSERT INTO users (firstname, lastname) VALUES ('John', 'Doe');";
$sql .= "INSERT INTO users (firstname, lastname) VALUES ('Mary', 'Moe');";
$sql .= "INSERT INTO logs (action) VALUES ('bulk import')";
if (mysqli_multi_query($conn, $sql)) {
echo "Multiple statements executed successfully.";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Attention :
mysqli_multi_query()accepte des instructions empilées arbitraires, ce qui la rend risquée avec toute saisie fournie par l'utilisateur — ne construisez jamais sa chaîne à partir de données non fiables. Pour les insertions en masse simples, préférez la Méthode 1 ou la Méthode 2.
Récupérer les IDs insérés
Après une insertion, mysqli_insert_id() retourne l'id AUTO_INCREMENT généré par la dernière ligne insérée. Avec une insertion multi-lignes, il vous donne l'id de la première ligne du lot ; les lignes suivantes se succèdent séquentiellement. Consultez Obtenir l'ID du dernier enregistrement inséré pour plus de détails.
Fermer la connexion
mysqli ferme la connexion automatiquement à la fin du script, mais il est recommandé de la libérer explicitement une fois que vous avez terminé :
<?php
mysqli_close($conn);
?>Quelle méthode choisir ?
| Situation | Meilleur choix |
|---|---|
| Données fiables et fixes ; vitesse maximale | Méthode 1 — un seul INSERT multi-valeurs |
| Valeurs provenant des utilisateurs / sources externes | Méthode 2 — boucle avec requête préparée |
| Plusieurs instructions différentes à la fois | Méthode 3 — mysqli_multi_query() |
Conclusion
Regrouper les insertions transforme de nombreux allers-retours lents en une seule opération rapide. Optez pour un seul INSERT multi-valeurs lorsque les données sont fiables, une requête préparée en boucle (encapsulée dans une transaction pour les grands lots) lorsqu'elles proviennent des utilisateurs, et mysqli_multi_query() uniquement lorsque vous avez réellement besoin d'exécuter plusieurs instructions distinctes ensemble. Quelle que soit la méthode, validez vos entrées et vérifiez mysqli_error() afin que les échecs ne passent jamais inaperçus.