WPDB सम्मिलित करें या यदि अद्यतन मौजूद है


21

मैं सामान्य तौर पर WPDB या SQL से परिचित नहीं हूं, लेकिन मेरे पास अपनी परियोजना के लिए एक कस्टम टेबल है और मैं इसके लिए कुछ मेटाडेटा असाइन करने का प्रयास कर रहा हूं। यदि मैं ऐसा करना चाहता / चाहती हूं कि यदि कोई पंक्ति मौजूद है, तो उसे अपडेट करें और यदि सम्मिलित नहीं करते हैं। मैंने WPDB कोड में इन्सर्ट और अपडेट दोनों को पढ़ा है, लेकिन वास्तव में "या तो" स्थिति में नहीं गया। मुझे लगा कि मैं अपडेट के साथ काम कर सकता हूं, इसलिए मेरा कोड अब तक इस तरह दिखता है:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

क्या वर्डप्रेस में "IF मौजूद अपडेट, ELSE इन्सर्ट" जैसा कुछ भी है, या क्या मुझे इसे प्राप्त करने के लिए कस्टम SQL चलाने की आवश्यकता है, या क्या मुझे डेटाबेस को क्वेरी करने की आवश्यकता है, यह देखने के लिए कि क्या कोई ID मेरे टेबल में मौजूद है, यह तय करने के लिए कि क्या अपडेट करना है यह या इसे सम्मिलित करें?

जवाबों:


23

सबसे पहले, आप prepareगलत तरीके से उपयोग कर रहे हैं । आप इस तरह से $wpdb->updateलिपटे हुए $wpdb->prepareहैं। यह काम नहीं करेगा। वास्तव में, आप updateएकल तर्क पास कर रहे हैं - का आउटपुट prepare। निम्नलिखित की तरह कुछ सरल करने की कोशिश करो और आप देखेंगे कि क्यों काम नहीं करेगा:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

और आपके लिए $wpdb->update()चलता prepareहै

दूसरा, अगर यह मैं था, तो मैं हेल्पर फंक्शन को छोड़ देता हूं और एक उचित ON DUPLICATE KEY UPDATEक्वेरी लिखता हूं :

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

यह मानता है कि post_idएक UNIQUEसूचकांक है याPRIMARY KEY । यदि आपकी तालिका संरचना वही है जो मुझे लगता है कि यह है, तो डेटाबेस को संभाल लें।


यह बहुत उपयोगी था ... आपके समय के लिए धन्यवाद s_ha_dum!
जेक

मेरे लिए गलत रिटर्न तैयार करें - कोई अन्य डीबी त्रुटियां नहीं। यदि phpmyadmin में मैन्युअल रूप से क्वेरी चल रही है तो यह अपेक्षित रूप से काम करता है। यह भी जाँच की कि चर वे क्या हैं .. कोई विचार?
ट्रोनासिस

1
क्या होगा अगर post_id प्राथमिक कुंजी नहीं है?
माइक कोरमेन्डी

18

क्या आपने कोशिश की है $wpdb->replace? WP कोडेक्स के अनुसार:

यदि यह मौजूद है या नहीं तो किसी तालिका में एक पंक्ति को एक तालिका में बदलें, यदि पंक्ति पहले से मौजूद नहीं थी।

मैंने खुद को कुछ प्लगइन्स में आज़माया है और यह काम करता है जब अद्वितीय आईडी डुप्लिकेट त्रुटियों, आदि से बचने की कोशिश करता है।

कोडेक्स में अधिक जानकारी


इसने मेरे लिए काम किया, जबकि कस्टम क्वेरी ने नहीं किया - प्रतिस्थापन का उल्लेख करने के लिए धन्यवाद ()
ट्रैनाओसिस

यह प्रश्न का सही उत्तर है।
टायलर जोन्स

6
यह ध्यान देने योग्य है कि $wpdb->replaceयह पूरे रिकॉर्ड का विनाशकारी अधिलेखित है, जबकि $wpdb->updateकेवल $dataसरणी में शामिल विशिष्ट क्षेत्रों को अपडेट करता है
मैथ्यूली

0

यदि पंक्ति पहले मौजूद है, तो आपको जांचना चाहिए।

सबसे अधिक संभावना है कि आप जिस पंक्ति को अपडेट करने का प्रयास कर रहे हैं, उसके लिए आईडी या प्राथमिक कुंजी प्राप्त करने का प्रयास करना चाहते हैं, $wpdb->updateअगर ऐसा होता है या $wpdb->insertनहीं करता है


14
यह देखने के लिए कि आईडी या प्राथमिक कुंजी मौजूद है या नहीं, इसकी जांच कैसे की जाती है। यह लगभग सवाल को दोहराने जैसा है।
जेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.