दिलचस्प पोस्ट
गिट चेरी लेने और डेटामोडेल अखंडता क्या गतिशील रूप से एक फिल्टर बनाने के लिए Linq का उपयोग करने वाला एक पैटर्न है? जावा में 2 दशमलव स्थानों तक गोल? एक मैट्रिक्स को एक और मैट्रिक्स के साथ क्रमबद्ध करें द्वारा कारण: java.lang.UnsupportedOperationException: आयाम में कनवर्ट नहीं किया जा सकता: प्रकार = 0x1 IMEI को आईफोन पर कैसे प्राप्त करें? मॉडल में बूटस्ट्रैप खुली छवि सेलेनियम वेबड्रिवर का उपयोग करके ब्राउज़रों में <input type = file> पर कैसे क्लिक करें? एंड्रॉइड में एक स्ट्रिंग और सबस्क्रिप्ट Sp_reset_connection क्या करता है? पांडस एक श्रृंखला / डेटाफ्रेम कॉलम के सशर्त निर्माण फ़ाइल के रूप में जावा संसाधन एक पॉलीविरिएडिक हैस्केल फ़ंक्शन कैसे बनाएं? कॉर्डोबा प्लेटफॉर्म एंड्रॉइड लक्ष्य को जोड़ने के दौरान एंड्रॉइड काम नहीं कर रहा है सीएसएस में 'होवर' का उपयोग कैसे करें

पीडीओ में PHP में, अंतिम एसक्यूएल पैरामीट्रीज की गई क्वेरी को कैसे जांचें?

PHP में, जब MySQL डेटाबेस को पीडीओ के साथ पैरामीट्रिज्ड क्वेरी से एक्सेस करते हैं, तो आप अंतिम प्रश्न (सभी टोकनों को बदलने के बाद) कैसे जांच सकते हैं?

क्या यह जांचने का कोई तरीका है कि डेटाबेस द्वारा वास्तव में निष्पादित किया जाता है?

वेब के समाधान से एकत्रित समाधान "पीडीओ में PHP में, अंतिम एसक्यूएल पैरामीट्रीज की गई क्वेरी को कैसे जांचें?"

इसलिए मुझे लगता है कि रिकॉर्ड के लिए पूर्ण समाधान पाने के लिए मैं अपने खुद के प्रश्न का जवाब दूँगा। लेकिन बेन जेम्स और कैलाश बदु को धन्यवाद देना होगा जो इसके लिए सुराग प्रदान करते हैं।

संक्षिप्त जवाब
जैसा कि बेन जेम्स द्वारा वर्णित है: नहीं
पूर्ण एसक्यूएल क्वेरी PHP पक्ष पर मौजूद नहीं है, क्योंकि क्वेरी-टू-टोकन और मापदंडों को डेटाबेस से अलग से भेजा जाता है। केवल डेटाबेस की तरफ पूरी क्वेरी मौजूद है।

यहां तक ​​कि PHP पक्ष पर टोकनों को बदलने के लिए एक फ़ंक्शन बनाने की कोशिश करने से प्रतिस्थापन प्रक्रिया की गारंटी नहीं होगी जो एसक्यूएल एक के समान है (टोकन-प्रकार, बाँध वैल्यू बनाम बाईंदपाम, जैसे मुश्किल सामान …)

वैकल्पिक हल
यह वह जगह है जहां मैं कैलाश Badu के जवाब पर विस्तृत। सभी SQL क्वेरी लॉग करके, हम देख सकते हैं कि वास्तव में सर्वर पर क्या चल रहा है। MySQL के साथ, यह my.cnf (या my.ini को Wamp सर्वर के साथ मेरे मामले में) अपडेट करके किया जा सकता है, और इस तरह एक पंक्ति जोड़कर:

 log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME] 

बस इस उत्पादन में नहीं चला!

पैरामीट्रेट किए गए मानों के साथ तैयार बयानों का उपयोग करना, बस एसक्यूएल की एक स्ट्रिंग बनाने के लिए एक और तरीका नहीं है। आप डेटाबेस पर एक तैयार कथन बनाते हैं, और फिर पैरामीटर मान अकेले भेजते हैं।

तो संभवत: डेटाबेस को क्या भेजा जाता है एक PREPARE ... , तब SET ... और अंत में EXECUTE ...

आप कुछ एसक्यूएल स्ट्रिंग जैसे SELECT * FROM ... प्राप्त करने में सक्षम नहीं होंगे, भले ही यह समकक्ष परिणाम उत्पन्न करे, क्योंकि ऐसा कोई भी प्रश्न कभी भी डाटाबेस में नहीं भेजा गया था

