2011-04-26 14 views
10

जब आप SQL कथन में पैरामीटर बाध्य करते हैं, तो आप PDO::PARAM_STR जैसे पैरामीटर प्रकार प्रदान कर सकते हैं। यदि आप नहीं करते हैं, तो PDO::PARAM_STR पर डिफ़ॉल्ट टाइप करें। प्रत्येक पैरामीटर के प्रकार को विशेष रूप से सेट करने के कारण क्या हो सकते हैं? पीडीओ :: PARAM_STR किसी भी पैरामीटर के साथ काम करता है जैसा कि मुझे कम से कम MySQL में पता है। मुझे लगता है कि पीडीओ :: PARAM_STR के साथ भी बीएलओबी कॉलम के साथ इस्तेमाल किया जा सकता है।पीडीओ में दृढ़ता से पैरामीटर टाइप करने के कारण?

पीडीओ :: PARAM_STR किसी भी SQL इंजेक्शन को पेश नहीं करता है क्योंकि आपके पास अभी भी प्रश्न तैयार हैं।

उत्तर

7

का उपयोग PARAM_STR हमेशा क्योंकि mySQL implicitly converts values to the correct type where it can स्तंभ मानों में काम करने के लिए होता है, लेकिन यह इस क्वेरी में उदाहरण के लिए असफल हो जायेगी:

$limit = 1; 

$dbh->prepare("SELECT * FROM items LIMIT :limit"); 
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
    // Will throw "You have an error in your SQL syntax..." 

एक बिल्कुल PARAM_INT का उपयोग करना चाहिए जहां उपयुक्त हो -, ऊपर की तरह के मामलों के लिए और MySQL के अलावा डेटाबेस इंजन के लिए तैयार करने के लिए जो वे अपेक्षा करते हैं उसमें अधिक सख्त हो सकते हैं।

+0

मेरे द्वारा +1, उत्कृष्ट उदाहरण। यह केवल एसक्यूएल इंजेक्शन नहीं है जिसे टालना चाहिए, उपयोगकर्ता को कच्चे MySQL त्रुटि संदेशों को प्रदर्शित करना वास्तव में आकर्षक नहीं है और न ही पेशेवर है इसलिए डेवलपर ** ** हमेशा टाइप सुरक्षा को लागू करना चाहिए। –

+0

@ एनबी। मेरे लिए यह बहुत उबाऊ है। मैं बार-बार इस बाध्यकारी को दोहराने पर संक्षिप्त कोड पसंद करूंगा –

+0

क्या करने के लिए बहुत उबाऊ है? –

5

व्यक्तिगत रूप से मुझे कोई कारण नहीं देखते हैं, जब तक आप इस विशेषता को निर्धारित किया है के रूप में:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
तो

, इसे सीमित मामले स्वचालित रूप से

का पता लगाने जाएगा वैसे भी मैं एक प्लेसहोल्डर में प्रकार को परिभाषित करना पसंद करते हैं, बाध्यकारी समारोह में नहीं।

हालांकि, पीडीओ के साथ मेरा अनुभव इतना मजबूत नहीं है। मैंने अभी कोशिश की और सादा mysql पर वापस जाने का फैसला किया।

संबंधित मुद्दे