यह मुझे पीडीओ के तैयार स्टेटमेंट एमुलेशन में एक (एन अरिपोर्टेड?) बग प्रतीत होता है:
-
कार्यान्वयन का
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);