WordPress veritabanından son eklenen satır kimliği nasıl alınır?


99

WordPress eklentimde ID adında AUTO_INCREMENT birincil anahtar alanına sahip bir tablo var . Tabloya yeni bir satır eklendiğinde, eklemenin ID değerini almak istiyorum.

Özellik, DB'ye eklemek üzere sunucuya veri göndermek için AJAX kullanmaktır. Yeni satır kimliği, istemci durumunu güncellemek için AJAX yanıtında döndürülür. Birden fazla istemcinin aynı anda sunucuya veri göndermesi mümkündür. Bu nedenle, her AJAX isteğinin yanıt olarak TAM yeni satır kimliğini aldığından emin olmalıyım.

PHP'de bu özellik için mysql_insert_id adında bir yöntem vardır, ancak yarış durumu için yalnızca argüman son işlemin link_identifier ise geçerlidir . Veritabanı ile işlemim $ wpdb üzerinde. Nasıl ayıklamak için bağlantı_belirteci emin mysql_insert_id çalışması için $ wpdb gelen? $ Wpdb'den son eklenen satır kimliğini almanın başka bir yolu var mı?

Teşekkürler.


Bağlantı | kaynak içinde saklanıyor $wpdb->dbh, ancak şu şekilde tanımlanıyor protected $dbh;... doğrudan ona erişemezsiniz, bu nedenle aşağıdaki yanıtı kullanın :)
jave.web

Yanıtlar:


198

Bundan hemen sonra $wpdb->insert()eki yapar, şunu yapın:

$lastid = $wpdb->insert_id;

WordPress kodeksinde işlerin nasıl yapılacağı hakkında daha fazla bilgi bulunabilir. Yukarıdaki ayrıntılar burada wpdb sınıf sayfasında bulundu


Bunun gibi $lastid = $wpdb->$insert_id mi:?
Francisco Corrales Morales

"Bu işlev, satır eklenemezse yanlış döndürür. Aksi takdirde, etkilenen satırların sayısını döndürür (her zaman 1 olacaktır)." Gönderen: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
@unbreak - yanlış işlev var ... wpdb-> insert ($ table, $ data, $ format) hakkında okuyorsunuz;
jsnfwlr

4
Ayrıca, $ wpdb-> sorgusunu kullanırsanız, yine de insert_id atayacağını bilmek yararlıdır.
Dave Scotese

2
gerekli değildi, ancak bence biraz iyileştiriyor, ifade vurgulanıyor ve tek satır için gerekli olmadığından girintiyi kaldırıyor.
kamal dost

14

Ben böyle yaptım, kodumda

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

Daha Sınıf Değişkenleri


1
"Bu işlev, satır eklenemezse yanlış döndürür. Aksi takdirde, etkilenen satırların sayısını döndürür (her zaman 1 olacaktır)." dan: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
İşe yarıyor. $wpdb->queryDöner etkilenen satırların len ve $wpdb->insert_idson eklenen kimliği vardır. Teşekkürler!
Fabio Montefuscolo

Bu benim için daha iyi, çünkü aksi takdirde benzersiz bir sütundaki yinelenen sütun değerleri nedeniyle hata verecek eklemeleri yakalamak istiyorum. Hiçbir yolu yoktur INSERT IGNOREile $wpdb->insertmaalesef.
Solomon Closson

@unbreak - insert_idEtkilenen satırların sayısı değil, bana döndürülüyor gibi görünüyor .
Solomon Closson

0

Bunun gibi bir şey de yapmalı:

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

10
İki kayıt hemen hemen aynı anda iki farklı işlemle girilirse bu bir soruna neden olmaz mı? Her iki süreç de aynı anda (veya aynı anda yeterince yakın) girebilir, böylece auto_increment her iki işlem için de aynı sayıyı döndürecektir.
Michael Khalili

0

Ekledikten sonra son kimliği almam gerekiyordu, bu yüzden

$lastid = $wpdb->insert_id;

Bir seçenek değildi.

Aşağıdakiler mi?

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

-6

Çağrıyı mysql_insert_id()bir işlemin içine koymak , şunu yapmalıdır:

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

4
Bunu OP'de belirtildiği gibi $ wpdb nesnesini kullanarak yapmak değil.
jsnfwlr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.