1

ねえ、皆さんに質問があります。SQL mysql 挿入を try catch に実装すると、そのうちの 1 つが失敗した場合にデータベースへの部分的な INSERT のみを実行できなくなりますか?

try
{
//SQL INSET TABLE 1
//SQL INSET TABLE 2
//SQL INSET TABLE 3
//SQL INSET TABLE 4
}
catch(Exception $e)
{...}

私はすべてを否定するか、すべてを受け入れたいと思います。それは彼らがそうする方法ですか?

ご意見につきまして。PDOを使用しています。それを可能にする構成例に感謝します。

あなたのコメントでは、トランザクションとロールバックを推奨することがよくあります。コードにコメントを付けて例を挙げることはできますか? バツ

また、この効果を達成する別の方法があるかどうかも知りたいです。

@SOLUTION FOUND AT: PHP + MySQL トランザクションの例:

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}

この考え方では、クエリが失敗した場合、例外をスローする必要があることに注意してください。

PDO::setAttribute および PDO::ATTR_ERRMODE および PDO::ERRMODE_EXCEPTION を参照してください。それ以外の場合は、他の API を使用して、クエリの実行に使用される関数の結果をテストする必要がある場合があります。自分で例外をスローします。

残念ながら、魔法は含まれていません。どこかに命令を置いて、トランザクションを自動的に実行させることはできません。トランザクションで実行する必要があるクエリのグループを特定する必要があります。

たとえば、トランザクションの前 (開始前) にいくつかのクエリがあり、トランザクションの後 (コミットまたはロールバックの後) に別のクエリがいくつかあり、何が起こっても (またはではありません)。

別の役立つリンク: PHP PDO トランザクション?

4

2 に答える 2