จะรับ ID แถวที่แทรกล่าสุดจากฐานข้อมูล WordPress ได้อย่างไร


99

ปลั๊กอิน WordPress ของฉันมีตารางที่มีช่องคีย์หลักAUTO_INCREMENT ที่เรียกว่า ID เมื่อแทรกแถวใหม่ลงในตารางฉันต้องการรับค่า ID ของการแทรก

คุณลักษณะคือการใช้ AJAX เพื่อโพสต์ข้อมูลไปยังเซิร์ฟเวอร์เพื่อแทรกลงใน DB ID แถวใหม่จะถูกส่งคืนในการตอบสนอง AJAX เพื่ออัพเดตสถานะไคลเอ็นต์ เป็นไปได้ว่าไคลเอนต์หลายรายกำลังโพสต์ข้อมูลไปยังเซิร์ฟเวอร์ในเวลาเดียวกัน ดังนั้นฉันต้องแน่ใจว่าคำขอ AJAX แต่ละรายการได้รับ ID แถวใหม่ที่แน่นอนในการตอบสนอง

ใน PHP มีเมธอดที่เรียกว่าmysql_insert_idสำหรับฟีเจอร์นี้ แต่จะใช้ได้กับสภาพการแข่งขันก็ต่อเมื่ออาร์กิวเมนต์เป็นlink_identifierของการดำเนินการล่าสุด การดำเนินการกับฐานข้อมูลของฉันอยู่ที่ $ wpdb วิธีแยกlink_identifierจาก $ wpdb เพื่อให้แน่ใจว่า mysql_insert_id ใช้งานได้ มีวิธีอื่นในการรับ id แถวสุดท้ายจาก $ wpdb หรือไม่?

ขอบคุณ.


ลิงก์ | ทรัพยากรถูกเก็บไว้ใน$wpdb->dbhแต่ถูกกำหนดเป็นprotected $dbh;... คุณไม่สามารถเข้าถึงได้โดยตรงดังนั้นให้ใช้คำตอบด้านล่าง :)
jave.web

คำตอบ:


198

หลังจาก$wpdb->insert()ที่ใส่เม็ดมีดแล้วให้ทำดังนี้:

$lastid = $wpdb->insert_id;

ข้อมูลเพิ่มเติมเกี่ยวกับการทำสิ่งต่างๆด้วยวิธี WordPress สามารถพบได้ใน WordPress codex ดูรายละเอียดด้านบนได้ที่นี่ในหน้าคลาส wpdb


มันเป็นเช่นนี้: $lastid = $wpdb->$insert_id ?
Francisco Corrales Morales

"ฟังก์ชันนี้จะคืนค่าเท็จหากไม่สามารถแทรกแถวได้มิฉะนั้นจะส่งคืนจำนวนแถวที่ได้รับผลกระทบ (ซึ่งจะเป็น 1 เสมอ)" จาก: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
@unbreak - ฟังก์ชั่นผิดที่นั่น ... คุณกำลังอ่านเกี่ยวกับ wpdb-> insert ($ table, $ data, $ format);
jsnfwlr

4
นอกจากนี้ยังมีประโยชน์ที่จะทราบว่าหากคุณใช้แบบสอบถาม $ wpdb-> มันจะยังคงกำหนด insert_id
Dave Scotese

2
ไม่จำเป็น แต่ฉันคิดว่ามันจะดีขึ้นเล็กน้อยเน้นคำสั่งและลบการเยื้องออกเนื่องจากไม่จำเป็นสำหรับบรรทัดเดียว
kamal pal

14

นี่คือวิธีที่ฉันทำในรหัสของฉัน

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

ตัวแปรคลาสเพิ่มเติม


1
"ฟังก์ชันนี้จะคืนค่าเท็จหากไม่สามารถแทรกแถวได้มิฉะนั้นจะส่งคืนจำนวนแถวที่ได้รับผลกระทบ (ซึ่งจะเป็น 1 เสมอ)" จาก: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak

1
มันได้ผล. $wpdb->queryผลตอบแทน len แถวรับผลกระทบและ$wpdb->insert_idมีรหัสแทรกสุดท้าย ขอบคุณ!
Fabio Montefuscolo

สิ่งนี้ดีกว่าสำหรับฉันเพราะฉันต้องการจับภาพส่วนแทรกที่จะส่งคืนข้อผิดพลาดเนื่องจากค่าคอลัมน์ซ้ำกันในคอลัมน์ที่ไม่ซ้ำกัน ไม่มีทางที่จะINSERT IGNOREมี$wpdb->insertโชคร้าย
Solomon Closson

@unbreak - ดูเหมือนว่าจะคืนค่าinsert_idให้ฉันไม่ใช่จำนวนแถวที่ได้รับผลกระทบ
Solomon Closson

0

สิ่งนี้ก็ควรทำเช่นกัน:

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

10
สิ่งนี้จะไม่ทำให้เกิดปัญหาหรือไม่หากมีการแทรกสองระเบียนในเวลาเดียวกันโดยกระบวนการที่ต่างกันสองกระบวนการ กระบวนการทั้งสองสามารถแทรกในเวลาเดียวกัน (หรือใกล้เคียงกับเวลาเดียวกันมากพอ) เพื่อให้ auto_increment ส่งคืนหมายเลขเดียวกันสำหรับทั้งสองกระบวนการ
Michael Khalili

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
นั่นไม่ได้ทำโดยใช้วัตถุ $ wpdb ตามที่กล่าวไว้ใน OP
jsnfwlr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.