2011-12-18 23 views
0

ユーザーテーブルに行を挿入して、新しいユーザーを登録します。 user_idフィールド(これは自動インクリメント)を取得し、別のクエリでそれを使用したいと思います。ここでは解決策が提供されています: How to get the ID of INSERTed row in mysql?しかし、私は新しい行を挿入した直後に別のユーザーが登録され、私のPHPコードでmysql_insert_id()関数を実行する前に何が起こるのだろうかと思います。関数は何を返しますか?挿入された行のIDを取得

答えて

7

mysql_insert_id()は、現在の接続(ユーザーセッションに固有)に固有のIDであるauto_incrementを返します。したがって、その種の競合状態からは安全です。言い換えれば、挿入が重複している2人の同時接続ユーザーは、干渉なしで常に自分のセッションの正しいIDを返すでしょう。

+0

@AlirezaNoori特にPHPではなく、関数はネイティブのMySQL関数 'LAST_INSERT_ID()'を呼び出します。したがって、実際にはこれを管理するデータベースです。 –

+0

ありがとうございます。ああ、はい、私はそれを知っていた(私はMYSQLのドキュメントを読む)が、私は間違って言った。ごめんなさい。私を修正していただきありがとうございます。 –

1

int mysql_insert_id ([ resource $link_identifier ])はあなたの友人です。 http://es2.php.net/manual/en/function.mysql-insert-id.php

注:

のMySQL接続PHPのドキュメントから

。リンク識別子が指定されない場合、mysql_connect()によって最後に開かれたリンクが仮定されます。そのようなリンクが見つからない場合、引数なしでmysql_connect()が呼び出されたかのようにリンクを作成しようとします。接続が見つからないか確立されていない場合は、E_WARNINGレベルのエラーが生成されます。

成功した場合に以前のクエリでAUTO_INCREMENT列に対して生成されたID、前回のクエリでAUTO_INCREMENT値が生成されなかった場合は0、MySQL接続が確立されていない場合はFALSEです。

mysql_insert_id()は、ネイティブのMySQL C API関数mysql_insert_id()の戻り値の型をlong型(PHPのint型)に変換します。 AUTO_INCREMENT列の列タイプがBIGINT(64ビット)の場合、変換によって不正な値が返される可能性があります。代わりに、SQLクエリで内部MySQL SQL関数LAST_INSERT_ID()を使用してください。 PHPの最大整数値の詳細については、整数ドキュメントを参照してください。

最後に実行されたクエリに対してmysql_insert_id()が動作するため、値を生成するクエリの直後に必ずmysql_insert_id()を呼び出してください。

MySQL SQL関数LAST_INSERT_ID()の値には、常に最新のAUTO_INCREMENT値が含まれており、クエリ間ではリセットされません。

関連する問題