3

私の質問はばかげているかもしれませんが、知りたいことが 1 つありmysql_insert_id()ます。php.net では次のように書かれています。

前のクエリ (通常は INSERT) によって AUTO_INCREMENT 列に対して生成された ID を取得します。

mysql_insert_id()スクリプトが使用されている行に到達する前に、別のスクリプトがデータベースに何かを挿入した場合、この関数の出力は何になりますか?

私の知る限り、最後に挿入されたアイテムのIDを返します(どこからでも構いません)。私が正しければ、この問題を回避する方法を知りたいのですがmysql_insert_id()、挿入クエリが実行されたときにすぐに使用します (「トラブル」に陥る可能性はまだ少しあるため)。

4

1 に答える 1

3

現在のセッションで挿入された最後の行の ID が返されるので、何も心配する必要はありません。実際、リンク識別子を引数として渡すか、そうでなければ、最後に開かれたリンクにデフォルト設定されます。ドキュメントから

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

だからあなたが持っているなら

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", mysql_insert_id());

セッションで最後に生成された ID を取得するため、これは常に正しくなります (もちろん、mytable に AUTO_INCREMENT 列がある場合)。同時に別のユーザーがまったく同じクエリを実行すると、別のセッションが発生し、ID が正しく取得されます。

于 2012-04-11T15:41:54.653 に答える