2012-02-23 14 views
4

これは私がレコードを挿入するために使用するコードです。挿入エラーが発生するたびに、ロールバックしても加入者テーブルのauto-inc番号は増えますか?何が問題ですか? エラーが発生したときに自動インクリメント番号を追加しないだけです。たくさんのことが助けになります。あなたのコードに行番号を知らなくても'アクティブなトランザクションはありません'というメッセージがあるキャッチされない例外 'PDOException'?

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); 
$conn->beginTransaction(); 
try { 

    $email = $_POST['Email']; 
    $FirstName = $_POST['FirstName']; 
    $LastName = $_POST['LastName']; 


    $query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())"; 
    $stmt = $conn->prepare($query); 


    $stmt->bindParam(1, $email , PDO::PARAM_STR); 
    $stmt->bindParam(2, $FirstName, PDO::PARAM_STR); 
    $stmt->bindParam(3, $LastName, PDO::PARAM_STR); 
    $stmt->execute(); 
    $conn->commit(); 

} 
catch(PDOException $e) 
    { 
    $conn->rollBack(); 
    die ($e->getMessage()."<a href='addSub.php'>Back</a>"); 
    } 

$conn->beginTransaction(); 
try { 
    $userID = $_SESSION['username']; 
    $query="INSERT INTO list_sub (SubID,ListID) VALUES ('',$_SESSION[ListID])"; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(); 
    $conn->commit(); 

} 
catch(PDOException $e) 
    { 
    $conn->rollBack(); 
    die ($e->getMessage()."<a href='addSub.php'>Back</a>"); 
    } 

$conn = null;} 

答えて

6

にそのハードがを知っていますが、最初のtry-catchブロックの最後にあなたのトランザクションをコミットした後、2番目のtry-に新しいトランザクションを開始せずに続行キャッチブロック。

は、2番目のtry-catchブロックの先頭に$conn->beginTransaction();を追加します。

EDIT - あなたは「私はエラーが発生したときに自動インクリメントの数は追加しないで欲しい」に言及。自動インクリメント機能を使用して、数字の「ギャップレス」シーケンスを生成する必要はありません。

+0

それはしかし、それはロールバックされません、再びそのエラーメッセージは表示されません。加入者テーブルは、エラー – user782104

+0

があるときはいつも、自動インクリメント番号を増やします。自動インクリメントする必要があります。 – thetaiko

+0

つまり、私は 'set table auto-inc number = x -1'のようないくつかのSQL文をPHPのコードで使用しなければならないということです。ありがとう〜 – user782104

5

PDOの自動コミットはおそらく有効になっている、とあなたはそれがすでにコミットしているので、ロールバックしようとすると、それが問題を引き起こしています。あなたは、この動作を無効にするPDO::ATTR_AUTOCOMMITを使用することができます。

$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); 
+0

おかげで私は$ conn-> setAttributeメソッド(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION)の下に置きます。 、 それは大丈夫ですか? – user782104

+0

@ user782104:はい、それは問題ありません。この設定を無効にすると、すべてのクエリを手動でコミットする必要があります。 – FtDRbwLXw6

+0

私の編集したバージョンをご覧ください。ありがとう。 – user782104

関連する問題