क्या मुझे wpdb की तैयारी का उपयोग करना चाहिए?


28

मैं एसक्यूएल के लिए नया हूं और सोच रहा हूं कि क्या मुझे wpdb->prepareनिम्नलिखित क्वेरी के लिए उपयोग की जाने वाली तालिका के लिए उपयोग करने की आवश्यकता है

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

क्या मुझे prepareयहां उपयोग करने की आवश्यकता है? मुझे यह कैसे करना है?

चियर्स

जवाबों:


33

यह हमेशा उपयोग करने के लिए सबसे अच्छा अभ्यास है, prepareलेकिन इसका मुख्य उपयोग SQL इंजेक्शन हमलों के खिलाफ रोकने के लिए है, और चूंकि उपयोगकर्ताओं / आगंतुकों से कोई इनपुट नहीं है या वे क्वेरी को प्रभावित नहीं कर सकते हैं, तो यह आपके वर्तमान उदाहरण में कोई समस्या नहीं है।

लेकिन जैसा मैंने पहले कहा कि इसका उपयोग करना सबसे अच्छा अभ्यास है और एक बार जब आप इसका उपयोग करना शुरू कर देते हैं तो आप इसे कभी नहीं रोकते हैं, इसलिए आपके उदाहरण में आप इसका उपयोग कर सकते हैं जैसे:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

कोडेक्स में इसका उपयोग कैसे करें, इसके बारे में अधिक पढ़ने के लिए


हाय @Bainternet, इस तरह के एक स्पष्ट स्पष्टीकरण के लिए धन्यवाद - किसी कारण से जब मैं आपके कोड की कोशिश करता हूं तो यह एक खाली सरणी देता है। मैंने टाइपोस के लिए जाँच की और दोगुनी जाँच की है। यदि मैं बिना तैयारी के क्वेरी करता हूं तो मुझे एरे मिलता है। मुझे समझ नहीं आता कि यह काम क्यों नहीं कर रहा है ..!
रिचर्ड स्वीनी

अजीब। मैंने एक ही कोड का उपयोग किसी अन्य क्वेरी के साथ करने की कोशिश की है: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); और यह बहुत अच्छा काम करता है! यकीन नहीं होता कि ऐसा क्यों होगा। लेकिन मैं इसे अब किसी भी मामले में प्राप्त करता हूं!
रिचर्ड स्वीनी

6
एकल उद्धरणों में तालिका नाम संलग्न करने से काम नहीं चलेगा। सामान्य बच बैकटिक्स के साथ है, इसलिए आपकी क्वेरी को इस तरह देखना चाहिए :। आप दोहरे उद्धरण समर्थन को सक्षम कर सकते हैं, लेकिन फिर इसे इस तरह देखना होगा :। SELECT * FROM `wp_my_custom_table`SELECT * FROM "wp_my_custom_table"
जान फेब्री

3
मैं इस जवाब से सहमत नहीं हूं। जब फ़ंक्शन पहले से ही सब कुछ से बच जाता है तो आपको क्यों बचना चाहिए? आपको लगता है कि वर्डप्रेस कोर से भागने का फैसला करेगा? इसके अलावा तालिका नाम से बचने का कोई मतलब नहीं है :) क्योंकि यह हार्डकोड है और आपको पता है कि यह ठीक है। मुझे लगता है कि यह सिर्फ उदाहरण है, लेकिन वैसे भी तालिका के नामों से बच नहीं है, जब टेबल के नामों के साथ तैयारी का उपयोग करना मेरे पास समस्या है तो यह बैकटिक्स और एसक्यूएल चड्डी त्रुटि जोड़ता है।
टॉमीक्सॉफ्ट

@Tommixoft यदि आप उत्तर को फिर से पढ़ते हैं, तो आप देखेंगे कि आप वास्तव में वही बात कहेंगे जो मैंने कहा था, और यह कि तालिका का नाम एक उदाहरण है।
7

0

जब आप तैयारी का उपयोग करते हैं तो यह SQL इंजेक्शन भेद्यताओं से कोड की सुरक्षा करता है।

यहाँ कोड का उपयोग करने के लिए आपको संशोधित करने की आवश्यकता है prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );

0

आपके मामले में SQL इंजेक्शन हमला संभव नहीं है । आपके कोड को अतिरिक्त सुरक्षा की आवश्यकता नहीं है क्योंकि उपयोगकर्ता इनपुट का उपयोग नहीं करते हैं जैसे: पोस्ट, प्राप्त करें, अनुरोध, कुकी।

जब सर्वर संसाधनों को बचाने के लिए आवश्यक नहीं है, तो जटिल फ़ंक्शन का उपयोग न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.