2013-01-10 18 views
5

मैंने कुछ समय पहले PHP में एक बहु क्वेरी में त्रुटियों को पकड़ने के बारे में कुछ पूछा है, लेकिन किसी ने भी उत्तर नहीं दिया। अब मैंने थोड़ा और गुस्सा किया है और समस्या का थोड़ा और समझ लिया है।त्रुटियों को होने पर PHP बहु क्वेरी जारी रखना

// Some starting variables 
$test = new mysqli("localhost","root","","testdatabase"); 
$Query = array(); 
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 3"; 
$Query[] = "SELECT 'wos' FROM items WHERE itemID"; 
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 5"; 
$Query = implode(";",$Query); 
$Errors = array(); 

// Execute multi query 

if ($test->multi_query($Query)) { 
    do { 
    // fetch results 
    $Result = $test->store_result(); 
    print_r($Result); 
    if($test->errno === 0) { 
      echo $Result->num_rows . "<br>"; 
    } 
    else { 
     $Errors[] = $test->error; 
    } 
    $Result->close(); 

    if (!$test->more_results()) { 
     break; 
    } 
    if (!$test->next_result()) { 
     $Errors[] = $test->error; 
     break; 
    } 
    } while (true); 
} 

आप मैं एक्स बाद प्रश्नों की एक संख्या है और उन सब को करने के लिए चाहते हैं देख सकते हैं:

मैं इस कोड मिला है। तो यदि क्वेरी 2 विफल रहता है तो मैं निम्नलिखित प्रश्नों को चलाने के लिए बहु-क्वेरी जारी रखना चाहता हूं। मैं यह कैसे कर सकता हूँ?

इसके अलावा, अगर कोई त्रुटि होती है तो मैं इस त्रुटि को $Errors में सहेजना चाहता हूं। हालांकि वर्तमान में यह इरादे से काफी काम नहीं कर रहा है क्योंकि मैं केवल त्रुटि संदेश को सहेज सकता हूं लेकिन संबंधित क्वेरी नहीं। असफल क्वेरी के बिना केवल त्रुटि संदेश वास्तव में सहायक नहीं है। तो मैं कुछ ऐसा करना चाहता हूं: "Query 3 failed ('SELECT ...'): 'ERROR MESSAGE'"

यह कैसे संभव है? मैं $test->error के साथ लूप में वर्तमान त्रुटि प्राप्त करने में सक्षम हूं, लेकिन मेरे पास $test->currentsubsequentquery जैसी कोई चीज़ नहीं है। मैं उसे कैसे कर सकता हूँ?

बहुत बहुत धन्यवाद।

+0

मुझे कहीं भी नहीं देखा जाता है जहां $ परीक्षण परिभाषित किया जाता है या किसी भी तरीके से यह कॉल किया जा रहा है। अगर हम नहीं जानते तो मदद करने के लिए असंभव आपका कोड क्या कर रहा है। – Kyle

+0

$ test = new mysqli ("localhost", "root", "", "testdatabase"); – Shiuyin

+0

यदि SQL त्रुटियां संभव हैं, तो अपेक्षित परिणाम तो आप कुछ गलत कर रहे हैं। और यदि आप एक एसक्यूएल क्लाइंट (या टर्मिनल) की तरह कुछ कर रहा है, आपको वास्तव में कई प्रश्नों को एक बार में निष्पादित करने की आवश्यकता क्यों है? –

उत्तर

0

यहां समस्या कुछ ऐसा है जिसे MySQL प्रोटोकॉल में सीमा कहा जा सकता है। बहु क्वेरी का उपयोग करते समय (MySQL परिप्रेक्ष्य से: बहु कथन विकल्प को चालू करने के लिए सेट करना और फिर एक क्वेरी भेजें) सर्वर इसे विभाजित करेगा और उन्हें एक के बाद एक निष्पादित करेगा। उत्तर मूल के संदर्भ के बिना भेजा जाएगा। क्लाइंट का एकमात्र तरीका (इस मामले में PHP/mysqli) यह पता लगा सकता है कि कौन सा वास्तविक कथन एक त्रुटि से संबंधित है, उसे पूरी तरह से क्वेरी स्ट्रिंग को पार्स करना होगा और कुछ मैपिंग करने का प्रयास करना होगा। लेकिन यह कई मामलों में काम नहीं करेगा - कुछ बयान, सबसे विशेष रूप से CALL, कई परिणाम सेट वापस कर सकते हैं जिन्हें किसी कथन में मैप नहीं किया जा सकता है।

बदसूरत एक $Query = implode(";\n\n",$Query); कर रही है और उसके बाद प्रदान की लाइन के लिए त्रुटि संदेश पार्स और उन से मेल खाते हैं:

आप त्रुटि के बारे में अधिक जानना चाहते हैं वहाँ दो विकल्प हैं।

या बस multi_query का उपयोग नहीं करें। mult_query कई परिणाम सेट लौटने वाली संग्रहीत प्रक्रिया कॉल को संभालने के लिए है। उपरोक्त की तरह किसी मामले में multi_query का उपयोग करने से आपको केवल एक छोटी सी छोटी विलंबता मिल जाएगी क्योंकि सर्वर अगली क्वेरी कमांड के इंतजार किए बिना अगली क्वेरी को सीधे संसाधित कर सकता है, लेकिन यहां तक ​​कि माइस्क्लंड के एसिंक क्वेरी ऑपरेशंस का उपयोग करके भी पहुंचा जा सकता है।

0

ठीक है, एक ही कथन में एकाधिक प्रश्न आमतौर पर एक अच्छा विचार नहीं है। अच्छे एसक्यूएल क्लाइंट (उदा। पीडीओ) कई प्रश्नों को बिल्कुल अनुमति नहीं देते हैं क्योंकि इस तरह एसक्यूएल इंजेक्शन को और अधिक कठिन बना दिया जाता है। मैं अपने विचार से आप को रोकने और नीचे दिए समाधान का प्रस्ताव करना चाहते हैं:

  • उपयोग तीन सिंगल बयान
  • के बाद से अपने तीन प्रश्नों बहुत समान हैं, आप एक तैयार बयान का उपयोग करें और यह निष्पादित तीन चाहिए बाध्यकारी विभिन्न पैरामीटर के साथ समय। यह तीन एकल कथन से बेहतर प्रदर्शन प्रदान करता है और एसक्यूएल इंजेक्शन असंभव बनाता है।
  • आप इस प्रकार का एक गैर-सभी क्वेरी डिजाइन या संघ के साथ कुछ भी कर सकता है:

    "SELECT 'wos' FROM items WHERE itemID IN ('3', '5')" 
    

तुम अब लगता है कि "क्या इस आदमी के बारे में बात कर रहा है?यह अब परमाणु नहीं होगा। "तो आपको एक लेनदेन का उपयोग करना चाहिए ...

+0

"यह अब परमाणु नहीं होगा।" - multi_query या तो परमाणु नहीं है। – johannes

+0

@johannes: हाँ, लेकिन आप सोच सकते हैं कि –

+0

यही कारण है कि मैंने इसे स्पष्ट किया :-) – johannes

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