oujood.com

Maîtriser les Transactions MySQL avec PHP et mysqli_begin_transaction()

Apprenez à implémenter des transactions dans MySQL en utilisant PHP et la fonction mysqli_begin_transaction(). Suivez nos exemples pour des opérations de base de données sécurisées.

La fonction mysqli_begin_transaction() en PHP

Version PHP: 5.5.0 et +

La fonction mysqli_begin_transaction() est utilisée en PHP avec MySQLi pour démarrer une transaction. Une transaction permet d'exécuter un groupe d'instructions SQL de manière atomique, ce qui signifie qu'elles sont soit toutes exécutées, soit aucune ne l'est, assurant ainsi la cohérence des données.

Syntaxes

Il existe deux façons d'utiliser la fonction mysqli_begin_transaction() : orientée objet et procédurale.

Syntaxe orientée objet :

$mysqli = new mysqli("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

// Vérification de la connexion
if ($mysqli->connect_error) {
    die("Connexion échouée : " . $mysqli->connect_error);
}

// Démarrer la transaction
$mysqli->begin_transaction();
        

Syntaxe procédurale :

$mysqli = mysqli_connect("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

// Vérification de la connexion
if (!$mysqli) {
    die("Connexion échouée : " . mysqli_connect_error());
}

// Démarrer la transaction
mysqli_begin_transaction($mysqli);
        

Valeurs possibles et paramètres

La fonction mysqli_begin_transaction() prend un paramètre optionnel pour définir les options de transaction. Les valeurs possibles pour ce paramètre sont :

  • MYSQLI_TRANS_START_READ_ONLY : Démarre une transaction en lecture seule.
  • MYSQLI_TRANS_START_READ_WRITE : Démarre une transaction en lecture/écriture (par défaut).

Exemples pratiques

Approche orientée objet :

Exemple :       Copier le code

$mysqli = new mysqli("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

if ($mysqli->connect_error) {
    die("Connexion échouée : " . $mysqli->connect_error);
}

$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_ONLY);

// ... Effectuer des opérations SQL ...

$mysqli->commit(); // Valider les modifications
        

Approche procédurale :

Exemple :       Copier le code

$mysqli = mysqli_connect("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

if (!$mysqli) {
    die("Connexion échouée : " . mysqli_connect_error());
}

mysqli_begin_transaction($mysqli, MYSQLI_TRANS_START_READ_WRITE);

// ... Effectuer des opérations SQL ...

mysqli_commit($mysqli); // Valider les modifications
        

Voici quelques exemples pratiques supplémentaires pour illustrer l'utilisation de la fonction mysqli_begin_transaction() en PHP :

Exemple 1 : Transfert d'argent entre comptes bancaires

Exemple :       Copier le code

$mysqli = new mysqli("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

if ($mysqli->connect_error) {
    die("Connexion échouée : " . $mysqli->connect_error);
}

// Début de la transaction
$mysqli->begin_transaction();

try {
    // Déduction d'argent du compte A
    $mysqli->query("UPDATE comptes SET solde = solde - 500 WHERE id = 1");

    // Ajout d'argent au compte B
    $mysqli->query("UPDATE comptes SET solde = solde + 500 WHERE id = 2");

    // Validation des modifications
    $mysqli->commit();
    echo "Transfert d'argent réussi !";
} catch (Exception $e) {
    // En cas d'erreur, annuler la transaction
    $mysqli->rollback();
    echo "Erreur : Transfert d'argent annulé.";
}

Cet exemple illustre comment utiliser mysqli_begin_transaction() pour réaliser un transfert d'argent sécurisé entre deux comptes bancaires.

  • 1. Une connexion à la base de données est établie à l'aide de MySQLi.
  • 2. La transaction est démarrée à l'aide de $mysqli->begin_transaction();. Cela marque le début d'une séquence d'opérations qui doivent être exécutées ensemble en tant qu'unité.
  • 3. Les déductions et les ajouts d'argent sont effectués via des requêtes SQL UPDATE pour débiter le compte A et créditer le compte B.
  • 4. La méthode commit() est utilisée pour valider les modifications apportées à la base de données. Cela signifie que les déductions et les ajouts d'argent seront effectifs.
  • 5. Si une exception est levée (par exemple, en cas d'échec de l'une des requêtes SQL), la transaction est annulée à l'aide de $mysqli->rollback();, et aucun changement n'est appliqué à la base de données.

Exemple 2 : Enregistrement de commandes avec vérification de stock

Exemple :       Copier le code

$mysqli = new mysqli("localhost", "nom_utilisateur", "mot_de_passe", "ma_base_de_données");

if ($mysqli->connect_error) {
    die("Connexion échouée : " . $mysqli->connect_error);
}

// Liste des produits commandés
$commandes = array(
    array("produit_id" => 1, "quantite" => 3),
    array("produit_id" => 2, "quantite" => 2)
);

$transaction_success = true;

// Début de la transaction
$mysqli->begin_transaction();

try {
    foreach ($commandes as $commande) {
        $produit_id = $commande["produit_id"];
        $quantite = $commande["quantite"];

        // Vérifier si le stock est suffisant
        $result = $mysqli->query("SELECT stock FROM produits WHERE id = $produit_id");
        $row = $result->fetch_assoc();
        $stock_disponible = $row["stock"];

        if ($stock_disponible >= $quantite) {
            // Enregistrer la commande
            $mysqli->query("INSERT INTO commandes (produit_id, quantite) VALUES ($produit_id, $quantite)");

            // Mettre à jour le stock
            $mysqli->query("UPDATE produits SET stock = stock - $quantite WHERE id = $produit_id");
        } else {
            // Le stock est insuffisant
            $transaction_success = false;
            break;
        }
    }

    if ($transaction_success) {
        // Validation des modifications
        $mysqli->commit();
        echo "Commande enregistrée avec succès !";
    } else {
        // En cas de stock insuffisant, annuler la transaction
        $mysqli->rollback();
        echo "Erreur : Stock insuffisant. Commande annulée.";
    }
} catch (Exception $e) {
    // En cas d'erreur, annuler la transaction
    $mysqli->rollback();
    echo "Erreur : Commande annulée.";
}

Cet exemple montre comment mysqli_begin_transaction() peut être utilisé pour enregistrer des commandes de produits tout en vérifiant si le stock est suffisant.

  • 1. Une connexion à la base de données est établie à l'aide de MySQLi.
  • 2. Une liste de commandes est définie, chaque élément contenant l'ID du produit et la quantité commandée.
  • 3. La transaction est démarrée avec $mysqli->begin_transaction();.
  • 4. Pour chaque commande, le stock disponible pour le produit est vérifié. Si le stock est suffisant, la commande est enregistrée et le stock est mis à jour.
  • 5. Si le stock est insuffisant pour une commande, la variable $transaction_success est définie sur false, et la boucle est interrompue.
  • 6. À la fin de toutes les commandes, si $transaction_success est vrai, la transaction est validée avec commit(). Sinon, elle est annulée avec rollback().

Ces deux exemples mettent en évidence l'importance des transactions pour garantir que les opérations complexes sont exécutées avec cohérence et intégrité, et comment mysqli_begin_transaction() facilite la gestion de ces scénarios dans PHP.

Astuces et conseils d'utilisation pratique

  • Assurez-vous que le moteur de stockage de votre table supporte les transactions, comme InnoDB.
  • N'oubliez pas de valider la transaction avec commit() après avoir effectué les opérations souhaitées.
  • En cas d'erreurs, utilisez rollback() pour annuler la transaction et revenir à l'état précédent.

En utilisant la fonction mysqli_begin_transaction() de PHP, vous pouvez gérer efficacement les transactions pour assurer l'intégrité et la cohérence de vos données dans les bases de données MySQL.




Voir aussi nos tutoriel :

Dessiner des arcs avec PHP GD

Dessiner des arcs avec PHP GD

fonction ucwords, ucwords

Met en majuscule la premi re lettre de tous les mots

fonction vsprintf, vsprintf

Retourne une chaîne format e