मुझे लगता है कि आप का मतलब है कि आप अंतिम एसक्यूएल क्वेरी चाहते हैं, जिसमें पैरामीटर मान इसमें इंटरपोल किए गए हैं। मैं समझता हूं कि यह डिबगिंग के लिए उपयोगी होगा, लेकिन यह तैयार किए गए बयानों के काम करने का तरीका नहीं है। पैरामीटर क्लाइंट-साइड पर तैयार स्टेटमेंट के साथ संयुक्त नहीं हैं, इसलिए पीडीओ को अपने मापदंडों के साथ संयुक्त क्वेरी स्ट्रिंग तक कभी भी पहुंच नहीं होनी चाहिए।
SQL कथन डेटाबेस सर्वर पर भेजा जाता है जब आप तैयारी करते हैं (), और जब आप निष्पादित करते हैं तो पैरामीटर अलग से भेजे जाते हैं। MySQL का सामान्य क्वेरी लॉग आपके द्वारा निष्पादित () के बाद प्रक्षेपित मानों के साथ अंतिम SQL दिखाता है। नीचे मेरे सामान्य क्वेरी लॉग का एक अंश है। मैंने mysql CLI से प्रश्नों को चलाया, PDO से नहीं, लेकिन सिद्धांत समान है।
081016 16:51:28 2 Query prepare s1 from 'select * from foo where i = ?'
2 Prepare [2] select * from foo where i = ?
081016 16:51:39 2 Query set @a =1
081016 16:51:47 2 Query execute s1 using @a
2 Execute [2] select * from foo where i = 1
यदि आप PDO विशेषता PDO :: ATTR_EMULATE_PREPARES सेट करते हैं, तो आप जो चाहें प्राप्त कर सकते हैं। इस मोड में, पीडीओ SQL क्वेरी में मापदंडों को प्रक्षेपित करता है और जब आप निष्पादित करते हैं तो पूरी क्वेरी भेजता है ()। यह एक सच्ची तैयार क्वेरी नहीं है। आप निष्पादित () से पहले SQL स्ट्रिंग में चर को प्रक्षेपित करके तैयार प्रश्नों के लाभों को दरकिनार करेंगे।
@Afilina से पुनः टिप्पणी करें:
नहीं, निष्पादन के दौरान पाठीय SQL क्वेरी पैरामीटर के साथ संयुक्त नहीं है । तो आपको दिखाने के लिए पीडीओ के लिए कुछ भी नहीं है।
आंतरिक रूप से, यदि आप PDO :: ATTR_EMULATE_PREPARES का उपयोग करते हैं, तो PDO SQL क्वेरी की एक प्रतिलिपि बनाता है और तैयार करने और निष्पादित करने से पहले इसमें पैरामीटर मान इंटरपोल करता है। लेकिन पीडीओ इस संशोधित SQL क्वेरी को उजागर नहीं करता है।
PDOStatement ऑब्जेक्ट के पास एक प्रॉपर्टी $ क्वेरीस्ट्रिंग है, लेकिन यह केवल PDOStatement के लिए कंस्ट्रक्टर में सेट है, और यह तब अपडेट नहीं किया जाता है जब क्वेरी को मापदंडों से दोबारा लिखा जाता है।
यह पीडीओ के लिए एक उचित सुविधा अनुरोध होगा कि वह उनसे लिखित प्रश्न को उजागर करने के लिए कहे। लेकिन जब तक आप पीडीओ का उपयोग नहीं करते हैं, तब तक आपको "पूर्ण" क्वेरी नहीं दी जाएगी: ATTR_EMULATE_PREPARES।
यही कारण है कि मैं MySQL सर्वर के सामान्य क्वेरी लॉग का उपयोग करने के ऊपर वर्कअराउंड दिखाता हूं, क्योंकि इस मामले में भी पैरामीटर प्लेसहोल्डर्स के साथ एक तैयार क्वेरी को सर्वर पर फिर से लिखा जाता है, जिसमें पैरामीटर मान क्वेरी स्ट्रिंग में बैकफिल्ड होते हैं। लेकिन यह केवल लॉगिंग के दौरान किया जाता है, क्वेरी निष्पादन के दौरान नहीं।