आप PDOStatement->debugDumpParams का उपयोग करने में सक्षम हो सकते हैं PHP प्रलेखन देखें।

मैं सटीक क्वेरी देखने के लिए प्रश्न लॉग को जांचता हूं जिसे तैयार कथन के रूप में निष्पादित किया गया था।

मैंने शुरू में पीडीओ पर नज़र रखने के लिए लॉगिंग चालू करना टाल दिया क्योंकि मैंने सोचा था कि यह परेशानी होगी, लेकिन यह बिल्कुल मुश्किल नहीं है। आपको MySQL को रिबूट करने की आवश्यकता नहीं है (5.1.9 के बाद):

PhpMyAdmin या किसी अन्य वातावरण में इस SQL ​​निष्पादित करें जहां आपके उच्च डीबी विशेषाधिकार हो सकते हैं:

 SET GLOBAL general_log = 'ON'; 

एक टर्मिनल में, अपनी लॉग फ़ाइल को पूंछ करें। मेरा यहाँ था:

 >sudo tail -f /usr/local/mysql/data/myMacComputerName.log 

आप इस टर्मिनल कमांड के साथ अपनी mysql फ़ाइलों को खोज सकते हैं:

 >ps auxww|grep [m]ysqld 

मैंने पाया कि पीडीओ सब कुछ बचता है, इसलिए आप लिख नहीं सकते

 $dynamicField = 'userName'; $sql = "SELECT * FROM `example` WHERE `:field` = :value"; $this->statement = $this->db->prepare($sql); $this->statement->bindValue(':field', $dynamicField); $this->statement->bindValue(':value', 'mick'); $this->statement->execute(); 

क्योंकि यह बनाता है:

 SELECT * FROM `example` WHERE `'userName'` = 'mick' ; 

जिसने कोई त्रुटि नहीं बनाई, सिर्फ एक खाली परिणाम इसके बजाय मुझे उपयोग करने की आवश्यकता है

 $sql = "SELECT * FROM `example` WHERE `$dynamicField` = :value"; 

लेना

 SELECT * FROM `example` WHERE `userName` = 'mick' ; 

जब आपको निष्पादित किया जाता है:

 SET GLOBAL general_log = 'OFF'; 

या फिर आपके लॉग भारी मिलेगा

मैं उस वास्तविक प्रश्न को प्रिंट करने के लिए क्या किया, वह थोड़ा जटिल है, लेकिन यह काम करता है 🙂

विधि में जो मेरे स्टेटमेंट में वैरिएबल प्रदान करता है I में एक और चर है जो इस तरह से थोड़ा सा दिखता है:

 $this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt); 

कहा पे:
$column मेरी टोकन है
$param वास्तविक टोकन को सौंपा जा रहा मूल्य है
$this->fullStmt मेरा प्रिंट केवल कथन के साथ प्रतिस्थापित टोकन है

असली पीडीओ असाइनमेंट के होने पर ये क्या करती है जब यह मूल्यों के साथ आसानी से बदल जाता है।

मुझे आशा है कि मैंने आपको भ्रमित नहीं किया और कम से कम आपको सही दिशा में बताया।

सबसे आसान तरीका यह किया जा सकता है mysql निष्पादन लॉग फ़ाइल पढ़ कर और आप ऐसा कर सकते हैं कि रनटाइम में

यहां एक अच्छी व्याख्या है:

MySQL पर निष्पादित अंतिम क्वेरी कैसे दिखाएं?

मुझे विश्वास नहीं है कि आप कर सकते हैं, हालांकि मुझे आशा है कि कोई मुझे गलत साबित करेगा।

मुझे पता है कि आप क्वेरी को प्रिंट कर सकते हैं और इसकी स्ट्रिंग विधि आपको बदली बिना एसक्यूएल दिखाएगी। यदि आप जटिल क्वेरी स्ट्रिंग का निर्माण कर रहे हैं, तो यह आसान हो सकता है, लेकिन यह आपको मूल्यों के साथ पूर्ण क्वेरी नहीं देता है

मुझे लगता है कि अंतिम प्रश्न पाठ को देखने का सबसे आसान तरीका जब आप पीडो का उपयोग करते हैं तो विशेष त्रुटि और त्रुटि संदेश देखने के लिए मुझे नहीं पता कि यह कैसे करना है, लेकिन जब मैं वाईडीई ढांचा में एसक्यूएल त्रुटि करता हूं जो पीडो का उपयोग करता है तो मुझे प्रश्न टेक्स्ट मिल सकता है