sql >> データベース >  >> RDS >> Mysql

PHPPDOMySQLトランザクションコード構造

    一般的な注意事項:bindParam()は使用しないでください パラメータの値を変更するプロシージャを使用しない限り、use bindValue() 。 bindParam()は、引数値を参照変数として受け入れます。つまり、$stmt->bindParam(':num', 1, PDO::PARAM_INT);を実行することはできません。 -エラーが発生します。また、PDOにはトランザクションを制御するための独自の機能があるため、クエリを手動で実行する必要はありません。

    PDOの使用方法を明らかにするために、コードを少し書き直しました。

    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. MySQLのパラメータ化されたクエリ

    2. SQL Server 2008では3文字になるように、先行ゼロで文字列を埋めます

    3. SQLiteの既存のテーブルに列を追加する

    4. auto_increment idが1つずつ増えないのはなぜですか、どのように設定するのですか?