sql >> Databasteknik >  >> RDS >> Mysql

PHP PDO MySQL Transaktionskodstruktur

Några allmänna anmärkningar:Använd inte bindParam() såvida du inte använder en procedur som ändrar parameterns värde, use bindValue() . bindParam() accepterar argumentvärde som en refererad variabel. Det betyder att du inte kan göra $stmt->bindParam(':num', 1, PDO::PARAM_INT); - det ger upphov till ett fel. Dessutom har PDO sina egna funktioner för att kontrollera transaktioner, du behöver inte utföra frågor manuellt.

Jag skrev om din kod något för att belysa hur PDO kan användas:

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


  1. Välj rader som inte finns i andra tabeller

  2. Hur kan jag veta om ett SQL-undantag kastades på grund av brott mot främmande nyckel?

  3. Varför är PostgreSQL-arrayåtkomst så mycket snabbare i C än i PL/pgSQL?

  4. Ta bort en ansluten användare från ett Oracle 10g-databasschema