sql >> Database teknologi >  >> RDS >> Mysql

PHP PDO MySQL Transaktionskodestruktur

Nogle generelle bemærkninger:Brug ikke bindParam() medmindre du bruger en procedure, der ændrer parameterens værdi, use bindValue() . bindParam() accepterer argumentværdi som en referencevariabel. Det betyder, at du ikke kan gøre $stmt->bindParam(':num', 1, PDO::PARAM_INT); - det rejser en fejl. PDO har også sine egne funktioner til at kontrollere transaktioner, du behøver ikke at udføre forespørgsler manuelt.

Jeg omskrev din kode lidt for at kaste lidt lys over, hvordan PDO kan bruges:

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. PDO nægter at slette en række data (i specifik tabel)

  2. PostgreSQL belastningsbalancering i skyen gjort let

  3. opret forbindelse til mysql-databasen ved hjælp af phpseclib-biblioteket

  4. Jeg får dobbelte resultater fra mysql-forespørgsel, når jeg bruger internationale tegn, dvs. Å/Ä=A &Ö=O,