WordPressデータベースから最後に挿入された行IDを取得する方法は?


94

私のWordPressプラグインには、 IDと呼ばれるAUTO_INCREMENT主キーフィールドをます。新しい行がテーブルに挿入されたときに、挿入のID値を取得したいと思います。

機能は、AJAXを使用してデータをサーバーにポストし、DBに挿入することです。AJAX応答で新しい行IDが返され、クライアントのステータスが更新されます。複数のクライアントが同時にサーバーにデータを送信している可能性があります。そのため、各AJAX要求が応答として正確な新しい行IDを取得することを確認する必要があります。

PHPには、この機能用のmysql_insert_idというメソッドがありますが、引数が最後の操作のlink_identifierである場合にのみ、競合状態に対して有効です。データベースの操作は$ wpdbで行います。link_identifierを抽出する方法$ wpdbから mysql_insert_idが機能することを確認ですか?$ wpdbから最後に挿入された行のIDを取得する他の方法はありますか?

ありがとう。


リンク|リソースはに保存されていますが、直接アクセスできない... sou $wpdb->dbhとして定義されているprotected $dbh;ため、以下の回答を使用してください:)
jave.web

回答:


191

$wpdb->insert()それが挿入を行った直後に、これを行います:

$lastid = $wpdb->insert_id;

WordPressの方法を実行する方法の詳細については、WordPress codexを参照してください。上記の詳細は、wpdbクラスページにあります。


次のよう $lastid = $wpdb->$insert_id ですか?
フランシスココラレスモラレス

「この関数は、行を挿入できなかった場合はfalseを返します。それ以外の場合は、影響を受けた行の数(常に1になります)を返します。」From:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
@unbreak-間違った関数があります... wpdb-> insert($ table、$ data、$ format);
jsnfwlr 2015

3
$ wpdb-> queryを使用した場合でも、insert_idが割り当てられることを知っておくと便利です。
Dave Scotese

2
必要ではありませんでしたが、1行では必要ないため、少し改善され、ステートメントが強調表示され、インデントが削除されたと思います。
kamal pal

14

これは私がコードで行った方法です

 ...
 global $wpdb;
 $query =  "INSERT INTO... VALUES(...)" ;
 $wpdb->query(
        $wpdb->prepare($query)
);
return $wpdb->insert_id;
...

その他のクラス変数


1
「この関数は、行を挿入できなかった場合はfalseを返します。それ以外の場合は、影響を受けた行の数(常に1になります)を返します。」from:codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
できます。$wpdb->query戻って変更された行のlenの及び$wpdb->insert_id最後に挿入されたIDを有します。ありがとう!
Fabio Montefuscolo 2015

一意の列で列の値が重複しているためにエラーが返される挿入をキャプチャしたいので、これは私にとってはより良い方法です。残念ながらとINSERT IGNOREする方法はありません$wpdb->insert
ソロモンクロッソン2018

@unbreak- insert_id影響を受けた行の数ではなく、を返しているようです。
ソロモンクロッソン2018

0

このようなこともそれをするはずです:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;

10
2つのレコードが2つの異なるプロセスによってほぼ同時に挿入された場合、これは問題を引き起こしませんか?auto_incrementが両方のプロセスに対して同じ数を返すように、両方のプロセスが同時に(または同時に十分に近くに)挿入できます。
Michael Khalili 2013

0

私はそれを挿入した後に最後のIDウェイを取得する必要があったので、

$lastid = $wpdb->insert_id;

オプションではありませんでした。

フォローしました:

global $wpdb;
$id = $wpdb->get_var( 'SELECT id FROM ' . $wpdb->prefix . 'table' . ' ORDER BY id DESC LIMIT 1');

-6

mysql_insert_id()トランザクション内に呼び出しを置くと、それを行う必要があります:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.

4
OPで述べたように、$ wpdbオブジェクトを使用してそれを行っているわけではありません。
jsnfwlr 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.