$ wpdb तालिका कॉलम में NULL नहीं डालेगा


13

जब मैं कुछ इस तरह की कोशिश करता हूं

    $status = NULL;

    $wpdb->update(
            'table',
            array( 
                'status' => $status,
            ), 
            array( 'id' => 1 ) 
    );

'स्थिति' कॉलम में अब मेरे पास एक खाली स्ट्रिंग है '', यह बस इसे NULL पर सेट नहीं करेगा।

स्तंभ निश्चित रूप से पूर्ण हो सकता है। मैंने $ wpdb-> क्वेरी और $ wpdb-> तैयारी का भी परीक्षण किया है और परिणाम समान हैं। क्या मुझसे कुछ गलत हो रही है?

जवाबों:


9

अपडेट करें:

वर्डप्रेस 4.4 के बाद से। यह अब , और , और # 15158 टिकट के तरीकों द्वारा समर्थित है insert, जैसा कि तय किया गया हैupdatereplacedeletewpdb

उस अपडेट के बारे में टिप्पणी करने के लिए @dmsnell को धन्यवाद ।

दूसरी ओर, nullमें समर्थन wpdb::prepare()वर्तमान में के रूप में बंद कर दिया है wontfix टिकट में # 12819

पिछला उत्तर:

NULL समर्थित नहीं:

ऐसा लगता है कि मान को अपडेट करने के लिए आपको अपने स्वयं के कस्टम SQL को लिखना होगा NULL

वर्तमान NULLमें इसके द्वारा समर्थित नहीं है $wpdb->prepare(), जो कि इनपुट को vsprintf प्रारूपण फ़ंक्शन के माध्यम से लेता है ।

इन खुले Trac टिकटों की जाँच करें:

ये टिकट लगभग 4 साल पुराने हैं, इसलिए जब तक यह कोर द्वारा समर्थित नहीं हो जाता, तब तक मैं अपनी सांस नहीं रोकूंगा;

आपको स्रोत पर एक नज़र डालनी चाहिए जैसा कि @s_ha_dum ने सुझाव दिया है।

एक संभावित समाधान:

यदि आप साहसी हैं तो आप queryफ़िल्टर के साथ निम्नलिखित प्रयास कर सकते हैं :

    // Add a filter to replace the 'NULL' string with NULL
    add_filter( 'query', 'wpse_143405_query' );

    global $wpdb;
    $wpdb->update(
        'table',
        array( 
            'status' => 'NULL',
        ), 
        array( 'id' => 1 ) 
    );

    // Remove the filter again:
    remove_filter( 'query', 'wpse_143405_query' );

कहाँ पे

/**
 * Replace the 'NULL' string with NULL
 * 
 * @param  string $query
 * @return string $query
 */

function wpse_143405_query( $query )
{
    return str_ireplace( "'NULL'", "NULL", $query ); 
}

आप 'NULL'शायद '###NULL###'इसके बजाय बदलने के लिए एक अधिक अद्वितीय स्ट्रिंग का उपयोग करना चाहते हैं ।


2
सेटिंग के लिए समर्थन r34737NULL में जोड़ा गया था , इसलिए अब वर्कअराउंड की कोई आवश्यकता नहीं है
dmsnell

3

wpdb->update सभी डेटा प्रकारों के लिए एक स्ट्रिंग में चूक।

प्रारूप
(सरणी | स्ट्रिंग) (वैकल्पिक) $ डेटा में मूल्य के प्रत्येक के लिए मैप किए जाने वाले स्वरूपों की एक सरणी। यदि स्ट्रिंग, उस प्रारूप का उपयोग $ डेटा में सभी मानों के लिए किया जाएगा। यदि छोड़ा गया है, तो $ डेटा के सभी मूल्यों को तार के रूप में माना जाएगा जब तक कि अन्यथा निर्दिष्ट न हो wpdb::$field_types

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

आप एक प्रारूप निर्दिष्ट कर सकते हैं लेकिन स्वीकार्य विनिर्देशक हैं:

संभावित प्रारूप मान : स्ट्रिंग के रूप में% s; % d पूर्णांक के रूप में (पूरी संख्या) और% f फ्लोट के रूप में। (अधिक जानकारी के लिए नीचे देखें।) यदि छोड़ा गया है, तो सभी मूल्य $ में जहां तार के रूप में माने जाएंगे।

http://codex.wordpress.org/Class_Reference/wpdb#UPDATE_rows

आप स्रोत के माध्यम से पढ़ सकते हैं और प्रक्रिया का पता लगा सकते हैं।

यदि आप wpdb->prepareविधि को हैक करते हैं (एक देव सर्वर पर जो समय-समय पर साफ हो जाता है :)) वापसी से ठीक पहले SQL को डंप करने के लिए, आप देखेंगे कि प्रतिस्थापन पहले होता है wpdb->prepare:

string(48) "UPDATE `table` SET `status` = %s WHERE `id` = %s"

हालाँकि, जैसा कि @birgire द्वारा सुझाया गया है, यह अच्छी तरह से prepareउस सीमा के लिए प्रेरित हो सकता है, जिसने उस प्रतिस्थापन को प्रेरित किया।


2

मैं आगे यह बताना चाहूंगा कि WP 4.4 और इससे आगे यह कैसे किया जाए। आपको डेटा और प्रारूप तत्व दोनों को सेट करने की आवश्यकता है जिसे आप PHP 'null' मान के लिए अशक्त होना चाहते हैं।

टिकट # 15158 में उदाहरण इस प्रकार है:

$wpdb->update($ttable, 
              [
                'user_id' => NULL,
                'status' => 'available',
                'update_time' => $now->format('Y-m-d H:i:s')
              ], [
                'therapist_id' => $therapist_id,
                'user_id' => $user_id,
                'start_time' => $ub['start_time']
              ], [
                 NULL,
                 '%s',
                 '%s'
              ], [
                 '%d',
                 '%d',
                 '%s'
            ]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.