W3docs

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 INSERT de 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 mysqli installé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() retourne false en cas d'erreur ; inspectez toujours mysqli_error() pour qu'un échec silencieux ne ressemble pas à un succès.
  • Apostrophes non échappées. Des noms comme O'Brien brisent 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 colonne i) 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.

Pratique

Pratique
Quelles sont les étapes pour insérer des données dans MySQL avec PHP ?
Quelles sont les étapes pour insérer des données dans MySQL avec PHP ?
Was this page helpful?