नहीं, यह एक चाल नहीं है। दो बयान:
SELECT * FROM pages WHERE is_visible IN ($visibility)
SELECT * FROM pages WHERE is_visible = $visibility
लगभग समकक्ष हैं। हम देखते हैं कि दो कथनों तुच्छ मामले में बराबर हैं, उदाहरण के लिए, के 1.
एक मूल्य के साथ एक अदिश जब $visibility
है लेकिन बयान गैर तुच्छ मामलों में समान नहीं होते हैं जब $visibility
कुछ और होता है । हम दोनों रूपों के व्यवहार में एक महत्वपूर्ण अंतर देख सकते हैं। विचार करें कि प्रत्येक प्रपत्र के साथ होता है जब $visibility
इन उदाहरण मान युक्त एक स्ट्रिंग है:
SELECT * FROM pages WHERE is_visible IN (1,2,3)
SELECT * FROM pages WHERE is_visible = 1,2,3
SELECT * FROM pages WHERE is_visible IN (1 OR 1=1)
SELECT * FROM pages WHERE is_visible = 1 OR 1=1
:
'1,2,3'
'1 OR 1=1'
'select v.val from vals v'
हम दो रूपों से उत्पन्न परिणामी SQL कथन में एक महत्वपूर्ण अंतर का निरीक्षण
कथन के किसी भी रूप के साथ यहां एक बड़ी चिंता, एसक्यूएल इंजेक्शन की संभावना है। यदि $visibility
एक स्केलर मान होने का इरादा है, तो कथन में एक बाइंड वैरिएबल का उपयोग करना एक और अधिक सुरक्षित दृष्टिकोण है, क्योंकि यह किसी को 'अतिरिक्त' एसक्यूएल वाक्यविन्यास को कथन में स्लाइड करने से बचाता है। (बेशक, बाइंड वैरिएबल का उपयोग करने से सभी एसक्यूएल इंजेक्शन को रोका नहीं जाता है, लेकिन यह एक छेद को बंद करने के लिए उपयुक्त दृष्टिकोण है। बाइंड वैरिएबल का उपयोग करके कम से कम कुछ डीबीएमएस प्लेटफार्मों जैसे ओरेकल पर स्केलेबिलिटी में सुधार होगा।)
विचार क्या होता है जब हम एक बाइंड वैरिएबल (प्लेसहोल्डर) का उपयोग करते हैं, जिसे हम जानते हैं एसक्यूएल सिंटैक्स के रूप में व्याख्या किया जाएगा। हम देखते हैं कि दो कथनों वास्तव में कर रहे बराबर:
SELECT * FROM pages WHERE is_visible IN (?)
SELECT * FROM pages WHERE is_visible = ?
बाँध चर के लिए आपूर्ति की किसी भी मूल्य के लिए।
HTH
सभी को जवाब देने के लिए धन्यवाद। इस मामले में, $ visiblity भरोसेमंद है और हमेशा 0 या 1।तो यह मुझे लगता है कि "कहां ... IN ..." के इस उपयोग की तरह अनावश्यक है! – ledneb
अब हमेशा हमेशा का मतलब नहीं है। डेवलपर 'बस मामले में' पल के लिए तैयारी कर सकता है। –
यागनी। मामले में मामला कभी नहीं आता है। –