यह मुझे पीडीओ के तैयार स्टेटमेंट एमुलेशन में एक (एन अरिपोर्टेड?) बग प्रतीत होता है:
-
कार्यान्वयन का
PDOStatement::execute()
आखिरकार आह्वानpdo_parse_params()
; -
कि, बदले में, मानों को कोट/एस्केप करने का प्रयास करता है प्रासंगिक पैरामीटर के डेटा प्रकार के आधार पर (जैसा कि
$data_type
. द्वारा दर्शाया गया है)PDOStatement::bindValue()
के तर्क औरPDOStatement::bindParam()
—सभी पैरामीटर$input_parameters
. के रूप में दिए गए हैं सेPDOStatement::execute()
PDO::PARAM_STR
. के रूप में माना जाता है , जैसा कि उस फ़ंक्शन के दस्तावेज़ीकरण में बताया गया है); -
स्ट्रिंग-टाइप किए गए मान कॉलिंग<द्वारा एस्केप/उद्धृत किए जाते हैं /ए> प्रासंगिक डेटाबेस ड्राइवर का
quoter()
विधि चाहे वेnull
हों या नहीं :PDO_MySQL के मामले में, यहmysql_handle_quoter()
, जो (अंततः) मान कोmysqlnd_cset_escape_quotes()
याmysql_cset_escape_slashes()
, सर्वर केNO_BACKSLASH_ESCAPES
के आधार पर एसक्यूएल मोड; -
एक
null
दिया गया है तर्क, वे दोनों कार्य एक खाली स्ट्रिंग लौटाते हैं।
मेरी राय है कि, पैरामीटर पर स्विच करने से पहले टाइप करें
(उपरोक्त चरण 2 में), pdo_parse_params()
टाइप को PDO::PARAM_NULL
. पर सेट करना चाहिए यदि मान null
है . हालांकि, कुछ लोग यह तर्क दे सकते हैं कि यह null
. के प्रकार-विशिष्ट प्रबंधन को रोक देगा जहां उपयुक्त हो, उस स्थिति में स्ट्रिंग केसए> (उपरोक्त चरण 3 में) निश्चित रूप से null
को संभालना चाहिए ड्राइवर के quoter()
. पर कॉल के साथ आगे बढ़ने से पहले मान विधि।
एक अंतरिम समाधान के रूप में, तैयार कथन अनुकरण को अक्षम करना आमतौर पर वैसे भी सर्वोत्तम होता है:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);