2010-02-20 14 views
16

मैं PHP में mysqli के साथ तैयार कथन का उपयोग करने के लिए सीखने पर काम कर रहा हूं और आमतौर पर, यदि मुझे किसी क्वेरी के साथ समस्या हो रही है तो मैं इसे स्क्रीन पर गूंजता हूं ताकि यह देखने के लिए कि यह पहले चरण के जैसा कैसा दिखता है।मैं तैयार कथन की सामग्री कैसे देख सकता हूं?

मैं कैसे एक तैयार बयान के साथ ऐसा कर सकते हैं?

मैं SQL विवरण देखने के लिए के बाद चर प्रतिस्थापित कर रहे हैं चाहते हैं।

उत्तर

16

का उपयोग करते हुए तैयार बयान:

  • जब आप बयान तैयार है, यह MySQL सर्वर
  • को भेजा जाता है जब आप बाँध चर + बयान निष्पादित, केवल चर MySQL सर्वर
  • को भेजे जाते हैं
  • और बयान + बाध्य चर MySQL सर्वर पर क्रियान्वित कर रहे हैं - बिना इसे फिर से कर रही है "तैयारी" हर बार बयान निष्पादित किया जाता है (यही वजह है कि तैयार बयानों प्रदर्शन के लिए अच्छा हो सकता है जब एक ही बयान कई क्रियान्वित किया जाता है बार)

PHP पक्ष पर एक SQL क्वेरी का कोई "भवन" नहीं है, इसलिए, वास्तव में उस क्वेरी को प्राप्त करने का कोई तरीका नहीं है।

इसका मतलब है अगर आप एक SQL क्वेरी देखना चाहते हैं, आप उपयोग करना, ठीक है, एसक्यूएल प्रश्नों, और नहीं तैयार बयान है।

+0

अच्छी तरह से थोड़ा कष्टप्रद = \ आपको लगता है कि निष्पादित कथन – Stomped

+0

लाने का कोई तरीका है यदि आपको PHP पक्ष पर इसकी आवश्यकता है, मुख्य रूप से डिबगिंग कारणों के लिए, मुझे लगता है कि आप SQL को फिर से बना सकते हैं क्वेरी जो कथन के निष्पादन के बराबर है: आपको प्लेसहोल्डर को चर के मानों से प्रतिस्थापित करना होगा * (डेटा से बचने, निश्चित रूप से, आपको छोड़ दिया जाएगा) * ;;; यदि आपको अक्सर इसकी आवश्यकता है, तो आपको एक ऐसा फ़ंक्शन लिखने में सक्षम होना चाहिए जो आपके लिए यह करता है; अन्यथा, 'var_dump' में से कुछ को पहले से ही यह देखने में मदद करनी चाहिए कि MySQL सर्वर पर कौन सा डेटा भेजा गया है। –

+1

@stomped बिंदु यह है कि कोई निष्पादित कथन नहीं है। वह कदम पूरी तरह से छोड़ दिया गया है। – troelskn

0

पास्कल मार्टिन (+1) के साथ सहमत होने से मैं डीबगिंग के लिए एक और तकनीक का सुझाव देता हूं: var_dump() या कथन में डालने वाले प्रत्येक चर को लॉग इन करें, इस तरह आपको यह पता लगाने में सक्षम होना चाहिए कि यह गलत डेटा है या तार्किक रूप से गलत है एसक्यूएल।

10
  • आप PDOStatement->debugDumpParams उपयोग कर सकते हैं तैयार बयान के बारे में कुछ जानकारियां प्राप्त करने के लिए (मामले में आप pdo उपयोग कर रहे हैं)।
  • तैयार बयान logged in MySQL's general log हैं:
तैयार बयान के लिए कि mysql_stmt_prepare() और mysql_stmt_execute() सी एपीआई कार्यों के साथ क्रियान्वित कर रहे हैं, सर्वर तैयार करें और सामान्य क्वेरी लॉग करने के लिए लाइनों निष्पादित ताकि आप बता सकते हैं लिखते हैं जब बयान तैयार और निष्पादित होते हैं।
[...] सर्वर सामान्य क्वेरी लॉग में निम्न पंक्तियां लिखते हैं:
तैयार [1] का चयन करें?
निष्पादित [1] का चयन करें 3
सक्रिय general log डीबगिंग उद्देश्यों के लिए

तो और है कि फाइल पर नजर रखना।

संपादित करें: ओह, सवाल एक [mysqli] टैग है ... पूरी तरह से है कि अनदेखी की।
यदि कथन निष्पादित नहीं किया गया है तो क्या आपने (डबल/ट्रिपल) चेक किया है कि रास्ते में कोई त्रुटि नहीं हुई है?

