Comment insérer des données dans une base de données MySQL avec PHP
Apprenez à insérer des données dans une base de données MySQL avec PHP en utilisant mysqli et les requêtes préparées pour une sécurité optimale.
Insérer des données, c'est la façon dont une application PHP écrit dans une base de données MySQL — enregistrer un nouvel utilisateur, journaliser une commande, stocker un commentaire. Chaque écriture est une instruction SQL INSERT INTO que PHP envoie via une connexion de base de données ouverte. Cet article présente le flux complet avec l'extension mysqli, puis montre la méthode plus sûre et moderne utilisant les requêtes préparées que vous devriez adopter dans vos projets réels.
Ce que vous allez apprendre
- Comment ouvrir une connexion et exécuter un
INSERTde base - Pourquoi concaténer des valeurs dans du SQL est dangereux, et comment les requêtes préparées y remédient
- Comment récupérer l'identifiant auto-généré de la ligne que vous venez d'insérer
- Comment insérer plusieurs lignes efficacement
Prérequis
Avant de commencer, vous devez disposer de :
- Un serveur web avec PHP (7.4+) et l'extension
mysqliinstallée - Une base de données MySQL (ou MariaDB) en cours d'exécution
- Un outil de gestion de base de données tel que phpMyAdmin, ou un accès en ligne de commande
Ces exemples supposent l'existence d'une table users. Vous pouvez en créer une avec :
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);Si vous débutez avec la création de tables, consultez Créer une table MySQL.
Étape 1 : Établir une connexion
La première étape consiste à se connecter à la base de données avec mysqli_connect(), qui accepte quatre arguments : l'hôte du serveur, le nom d'utilisateur, le mot de passe et le nom de la base de données. Elle retourne un objet de connexion que vous réutilisez pour chaque requête.
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
// Always check the connection before continuing.
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>mysqli_connect_error() retourne un message d'erreur lisible lorsque la connexion échoue — mauvais mot de passe, hôte inaccessible ou base de données manquante — pour ne pas vous laisser dans l'incertitude.
Étape 2 : Exécuter un INSERT de base
Une fois la connexion prête, vous pouvez exécuter une requête INSERT avec mysqli_query(). Elle prend la connexion et la chaîne SQL, et retourne true en cas de succès ou false en cas d'échec.
<?php
$sql = "INSERT INTO users (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Cela fonctionne pour des valeurs codées en dur, mais dès qu'une partie de la requête provient d'une saisie utilisateur, cela devient dangereux. Une valeur comme O'Reilly (avec une apostrophe) brise le SQL, et une valeur malveillante peut réécrire entièrement votre requête — c'est l'injection SQL. Ne construisez jamais des requêtes en collant des données utilisateur dans une chaîne de caractères.
Étape 3 : Insérer en toute sécurité avec les requêtes préparées
Une requête préparée envoie le squelette SQL et les données séparément. Des marqueurs de positionnement (?) indiquent où les valeurs doivent aller, et mysqli_stmt_bind_param() lie chaque valeur avec son type (s pour string, i pour integer, d pour double, b pour blob). MySQL traite les valeurs liées strictement comme des données, ce qui rend l'injection impossible et gère les guillemets automatiquement.
<?php
// 1. Prepare the statement with placeholders.
$stmt = mysqli_prepare(
$conn,
"INSERT INTO users (first_name, last_name, email) VALUES (?, ?, ?)"
);
// 2. Bind the input values: three strings -> "sss".
$first_name = "Jane";
$last_name = "Smith";
$email = "[email protected]";
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
// 3. Execute, then clean up.
if (mysqli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
?>C'est l'approche à adopter dans toute application réelle. Pour un examen approfondi, consultez Requêtes préparées MySQL en PHP.
Obtenir l'ID inséré
Lorsqu'une table possède une clé primaire AUTO_INCREMENT, MySQL attribue automatiquement l'id de la nouvelle ligne. Récupérez-le avec mysqli_insert_id() — utile lorsque vous avez besoin de l'ID pour une requête suivante ou pour le retourner à l'utilisateur.
<?php
mysqli_query($conn, "INSERT INTO users (first_name, last_name, email)
VALUES ('Amy', 'Lee', '[email protected]')");
$new_id = mysqli_insert_id($conn);
echo "Inserted row has ID: " . $new_id;
?>Consultez Obtenir le dernier ID inséré pour une vue d'ensemble complète, y compris son comportement avec les requêtes préparées.
Insérer plusieurs lignes
Pour ajouter plusieurs lignes à la fois, listez plusieurs ensembles de valeurs dans une seule instruction. Un seul aller-retour vers la base de données est bien plus rapide qu'exécuter INSERT dans une boucle.
<?php
$sql = "INSERT INTO users (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Amy', 'Lee', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo mysqli_affected_rows($conn) . " records inserted";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Pour insérer des données fournies par l'utilisateur en masse, liez les valeurs dans une boucle sur une requête préparée — consultez Insérer plusieurs lignes.
Étape 4 : Fermer la connexion
Lorsque vous avez terminé, fermez la connexion avec mysqli_close() pour libérer les ressources. PHP ferme automatiquement les connexions à la fin d'une requête, mais une fermeture explicite est une bonne pratique dans les scripts de longue durée.
<?php
mysqli_close($conn);
?>Erreurs courantes
- Oublier de vérifier le résultat.
mysqli_query()retournefalseen cas d'erreur ; inspectez toujoursmysqli_error()pour qu'un échec silencieux ne ressemble pas à un succès. - Apostrophes non échappées. Des noms comme
O'Brienbrisent une requête construite par concaténation. Les requêtes préparées éliminent entièrement ce problème. - Nombre de colonnes incorrect. Le nombre de colonnes doit correspondre au nombre de valeurs, sinon MySQL rejette l'instruction.
- Type de liaison incorrect. Lier un integer en tant que
"s"fonctionne généralement, mais des incohérences (par exemple, lier une string à une colonnei) peuvent corrompre silencieusement des données.
Conclusion
Vous savez maintenant comment insérer des données dans MySQL depuis PHP : ouvrir une connexion, exécuter un INSERT et fermer la connexion. Pour tout ce qui va au-delà des valeurs de test codées en dur, utilisez des requêtes préparées pour vous protéger contre l'injection SQL. Ensuite, apprenez à lire vos données avec Sélectionner des données.