W3docs

Guide complet pour mettre à jour des données dans une base MySQL avec PHP

Mettre à jour des données dans une base de données est une opération essentielle. Cet article fournit un guide pas à pas avec des exemples PHP.

La mise à jour de données est l'une des quatre opérations fondamentales de base de données (avec l'insertion, la sélection et la suppression de lignes). Toute application permettant aux utilisateurs de modifier un profil, de marquer une tâche comme terminée ou de changer un prix repose sur cette opération. Ce chapitre montre comment exécuter une requête UPDATE depuis PHP en toute sécurité — avec des instructions préparées — et comment vérifier exactement combien de lignes ont été modifiées.

Ce chapitre suppose que vous disposez déjà d'une connexion à la base de données fonctionnelle. Les exemples utilisent mysqli ; une version PDO équivalente est incluse à la fin.

Comprendre la syntaxe PHP MySQL UPDATE

L'instruction UPDATE modifie les valeurs des lignes existantes. Sa forme est identique que vous l'exécutiez depuis la console MySQL ou depuis PHP :

UPDATE table_name
SET column1 = value1, column2 = value2
WHERE some_column = some_value;
  • table_name — la table dont vous souhaitez modifier les lignes.
  • SET — les colonnes à modifier et leurs nouvelles valeurs. Les colonnes non listées restent inchangées.
  • WHERE — les lignes à modifier. Cette clause est essentielle. Si vous l'omettez, toutes les lignes de la table seront mises à jour.

L'erreur UPDATE la plus fréquente — et la plus dommageable — est d'oublier la clause WHERE. UPDATE users SET active = 0 désactive tous les utilisateurs de la table, pas seulement un seul. Vérifiez toujours la condition WHERE avant d'exécuter une mise à jour sur des données réelles.

Mettre à jour des données avec une instruction préparée

Ne construisez jamais une requête UPDATE en concaténant directement des données saisies par l'utilisateur dans la chaîne SQL — cela expose votre application aux injections SQL. Utilisez plutôt une instruction préparée : écrivez la requête avec des espaces réservés ?, puis liez les valeurs séparément afin que la base de données les traite strictement comme des données.

<?php
// Reuse your connection — in practice: require 'db_connect.php';
$conn = mysqli_connect("localhost", "username", "password", "database_name");

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql  = "UPDATE users SET email = ?, age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$email = "[email protected]";
$age   = 31;
$id    = 1;

// Type string: s = string, i = integer, d = double, b = blob.
// One letter per placeholder, in order.
mysqli_stmt_bind_param($stmt, "sii", $email, $age, $id);

if (mysqli_stmt_execute($stmt)) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . mysqli_stmt_error($stmt);
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Fonctionnement étape par étape :

  1. mysqli_prepare() envoie le modèle de requête (avec les espaces réservés ?) à MySQL.
  2. mysqli_stmt_bind_param() lie vos variables PHP à ces espaces réservés. Le premier argument, "sii", déclare le type de chaque valeur dans l'ordre : une chaîne, puis deux entiers. Le nombre et l'ordre des lettres doivent correspondre exactement aux espaces réservés.
  3. mysqli_stmt_execute() exécute la requête, retournant true en cas de succès et false en cas d'échec.

Vérifier combien de lignes ont été modifiées

Le retour de true par mysqli_stmt_execute() signifie uniquement que la requête s'est exécutée sans erreur — cela ne signifie pas qu'une ligne a réellement été modifiée. Si la condition WHERE ne correspond à aucune ligne (ou si les nouvelles valeurs sont identiques aux anciennes), zéro ligne est affectée. Utilisez mysqli_stmt_affected_rows() pour le savoir :

<?php
$conn = mysqli_connect("localhost", "username", "password", "database_name");

$sql  = "UPDATE users SET age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$age = 40;
$id  = 1;
mysqli_stmt_bind_param($stmt, "ii", $age, $id);
mysqli_stmt_execute($stmt);

$rows = mysqli_stmt_affected_rows($stmt);
if ($rows > 0) {
    echo "Updated {$rows} row(s).";
} else {
    echo "No row matched, or the value was already up to date.";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Cette distinction est importante dans les applications réelles : un bouton « Enregistrer » qui signale un succès même lorsqu'aucune ligne n'a été trouvée peut masquer des bugs à vos utilisateurs.

Mettre à jour des données avec PDO

PDO est l'alternative plus portable à mysqli — le même code fonctionne avec MySQL, PostgreSQL, SQLite et d'autres, et les espaces réservés nommés rendent les requêtes longues plus faciles à lire :

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=database_name;charset=utf8mb4",
    "username",
    "password",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

$stmt = $pdo->prepare(
    "UPDATE users SET email = :email, age = :age WHERE id = :id"
);

$stmt->execute([
    ':email' => '[email protected]',
    ':age'   => 31,
    ':id'    => 1,
]);

echo "Updated " . $stmt->rowCount() . " row(s).";
?>

Avec PDO::ERRMODE_EXCEPTION défini, une requête en échec lève une exception que vous pouvez intercepter, plutôt que d'échouer silencieusement. rowCount() est l'équivalent PDO de mysqli_stmt_affected_rows().

Bonnes pratiques

  • Incluez toujours une clause WHERE sauf si vous souhaitez réellement mettre à jour toutes les lignes.
  • Utilisez des instructions préparées pour toute valeur provenant d'une saisie utilisateur — jamais de concaténation de chaînes.
  • Faites correspondre la chaîne de type de liaison ("sii", etc.) aux types réels de vos variables pour éviter les conversions silencieuses.
  • Enveloppez les mises à jour multi-tables dans une transaction afin qu'elles réussissent toutes ou soient toutes annulées.
  • Sauvegardez les données importantes avant d'exécuter des mises à jour importantes ou ponctuelles sur la production.

Exercice

Pratique
Qu'est-il important de noter lors de la mise à jour de données avec PHP dans MySQL ?
Qu'est-il important de noter lors de la mise à jour de données avec PHP dans MySQL ?
Was this page helpful?