2009-06-07 11 views
40

मैं इस समय MySQLi के साथ खेल रहा हूं, यह पता लगाने की कोशिश कर रहा हूं कि यह सब कैसे काम करता है। मेरी वर्तमान परियोजनाओं में मैं हमेशा कोडिंग करते समय एक क्वेरी स्ट्रिंग को प्रतिबिंबित करना चाहता हूं, बस यह सुनिश्चित करने के लिए कि सब कुछ सही है, और मेरे कोड को जल्दी से डीबग करने के लिए। लेकिन ... मैं इसे एक तैयार MySQLi कथन के साथ कैसे कर सकता हूं?एक MySQLi तैयार कथन कैसे गूंजें?

उदाहरण:

$id = 1; 
$baz = 'something'; 

if ($stmt = $mysqli->prepare("SELECT foo FROM bar WHERE id=? AND baz=?")) { 
    $stmt->bind_param('is',$id,$baz); 
    // how to preview this prepared query before acutally executing it? 
    // $stmt->execute(); 
}

मैं इस सूची (http://www.php.net/mysqli) के माध्यम से, लेकिन किसी भी भाग्य के बिना चल रहा है।


संपादित

ठीक है, अगर यह MySQLi के भीतर से संभव नहीं है, शायद मैं कुछ के साथ इस तरह रह सकते हैं:,

function preparedQuery($sql,$params) { 
    for ($i=0; $i<count($params); $i++) { 
    $sql = preg_replace('/\?/',$params[$i],$sql,1); 
    } 
    return $sql; 
} 

$id = 1; 
$baz = 'something'; 

$sql = "SELECT foo FROM bar WHERE id=? AND baz=?"; 

echo preparedQuery($sql,array($id,$baz)); 

// outputs: SELECT foo FROM bar WHERE id=1 AND baz=something 

सही से दूर स्पष्ट रूप से यह अभी भी बहुत बेमानी है, क्योंकि — कुछ मैं — को रोकना चाहता था और यह मुझे यह भी नहीं बताता कि MySQLi द्वारा डेटा के साथ क्या किया जा रहा है। लेकिन मुझे लगता है कि मैं इस तरह से अनुमान लगा सकता हूं कि क्या सभी डेटा मौजूद है और सही जगह पर है, और यह मुझे कुछ समय बचाएगा, मैन्युअल रूप से क्वेरी — में चर में फ़िट करने की तुलना में कई वर्रों के साथ दर्द हो सकता है ।

+3

वाह, ऐसा कोई तरीका नहीं दिखता है। दुख की बात है ... मैं उम्मीद कर रहा था कि मैं mysqli पर स्विच कर सकता हूं, लेकिन मुझे इतिहास के लिए चलाए गए सभी SQL कथन रिकॉर्ड करने की आवश्यकता है। –

+1

आप शायद अपने MySQL सर्वर को –

+0

हाँ प्राप्त करने वाले सभी प्रश्नों को लॉग कर सकते हैं, यह सहायक है, लेकिन मैं SELECTS को लॉग नहीं करना चाहता हूं और यह डिबगिंग के साथ बहुत मदद नहीं करता है क्योंकि प्रति सेकंड कई प्रश्न हो सकते हैं। –

उत्तर

9

मुझे नहीं लगता कि आप कर सकते हैं - कम से कम जिस तरह से आप उम्मीद कर रहे थे उसमें नहीं। आपको या तो क्वेरी स्ट्रिंग को स्वयं बनाना होगा और इसे निष्पादित करना होगा (यानी कथन का उपयोग किए बिना), या उस कार्यक्षमता का समर्थन करने वाले रैपर को ढूंढें या बनाएं। एक मैं उपयोग Zend_Db है, और यह कैसे मैं यह कर देगी:

$id = 5; 
$baz = 'shazam'; 
$select = $db->select()->from('bar','foo') 
         ->where('id = ?', $id) 
         ->where('baz = ?', $baz); // Zend_Db_Select will properly quote stuff for you 
print_r($select->__toString()); // prints SELECT `bar`.`foo` FROM `bar` WHERE (id = 5) AND (baz = 'shazam') 
+0

यह मेरे मामले में काम नहीं कर रहा है। –

4

बस मर जाते हैं और उत्पादन के लिए पिछले निष्पादित क्वेरी यह निर्धारित किया है। त्रुटि प्रबंधन आपको सार्थक जानकारी देनी चाहिए जिसका उपयोग आप अपनी क्वेरी को ठीक करने के लिए कर सकते हैं।

6

मैंने अतीत में इस के साथ संघर्ष किया है। तो इसे पाने के लिए मैंने एसक्यूएल, झंडे और चर के आधार पर मेरे लिए एसक्यूएल बनाने के लिए एक छोटा सा काम लिखा।

//////////// Test Data ////////////// 
$_GET['filmID'] = 232; 
$_GET['filmName'] = "Titanic"; 
$_GET['filmPrice'] = 10.99; 

//////////// Helper Function ////////////// 
function debug_bind_param(){ 
    $numargs = func_num_args(); 
    $numVars = $numargs - 2; 
    $arg2 = func_get_arg(1); 
    $flagsAr = str_split($arg2); 
    $showAr = array(); 
    for($i=0;$i<$numargs;$i++){ 
     switch($flagsAr[$i]){ 
     case 's' : $showAr[] = "'".func_get_arg($i+2)."'"; 
     break; 
     case 'i' : $showAr[] = func_get_arg($i+2); 
     break; 
     case 'd' : $showAr[] = func_get_arg($i+2); 
     break; 
     case 'b' : $showAr[] = "'".func_get_arg($i+2)."'"; 
     break; 
     } 
    } 
    $query = func_get_arg(0); 
    $querysAr = str_split($query); 
    $lengthQuery = count($querysAr); 
    $j = 0; 
    $display = ""; 
    for($i=0;$i<$lengthQuery;$i++){ 
     if($querysAr[$i] === '?'){ 
      $display .= $showAr[$j]; 
      $j++; 
     }else{ 
      $display .= $querysAr[$i]; 
     } 
    } 
    if($j != $numVars){ 
     $display = "Mismatch on Variables to Placeholders (?)"; 
    } 
    return $display; 
} 

//////////// Test and echo return ////////////// 

echo debug_bind_param("SELECT filmName FROM movies WHERE filmID = ? AND filmName = ? AND price = ?", "isd", $_GET['filmID'], $_GET['filmName'], $_GET['filmPrice']); 

मैंने सहायता के लिए थोड़ा ऑनलाइन टूल भी बनाया है।

Mysqli Prepare Statement Checker

+0

$ i $ $ numargs की जांच करें; $ i <$ numVars होना चाहिए, numargs सभी fc तर्कों की कुल गणना है। इसे बदलें और काम शुरू कर देंगे। – Elensar

+0

एक महत्वपूर्ण जांच गायब है! यदि आप columenname के भीतर एक qmark को प्रतिस्थापित करने के लिए उपयोग करते हैं तो भी आपका टूल और आपका फ़ंक्शन एक सही SQL stmt दिखाता है। उपयोगकर्ता को पता होना चाहिए कि स्तंभ नामों में पैरा को अनुमति नहीं है लेकिन ऐसी त्रुटि को खोजने में मुश्किल है और यह कार्य दुर्भाग्यवश यहां भी काम नहीं करता है .. –

2

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

https://github.com/noahheck/E_mysqli

:


एक अनुरोध मैं एक परियोजना मैं इस एक ही मुद्दा PDO का उपयोग कर संबोधित करने के लिए बनाई गई पर मिलने की वजह से, मैं GitHub है कि यह की तरह लगता है पर mysqli के लिए एक विस्तार बनाए गए अपने मुद्दे को संबोधित

यह कक्षाओं का एक सेट है जो देशी mysqli और mysqli_stmt कक्षाओं का विस्तार करता है ताकि आप तैयार क्वेरी में बाध्य पैरामीटर को इंटरपोल करके डीबी सर्वर पर निष्पादित क्वेरी का उदाहरण देखने की अनुमति दे सकें और फिर आपको पहुंच प्रदान कर सकें stmt वस्तु पर एक नया संपत्ति के रूप में परिणामी स्ट्रिंग:

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

$query = "UPDATE registration SET name = ?, email = ? WHERE entryId = ?"; 

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

$stmt->bindParam("ssi", $_POST['name'], $_POST['email'], $_POST['entryId']); 

$stmt->execute(); 

echo $stmt->fullQuery; 

जिसके परिणामस्वरूप:

UPDATE registration SET name = 'Sue O\'reilly', email = '[email protected]' WHERE entryId = 5569 

ध्यान दें कि fullQuery में मूल्यों को उचित रूप से ध्यान में चरित्र डाटाबेस सर्वर पर सेट लेने से बच गया कर रहे हैं , जो इस कार्यक्षमता को उदाहरण के लिए उपयुक्त बनाना चाहिए लॉग फाइल, बैकअप, इत्यादि

गीथब प्रोजेक्ट पर रीडमे में उल्लिखित, इसका उपयोग करने के लिए कुछ चेतावनी हैं, लेकिन विशेष रूप से विकास, सीखने और परीक्षण के लिए, इससे कुछ सहायक कार्यक्षमता प्रदान की जानी चाहिए।

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

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

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