आप% LIKE% SQL कथन को ठीक से कैसे तैयार करते हैं?


34

मैं अभी भी वर्डप्रेस $ wpdb वर्ग का उपयोग करने और इनपुट तैयार करने के लिए LIKE% टेक्स्ट स्टेटमेंट का उपयोग करना चाहूंगा।

SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';

मैंने बिना किसी लाभ के इस तरह की कोशिश की है:

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));

WordPress डेटाबेस वर्ग का उपयोग करके आप% LIKE% SQL कथन को ठीक से कैसे तैयार करते हैं?

जवाबों:


49

$wpdb->esc_likeसमारोह वर्डप्रेस में मौजूद है क्योंकि नियमित डेटाबेस एस्केपिंग बच नहीं करता है %और _अक्षर। इसका मतलब है कि आप उन्हें wpdb::prepare()बिना किसी समस्या के अपने तर्कों में जोड़ सकते हैं । यह भी है कि मैं कोर वर्डप्रेस कोड में क्या देखता हूं :

$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');

तो आपका कोड ऐसा दिखेगा:

$wpdb->prepare(
    "SELECT
        column_1
    FROM
        `{$wpdb->base_prefix}my_table`
    WHERE
        column_2 LIKE %s;",
    '%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);

आप %%अपनी क्वेरी में एक शाब्दिक %( पृष्ठभूमि में wpdb::prepare()उपयोग vsprintf(), जिसमें यह वाक्यविन्यास है ) प्राप्त करने के लिए जोड़ सकते हैं , लेकिन याद रखें कि आपका स्ट्रिंग उद्धृत नहीं किया जाएगा , आपको खुद को उद्धरण जोड़ना होगा (जो आमतौर पर आपको नहीं करना है wpdb::prepare()



@FranciscoCorralesMorales: यह इंगित करने के लिए कि इसके अंदर की हर चीज को एक परिवर्तनशील अभिव्यक्ति माना जाना चाहिए , अन्यथा यह केवल इसे $wpdbदेखेगी, और इसके ->prefixबाद की अनदेखी करेगी ।
Jan Fabry

1
@JanFabry बंद। मैं यह कहने के लिए टिप्पणी को ठीक करूंगा: "... अन्यथा यह सब देखेगा $wpdb->base_prefixmy_tableऔर base_prefixmy_tableसंपत्ति को सिर्फ बदले में देखने की कोशिश करेगा base_prefix
फ्लिम

3

आपको दोगुना करने की आवश्यकता है, ताकि उनके द्वारा विखंडन मार्करों की तरह व्यवहार न किया जाए wpdb->prepare():

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));

पुनश्च यह सुनिश्चित करने के लिए सबसे अच्छा / एकमात्र तरीका नहीं है।


4
याद रखें कि आपको स्ट्रिंग के चारों ओर के उद्धरणों को स्वयं wpdb::prepareजोड़ना होगा%s% , क्योंकि उन्हें केवल उसी के लिए जोड़ा जाएगा जो कि पहले से नहीं है । आपकी क्वेरी का अंतिम भाग होना चाहिए WHERE column_2 LIKE '%%%s%%'
Jan Fabry

2

यह ऐसा करने का एक तरीका है जिसे मैंने जाँच लिया है और यह काम करता है:

$search_text = "%" . $_GET['some_text'] . "%";

$user_count = $wpdb->get_var( 
    $wpdb->prepare( 
        "SELECT COUNT(*) FROM mix_library WHERE ml_setting_name LIKE %s", 
        $search_text 
    ) 
);

अपनी आवश्यकताओं के अनुरूप चर बदलें।


5
आपको %पात्रों का उपयोग करके बच जाना चाहिए like_escape()। देखें: codex.wordpress.org/Class_Reference/…
स्टीफन हैरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.