2012-03-27 13 views
19

私は次のコードを持っている:私はお願いしたいと思いますどのようなPDO最後の挿入IDは常に正しいものですか?

<? 
$query =$db->prepare("INSERT INTO a_table (id, a_field) VALUES ('', (:a_field)"); 
$query->bindParam(":a_field", $a_value); 
$query->execute(); 
$last_id = $db->lastInsertId('a_table'); 
?> 

はこれです。 2人がまったく同じ時刻にページを読み込んだとしたら、最後のIDが取得される前に他人のクエリが挿入され、IDが混在する可能性がありますか?

+11

いいえ、競合はありません。挿入IDは接続に依存し、各ページの読み込みは新しい接続を確立します。 –

+5

基礎となるデータベースに依存します。それがmysqlの場合、PDOは単にmysql last_insert_id()API関数を呼び出します。これは返されたIDがPDO接続によって最後に実行された挿入クエリによって生成されたIDであることを保証します。 –

+1

[LAST_INSERT_ID()の重複可能性]マルチユーザー環境での動作](http://stackoverflow.com/questions/5835677/last-insert-id-how-it-works-at-multi-users-environment) –

答えて

24

いいえ、この状況はありません。 メソッド$ db-> lastInsertId()は、このDB接続の最後に挿入されたIDを返します。他のページには、別の接続と別の最後に挿入されたIDがあります。

6

PDOは、現在アクティブなデータベース接続によって挿入された最後のIDを返します。

0

ただ、直面している次のような状況

は(insert.phpのような)他のファイルを含むファイルpost.phpを持っています。 MySQLで挿入する

コード全体は、insert.phpinsert.php

に位置するコード$id_of_inserted_row = $db->lastInsertId();

そしてinsert.phpに正しい値を示すecho $id_of_inserted_row;です。

しかし、echo $id_of_inserted_row;post.phpでは、誤った値が表示されます(実際の値よりも小さい数字を示しています)。私は理由を理解していない、ちょうど考慮する必要があります。 2つの表に挿入され、誤って両方のテーブルに同じ$id_of_inserted_row = $db->lastInsertId();を使用したため

更新

申し訳ありませんが、書かれた超えていました。

他の回答と同じ結論が得られます。lastInsertId()は最後に挿入された行のIDを取得します。

私はmysqlに2行を挿入しました。そのような場合、lastInsertId()は最初に挿入された行のIDです(最後ではありません)。あなたは、単一のINSERT文を使用して複数の行を挿入した場合 見つかり答えhttps://stackoverflow.com/a/12574752/2118559

重要...なぜ理解していない、LAST_INSERT_ID()は、最初の挿入された行のために生成された値を返します。その理由は、他のサーバに対して同じINSERT文を簡単に再現できるようにするためです。

関連する問題