2

この初心者の質問で申し訳ありません。私は PHP 開発者ではありませんが、今はそれを学ぼうとしています。

MySQL データベースにレコードを追加したいのですが、トランザクション ロックを使用しています。

私のコードは以下の通りです。

$SqlQuery="INSERT INTO tab_photo VALUES('$PhotoID','$ProjectId','$Day','$barCode','$photoName','$PhotoXml')";

$waiting = true;
while($waiting) {
    try {
        // save border data
        $stmt = $conn->prepare($SqlQuery);
        $conn->beginTransaction();
        $stmt->execute();
        sleep(1);

        $x=$conn->commit();
        echo "x value-".$x;

        echo "Success";
        $waiting = false;
    }
    catch (PDOException $e){
        echo "Failled :".$PhotoID."-".$PhotoID;
        if(stripos($e->getMessage(), 'DATABASE IS LOCKED') !== false) {
            // This should be specific to SQLite, sleep for 0.25 seconds
            // and try again.  We do have to commit the open transaction first though
            $conn->commit();
            usleep(250000);
        } else {
            $conn->rollBack();
            throw $e;
        }
    }
}

ここで出力として、

x value-1 Success

しかし実際には、このレコードはデータベースに追加されません。

私の質問:

  1. コミットも成功しています (出力 1) データベースに追加されないのはなぜですか?
  2. レコードがデータベースに追加されているかどうかを確認するにはどうすればよいですか? ( write select ステートメントなしでそれを見つける方法はありますか?
4

1 に答える 1

1

私が理解しているように、ステートメントの実行に失敗したときに PDOException がスローされることを期待しています。しかし、私が見ることができるように、そのような場合、デフォルトでは例外はスローされません。ここでそれを変更する方法を参照してください

あなたの場合、次のようなコードが必要だとします。

$conn = new PDO($connection_string); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // this will force PDO to throw exception when SQL statement fails instead of simply setting an error.

これがうまくいくとしましょう。

使用しないでください。

$SqlQuery="INSERT INTO tab_photo VALUES('$PhotoID','$ProjectId','$Day','$barCode','$photoName','$PhotoXml')";

その代わりに、パラメーター バインディングを使用する必要があります。

$SqlQuery="INSERT INTO tab_photo VALUES(:PhotoID,:ProjectId,:Day,:barCode,:photoName,:PhotoXml)";
$stmt = $conn->prepare($SqlQuery);
$conn->beginTransaction();
$stmt->execute(array(':PhotoID' => $PhotoID, ':ProjectId' => $ProjectId, ....));
sleep(1);

詳しくはこちらをご覧ください。

于 2013-01-16T10:30:44.790 に答える