जब मैं प्रोजेक्ट के लिए टीम लीड (संस्करण 1.0 तक) था, तब मैंने ज़ेंड फ्रेमवर्क में डेटाबेस पैरामीटर और उद्धरण के लिए बहुत सारे कोड लिखे थे।
जहां संभव हो मैंने सर्वोत्तम प्रथाओं को प्रोत्साहित करने की कोशिश की, लेकिन मुझे उपयोग में आसानी के साथ संतुलन बनाना पड़ा।
ध्यान दें कि आप हमेशा Zend_Db_Select
. के स्ट्रिंग मान की जांच कर सकते हैं वस्तु, यह देखने के लिए कि उसने कैसे उद्धृत करने का निर्णय लिया है।
print $select; // invokes __toString() method
इसके अलावा आप Zend_Db_Profiler
. का उपयोग कर सकते हैं Zend_Db
. द्वारा आपकी ओर से चलाए जा रहे SQL का निरीक्षण करने के लिए ।
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
आपके विशिष्ट प्रश्नों के कुछ उत्तर यहां दिए गए हैं:
-
Zend_Db_Select::where('last_name=?', $lname)
मूल्यों को उचित रूप से उद्धृत किया गया है। हालांकि "
?
" एक पैरामीटर प्लेसहोल्डर की तरह दिखता है, इस पद्धति में तर्क वास्तव में उचित रूप से उद्धृत और प्रक्षेपित है। इसलिए यह एक वास्तविक क्वेरी पैरामीटर नहीं है। वास्तव में, निम्नलिखित दो कथन उपरोक्त उपयोग के समान ही क्वेरी उत्पन्न करते हैं:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
हालाँकि, यदि आप एक पैरामीटर पास करते हैं जो एक प्रकार की वस्तु है
Zend_Db_Expr
, तो यह उद्धृत नहीं है। आप SQL इंजेक्शन जोखिमों के लिए ज़िम्मेदार हैं, क्योंकि यह अभिव्यक्ति मानों का समर्थन करने के लिए शब्दशः प्रक्षेपित है:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
उस अभिव्यक्ति का कोई अन्य भाग जिसे उद्धृत या सीमांकित करने की आवश्यकता है, वह आपकी जिम्मेदारी है। उदाहरण के लिए, यदि आप अभिव्यक्ति में किसी भी PHP चर को प्रक्षेपित करते हैं, तो सुरक्षा आपकी जिम्मेदारी है। यदि आपके पास कॉलम नाम हैं जो SQL कीवर्ड हैं, तो आपको उन्हें
quoteIdentifier()
के साथ स्वयं सीमित करना होगा . उदाहरण:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
जब तक आप
AUTO_QUOTE_IDENTIFIERS
को बंद नहीं करते, तब तक तालिका नाम और स्तंभ नाम सीमित कर दिए जाते हैं ।मानों को सही क्वेरी पैरामीटर के रूप में परिचालित किया जाता है (प्रक्षेपित नहीं)। जब तक मान
Zend_Db_Expr
न हो वस्तु, जिस स्थिति में यह शब्दशः प्रक्षेपित है, इसलिए आप भाव याNULL
सम्मिलित कर सकते हैं या जो भी हो। -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
जब तक आप
AUTO_QUOTE_IDENTIFIERS
को बंद नहीं करते, तब तक तालिका नाम और स्तंभ नाम सीमित कर दिए जाते हैं ।मानों को तब तक परिचालित किया जाता है, जब तक कि वे
Zend_Db_Expr
न हों ऑब्जेक्ट्स, जैसा किinsert()
. में है विधि।$where
तर्क बिल्कुल फ़िल्टर नहीं किया गया है, इसलिए आप उसमें किसी भी SQL इंजेक्शन जोखिम के लिए ज़िम्मेदार हैं। आपquoteInto()
. का उपयोग कर सकते हैं उद्धरण को अधिक सुविधाजनक बनाने में मदद करने की विधि।