は、私のコードの構造です:PDOトランザクションAPIはどのように機能しますか?ここ
// db connection here
try {
$dbh_conn->beginTransaction();
$stm = $dbh_conn->prepare("SELECT user_id FROM resend_pass WHERE token = ?");
$stm->execute(array('value'));
$num_rows = $stm->fetch(PDO::FETCH_ASSOC);
if($num_rows) {
echo 'one'; die;
} else {
echo 'two'; die;
}
$dbh_conn->commit();
} catch(PDOException $e) {
$dbh_conn->rollBack();
echo 'three'; die;
}
まさにそのクエリを実行すると?ご存知のとおり、私のスクリプトは期待どおりに動作します。しかし、私はどのように思っていますか?あなたが見る通り、commite()
の前にif - else
の文があります。また、if
およびelse
の両方は、そのブロックにdie;
を有する。だから、私の知る限りでは、この行は実行されません:
$dbh_conn->commit();
die
その前に無愛想ありますので。しかし、意外にも私のコードはうまくいきます。ここでは、すべての可能な出力は次のようになります。
value
がresend_pass
テーブルにトークンとして存在する場合、それはone
を印刷します。resend_pass
テーブルにvalue
がトークンとして存在しない場合はtwo
を出力します。- エラー(構文SQLエラーなど)
を参照してくださいがある場合はthree
を出力しますか?大丈夫だ。しかしどうですか?正確にcommit()
関数が実行されるとき?それらの前にdie
?
注resend_pass
のエンジンは、INNODBあります。
phpが終了するとクリーンアップされます。つまり、データベースから切断されます。 mysqlはそれを見て、ロールバックを発行して、接続が "ゴミ"になるようにします。 'die'はスクリプトを直ちに殺します。シャットダウン機能を登録しない限り、あなたのコミットコールは決して実行の機会を得ることはありません。 –
@MarcB * "あなたのコミットコールは決して実行する機会がありません" * - 間違っています。私が言ったように、そのクエリが実行され、 'if($ num_rows){'はそのクエリの結果に基づいて実行されます。 –
何が問題なのですか? PHPは時間旅行しません。単にスクリプトの「将来」のどこかに「死ぬ」コマンドがあるからといって、PHPがスクリプトをまったく実行しないことを意味するわけではありません。それは、コードを正確に実行しながら、コードを1行ずつ実行します。それはあなたのクエリを実行します。結果をフェッチします。その結果をテストし、それが「死ぬ」かもしれません。 –