echo "<pre>Debug: start</pre>\n"; 

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test'); 
if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); 
} 

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))'); 
if (false=== $result) { 
die('error : '. $mysqli->error); 
} 

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)'); 
if (false===$stmt) { 
    die ('prepare() failed: ' . $mysqli->error); 
} 

$result = $stmt->bind_param('i', $x); 
if (false===$result) { 
    die('bind_param() failed'); 
} 

$x = 1; 
$result = $stmt->execute(); 
if (false===$result) { 
    die('execute() failed: '.$stmt->error); 
} 

echo "<pre>Debug: end</pre>\n"; 
2

मैं आमतौर पर ऐसा करता हूं जब मुझे पैरामीटर के साथ एक तैयार एसक्यूएल डीबग करने की आवश्यकता होती है।

का उदाहरण तैयार करने और निष्पादित करें:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')"; 
$prep = ibase_prepare($sql) or die("Error"); 
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true; 
           ^^^^^^^^^^^^^^^^^^^^^^^ 

वाक्य यह है की जिसके परिणामस्वरूप एसक्यूएल डिबग करने के लिए आसान तरीका:

printf(str_replace('?', '%s', $sql), $param1, $param2, ....); 
             ^^^^^^^^^^^^^^^^^^^^^^ 

आप केवल एक printf करने के लिए, की जगह की आवश्यकता है? तैयार एसक्यूएल स्ट्रिंग पर एक% s द्वारा। printf सभी को एक स्ट्रिंग के रूप में समझाएगा, प्रत्येक पैरामीटर को प्रत्येक प्रतिस्थापित% s पर रखने के रूप में ले जाएगा।

0

मैंने हाल ही में इस परियोजना को संगीतकार एकीकरण, इकाई परीक्षण और संदर्भ द्वारा स्वीकार किए गए तर्कों को बेहतर तरीके से संभालने के लिए अद्यतन किया है (इसके लिए PHP 5.6 को अद्यतन करने की आवश्यकता है)।

:


मैं कक्षाओं कि डिफ़ॉल्ट mysqli और mysqli_stmt कक्षाओं का विस्तार आप संभावित क्वेरी स्ट्रिंग है, जो प्रदान करना चाहिए की एक गायन देखने देने के लिए का एक सेट बनाने के बाद क्या आप देख रहे हैं https://github.com/noahheck/E_mysqli

यह आप के लिए एक (करीब) ड्रॉप-में प्रतिस्थापन है सामान्य mysqli उद्देश्य यह है कि एक कस्टम mysqli_stmt ऑब्जेक्ट जब आप prepare() क्वेरी स्ट्रिंग।

$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName); 

$query = "INSERT INTO registration SET name = ?, email = ?"; 

$stmt = $mysqli->prepare($query); 

$stmt->bind_param("ss", $_POST['name'], $_POST['email']); 

$stmt->execute(); 

echo $stmt->fullQuery; 

परिणाम होगा में:

INSERT INTO registration SET name = 'John Doe', email = '[email protected]' 

इस एक्सटेंशन का उपयोग के साथ कुछ चेतावनियां हैं अपने मानकों को बंधन के बाद, E_mysqli आप stmt वस्तु का एक नया संपत्ति के रूप में परिणामी क्वेरी स्ट्रिंग देखने के लिए अनुमति देगा (github प्रोजेक्ट में README में समझाया गया है), लेकिन आपके एप्लिकेशन के परेशानी वाले क्षेत्रों की समस्या निवारण के लिए, या प्रक्रियात्मक से किसी ऑब्जेक्ट उन्मुख शैली में संक्रमण के लिए, यह अधिकांश उपयोगकर्ताओं के लिए एक स्तर की सहायता प्रदान करना चाहिए।

जैसा कि मैंने जिथब प्रोजेक्ट में उल्लिखित किया है, मेरे पास mysqli एक्सटेंशन का उपयोग करके कोई व्यावहारिक अनुभव नहीं है, और यह प्रोजेक्ट इसकी बहन प्रोजेक्ट के उपयोगकर्ताओं के अनुरोध पर बनाया गया था, इसलिए कोई भी प्रतिक्रिया जो प्रदान की जा सकती है उत्पादन में इसका उपयोग करने वाले देवों की बहुत सराहना की जाएगी।

अस्वीकरण - जैसा कि मैंने कहा, मैंने यह एक्सटेंशन बनाया है।

0

आप Lottip जैसे टूल का उपयोग कर सकते हैं। विचार MySQL प्रॉक्सी की तरह कार्य है। यह MySQL पैकेट को पार करता है, क्वेरी निष्कर्ष निकालता है और इसके पैराम हैं ताकि आप इसकी सामग्री के साथ तैयार कथन देख सकें।

+0

कृपया यहां लोटिप की अवधारणा और उपयोग को स्पष्ट करें। लिंक हमेशा के लिए नहीं रहता है। – atomSmasher

संबंधित मुद्दे