2016-08-15 1 views
0

私はmysqli_insert_id()が全体のサーバーまたはそのIDを挿入した特定のユーザーからレコードを返すというmysqlの質問をしていますか?全体的に見れば、この関数を使うのは安全ではないからです。mysqli_insert_id()はサーバ全体から、または同じユーザからレコードを取得しますか?

+0

それを使用するのは安全ですか? –

+0

はい使用するのがなぜ安全ではないでしょうか? – Daan

+0

準備文を使用していない場合は、他のユーザーのレコードを返すことができるので、 –

答えて

2

上記の@daanからのコメントは間違っています。 insert_id()は、最後のinsertクエリのauto_incrementフィールドに配置されたIDを返します。これは、insert_id()クエリを実行している接続が実行されたことを示します。

テーブル内の最大のIDを返しません。他の接続によって作成されたIDを返しません。他のユーザーによって作成されたIDは返しません。

それは文字通り最後のID あるLASTによって作成されたYOUはが行わYOUを挿入します。

これは、挿入を実行し、作成したIDをlast_insert_id()で取得し、そのIDを他のクエリで使用して親子レコードを作成することが100%信頼できることを意味します。

ただし、insert_id()は、のONEのid値のみを返します。複数値の挿入を行うと、最後の値セットからIDを取得するだけです(例:

INSERT INTO sometable (x, y) VALUES (1,2), (2,3) 

はまだ内部的に2つの挿入を実行し、あなただけの2,3タプル、ない1,2のIDを取得したいです。

INSERT ... // query #1 
INSERT ... // query #2 
SET id = last_insert_id(); 

のみクエリ#2によって作成されたID、およびクエリ#1からのIDは「失われた」されてしまいます。

は同様に、以前のすべてのクエリのためのメモリがありません。

+0

私はそれがサーバー上のユーザーをどのように区別するのかを知りたいですか? –

+0

Daanのコメントは表示されません。彼はそれを削除したかもしれない。私は自分自身を見て覚えていないので、取り出すべきです。 –

+0

@ ZainFarooq:特定の接続に結びついているためです。たとえあなたのコードがDBへの複数の同時接続を保持していても、それが呼び出されたID関数KNOWSはその特定の接続によって生成されたIDだけを返します。 –

1

@ZainFarooq mysqli_insert_id()関数を実行する前に、PHPにmysqli_connect()関数と呼ばれるものがあり、サーバに接続してデータベースを選択してレコードを取得します。

mysqli_insert_id()関数がyesの場合は、使用するのが完全に安全で、AUTO_INCREMENT属性を持つカラムを持つテーブルのクエリで生成されたIDを返します。最後の問合せがINSERTまたはUPDATE文でないか、または変更された表にAUTO_INCREMENT属性を持つ列がない場合、この関数はゼロを戻します。

関連する問題