वर्डप्रेस डेटाबेस से अंतिम सम्मिलित पंक्ति आईडी कैसे प्राप्त करें?


95

मेरे वर्डप्रेस प्लगइन में AUTO_INCREMENT प्राथमिक कुंजी फ़ील्ड के साथ एक तालिका है जिसे ID कहा जाता है। जब एक नई पंक्ति तालिका में डाली जाती है, तो मैं प्रविष्टि का आईडी मान प्राप्त करना चाहता हूं।

डीबी में डालने के लिए सर्वर पर डेटा पोस्ट करने के लिए AJAX का उपयोग करने की सुविधा है। ग्राहक की स्थिति को अपडेट करने के लिए AJAX की प्रतिक्रिया में नई पंक्ति ID लौटा दी गई है। यह संभव है कि एक ही समय में कई क्लाइंट सर्वर पर डेटा पोस्ट कर रहे हों। इसलिए, मुझे यह सुनिश्चित करना होगा कि प्रत्येक AJAX अनुरोध के जवाब में EXACT नई पंक्ति ID प्राप्त करें।

PHP में, इस सुविधा के लिए mysql_insert_id नामक एक विधि है । लेकिन, यह केवल दौड़ की स्थिति के लिए मान्य है, यदि तर्क अंतिम ऑपरेशन का link_identifier है। डेटाबेस के साथ मेरा ऑपरेशन $ wpdb पर है। Mysql_insert_id काम सुनिश्चित करने के लिए $ wpdb से link_identifier कैसे निकालें ? क्या $ wpdb से अंतिम-सम्मिलित-पंक्ति आईडी प्राप्त करने का कोई अन्य तरीका है?

धन्यवाद।


लिंक | संसाधन में संग्रहीत है $wpdb->dbh, लेकिन इसे इस रूप में परिभाषित किया गया है protected $dbh;... आप इसे सीधे एक्सेस नहीं कर सकते हैं, इसलिए, नीचे दिए गए उत्तर का उपयोग करें :)
jave.web

जवाबों:


191

$wpdb->insert()डालने के बाद सीधे , यह करें:

$lastid = $wpdb->insert_id;

वर्डप्रेस तरीके से वर्डप्रेस कोड कैसे किया जा सकता है, इसके बारे में अधिक जानकारी। उपरोक्त विवरण यहाँ wpdb वर्ग पृष्ठ पर पाया गया


क्या यह इस तरह है $lastid = $wpdb->$insert_id :?
फ्रांसिस्को कॉर्लेस मोरेल्स

"यह फ़ंक्शन गलत हो जाता है यदि पंक्ति सम्मिलित नहीं की जा सकती। अन्यथा, यह प्रभावित पंक्तियों की संख्या (जो हमेशा 1 होगी) लौटाता है।" प्रेषक: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
12

1
@unbreak - वहां गलत कार्य ... आप wpdb-> इंसर्ट ($ टेबल, $ डेटा, $ फॉर्मेट) के बारे में पढ़ रहे हैं;
jsnfwlr

4
यह जानना भी उपयोगी है कि यदि आप $ wpdb-> क्वेरी का उपयोग करते हैं, तो यह अभी भी Insert_id असाइन करेगा।
डेव स्कॉटी

2
आवश्यक नहीं था, लेकिन मुझे लगता है कि यह थोड़ा सुधारता है, बयान पर प्रकाश डाला गया है, और इंडेंटेशन को हटा दिया गया है क्योंकि यह सिंगल लाइन के लिए आवश्यक नहीं है।
कमाल पाल

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
अनब्रेक करें

1
यह काम करता हैं। $wpdb->queryरिटर्न प्रभावित पंक्तियों की लेन और $wpdb->insert_idपिछले डाला आईडी है। धन्यवाद!
फाबियो मोंटेफसकोलो

यह मेरे लिए बेहतर है, क्योंकि मैं आवेषण पर कब्जा करना चाहता हूं जो अन्यथा एक अद्वितीय स्तंभ पर डुप्लिकेट कॉलम मानों के कारण त्रुटि वापस कर देगा। करने के लिए कोई तरीका नहीं है INSERT IGNOREके साथ $wpdb->insertदुर्भाग्य से।
सोलोमन क्लॉसन

@ प्रकोप - ऐसा लगता है कि यह insert_idमेरे पास लौट रहा है , प्रभावित पंक्तियों की संख्या नहीं।
सोलोमन क्लॉसन

0

कुछ इस तरह से यह भी करना चाहिए:

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

10
यदि दो अलग-अलग प्रक्रियाओं द्वारा लगभग एक ही समय में दो रिकॉर्ड डाले गए तो क्या यह समस्या नहीं होगी? दोनों प्रक्रियाएं एक ही समय में सम्मिलित हो सकती हैं (या एक ही समय में पर्याप्त रूप से बंद हो सकती हैं) ताकि दोनों प्रक्रियाओं के लिए auto_increment समान संख्या वापस कर दे।
माइकल खलीली

0

मुझे इसे डालने के बाद अंतिम आईडी प्राप्त करने की आवश्यकता थी, इसलिए

$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 ऑब्जेक्ट का उपयोग कर रहा है।
jsnfwlr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.