Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पीडीओ तैयार बयानों से कच्ची एसक्यूएल क्वेरी स्ट्रिंग प्राप्त करना

मुझे लगता है कि आपका मतलब है कि आप अंतिम SQL क्वेरी चाहते हैं, जिसमें पैरामीटर मान इंटरपोलेटेड हैं। मैं समझता हूं कि यह डिबगिंग के लिए उपयोगी होगा, लेकिन यह तैयार बयानों के काम करने का तरीका नहीं है। पैरामीटर्स को क्लाइंट-साइड पर तैयार किए गए स्टेटमेंट के साथ नहीं जोड़ा जाता है, इसलिए पीडीओ को अपने पैरामीटर्स के साथ संयुक्त क्वेरी स्ट्रिंग तक कभी भी एक्सेस नहीं करना चाहिए।

जब आप तैयार () करते हैं तो SQL स्टेटमेंट डेटाबेस सर्वर को भेजा जाता है, और जब आप निष्पादित () करते हैं तो पैरामीटर अलग से भेजे जाते हैं। MySQL का सामान्य क्वेरी लॉग आपके द्वारा निष्पादित () के बाद प्रक्षेपित मानों के साथ अंतिम SQL दिखाता है। नीचे मेरे सामान्य क्वेरी लॉग का एक अंश है। मैंने पीडीओ से नहीं, MySQL सीएलआई से प्रश्नों को चलाया, लेकिन सिद्धांत समान है।

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 स्ट्रिंग में चरों को प्रक्षेपित करके तैयार प्रश्नों के लाभों को दरकिनार कर देंगे।

@afilina से दोबारा टिप्पणी करें:

नहीं, टेक्स्ट वाली SQL क्वेरी नहीं है निष्पादन के दौरान मापदंडों के साथ संयुक्त। इसलिए पीडीओ के पास आपको दिखाने के लिए कुछ भी नहीं है।

आंतरिक रूप से, यदि आप PDO::ATTR_EMULATE_PREPARES का उपयोग करते हैं, तो PDO SQL क्वेरी की एक प्रति बनाता है और तैयारी और निष्पादन करने से पहले उसमें पैरामीटर मानों को प्रक्षेपित करता है। लेकिन पीडीओ इस संशोधित SQL क्वेरी को उजागर नहीं करता है।

PDOStatement ऑब्जेक्ट में एक संपत्ति $queryString है, लेकिन यह केवल PDOStatement के लिए कंस्ट्रक्टर में सेट है, और जब क्वेरी को पैरामीटर के साथ फिर से लिखा जाता है तो इसे अपडेट नहीं किया जाता है।

पीडीओ के लिए यह एक उचित सुविधा अनुरोध होगा कि वे उन्हें फिर से लिखी गई क्वेरी को उजागर करने के लिए कहें। लेकिन जब तक आप PDO::ATTR_EMULATE_PREPARES का उपयोग नहीं करते हैं, तब तक वह आपको "पूर्ण" क्वेरी नहीं देगा।

यही कारण है कि मैं MySQL सर्वर के सामान्य क्वेरी लॉग का उपयोग करने के ऊपर वर्कअराउंड दिखाता हूं, क्योंकि इस मामले में पैरामीटर प्लेसहोल्डर के साथ एक तैयार क्वेरी भी सर्वर पर फिर से लिखी जाती है, जिसमें पैरामीटर मान क्वेरी स्ट्रिंग में बैकफिल्ड होते हैं। लेकिन यह केवल लॉगिंग के दौरान किया जाता है, क्वेरी निष्पादन के दौरान नहीं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL स्ट्रिंग बदलें

  2. MySQL में डेटाबेस का कोलेशन कैसे दिखाएं

  3. अनुक्रमणिका का उपयोग करके InnoDB पर COUNT(*) प्रदर्शन का अनुकूलन कैसे करें

  4. MySQL में दो तिथियों के बीच अंतर की गणना कैसे करें

  5. MySQL ATAN () फ़ंक्शन - एक मान (या मान) की चाप स्पर्शरेखा लौटाएं