Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP PDO MySQL Transaktionscodestruktur

Einige allgemeine Hinweise:Verwenden Sie bindParam() nicht es sei denn, Sie verwenden eine Prozedur, die den Wert des Parameters ändert. Verwenden Sie daher use bindValue() . bindParam() akzeptiert den Argumentwert als referenzierte Variable. Das bedeutet, dass Sie $stmt->bindParam(':num', 1, PDO::PARAM_INT); nicht ausführen können - Es löst einen Fehler aus. Außerdem hat PDO seine eigenen Funktionen zur Steuerung von Transaktionen, Sie müssen Abfragen nicht manuell ausführen.

Ich habe Ihren Code leicht umgeschrieben, um etwas Licht in die Verwendung von PDO zu bringen:

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
    }    
}