Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP PDO MySQL Structure du code de transaction

Quelques notes générales :n'utilisez pas bindParam() sauf si vous utilisez une procédure qui modifie la valeur du paramètrePar conséquent, use bindValue() . bindParam() accepte la valeur d'argument comme variable référencée. Cela signifie que vous ne pouvez pas faire $stmt->bindParam(':num', 1, PDO::PARAM_INT); - cela génère une erreur.De plus, PDO a ses propres fonctions pour contrôler les transactions, vous n'avez pas besoin d'exécuter les requêtes manuellement.

J'ai légèrement réécrit votre code pour vous éclairer sur la façon dont PDO peut être utilisé :

if($_POST['groupID'] && is_numeric($_POST['groupID']))
{
    // List the SQL strings that you want to use
    $sql['privileges']  = "DELETE FROM users_priveleges WHERE GroupID=:groupID";
    $sql['groups']      = "DELETE FROM groups WHERE GroupID=:groupID"; // You don't need LIMIT 1, GroupID should be unique (primary) so it's controlled by the DB
    $sql['users']       = "DELETE FROM users WHERE Group=:groupID";

    // Start the transaction. PDO turns autocommit mode off depending on the driver, you don't need to implicitly say you want it off
    $pdo->beginTransaction();

    try
    {
        // Prepare the statements
        foreach($sql as $stmt_name => &$sql_command)
        {
            $stmt[$stmt_name] = $pdo->prepare($sql_command);
        }

        // Delete the privileges
        $stmt['privileges']->bindValue(':groupID', $_POST['groupID'], PDO::PARAM_INT);
        $stmt['privileges']->execute();

        // Delete the group
        $stmt['groups']->bindValue(":groupID", $_POST['groupID'], PDO::PARAM_INT);
        $stmt['groups']->execute();

        // Delete the user 
        $stmt['users']->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
        $stmt['users']->execute();

        $pdo->commit();     
    }
    catch(PDOException $e)
    {
        $pdo->rollBack();

        // Report errors
    }    
}