mysqli_fetch_assoc () एक सदस्य फ़ंक्शन bind_param () त्रुटियों के लिए पैरामीटर / कॉल की अपेक्षा करता है। वास्तविक mysql त्रुटि कैसे प्राप्त करें और इसे ठीक करें?


109

मेरे स्थानीय / विकास परिवेश में, MySQLi क्वेरी ठीक प्रदर्शन कर रही है। हालाँकि, जब मैं इसे अपने वेब होस्ट वातावरण पर अपलोड करता हूं, मुझे यह त्रुटि मिलती है:

घातक त्रुटि: किसी गैर-ऑब्जेक्ट पर सदस्य फ़ंक्शन bind_param () को कॉल करें ...

यहाँ कोड है:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

मेरी क्वेरी की जाँच करने के लिए, मैंने नियंत्रण कक्ष phpMyAdmin के माध्यम से क्वेरी को निष्पादित करने का प्रयास किया और परिणाम ठीक है।


क्या हम देख सकते हैं कि आप $mysqliचर की शुरुआत कहां से कर रहे हैं ?
ऋकेश

यह हो सकता है कि आपके MySQL उपयोगकर्ता को SELECTक्वेरी करने के लिए विशेषाधिकारों की कमी हो । क्या आपने इसकी जाँच की?
अमल मुरली

क्या दिमाग में है कि कोई mysqli उपलब्ध नहीं है या आपने MySQL से कनेक्ट करने के लिए गलत क्रेडेंशियल्स प्रदान किए हैं।
एनबी

@YourCommonSense - पुराने शीर्षक के साथ डुप्लिकेट संदर्भ के लिए यह प्रश्न ढूंढना सरल था।
पॉल स्पीगल

@ पाओल हां, यह मेरी सबसे गहरी चिंता भी है। मैंने Google खोज और समग्र मान्यता के लिए शीर्षक बदल दिया, औसत PHP उपयोगकर्ता के लिए उनके कोड और विभिन्न वातावरणों के बीच संबंध स्पष्ट नहीं है। लेकिन तब से मुझे इसे ढूंढने में काफी मुश्किल हो रही है। अंत में इसे बुकमार्क में रखें। यदि आप एक पहचान योग्य लेकिन प्रासंगिक शीर्षक का प्रस्ताव कर सकते हैं, तो यह बहुत अच्छा होगा
आपका कॉमन सेंस

जवाबों:


122

कभी-कभी आपका MySQLi कोड त्रुटि mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...या इसी तरह का उत्पादन करता है । या बिना किसी त्रुटि के भी, लेकिन क्वेरी सभी समान काम नहीं करती है। इसका मतलब है कि आपकी क्वेरी निष्पादित करने में विफल रही।

हर बार जब कोई क्वेरी विफल होती है, तो MySQL में एक त्रुटि संदेश होता है जो इसका कारण बताता है । दुर्भाग्य से, डिफ़ॉल्ट रूप से ऐसी त्रुटियां PHP में स्थानांतरित नहीं होती हैं, और आपको जो भी मिला है वह ऊपर उल्लिखित एक गुप्त त्रुटि संदेश है। इसलिए MySQL त्रुटियों को रिपोर्ट करने के लिए PHP और MySQLi को कॉन्फ़िगर करना बहुत महत्वपूर्ण है। और एक बार जब आप त्रुटि संदेश प्राप्त करते हैं, तो इसे ठीक करना केक का एक टुकड़ा होगा।

MySQLi में त्रुटि संदेश कैसे प्राप्त करें?

सबसे पहले, आपके सभी वातावरणों में MySQLi कनेक्ट होने से पहले हमेशा यह रेखा होनी चाहिए:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

विभिन्न वातावरणों में PHP को कैसे कॉन्फ़िगर करें

यहाँ PHP त्रुटि रिपोर्टिंग पर मेरे लेख का सार है :
एक विकास और लाइव सर्वर पर त्रुटियों की रिपोर्ट करना अलग होना चाहिए। एक डेवलपमेंट सर्वर पर ऑन-स्क्रीन में दिखाई गई त्रुटियों का होना सुविधाजनक है, लेकिन एक लाइव सर्वर एरर मैसेज के बजाय लॉग इन करना होगा, इसलिए आप उन्हें बाद में एरर लॉग में पा सकते हैं।

इसलिए, आपको निम्न मानों के लिए संगत कॉन्फ़िगरेशन विकल्प सेट करना होगा:

  • एक विकास सर्वर पर

    • error_reportingE_ALLमूल्य पर सेट किया जाना चाहिए ;
    • log_errors 1 पर सेट होना चाहिए (यह एक विकास पीसी पर भी लॉग करने के लिए सुविधाजनक है)
    • display_errors 1 पर सेट होना चाहिए
  • एक प्रोडक्शन सर्वर पर

    • error_reportingE_ALLमूल्य पर सेट किया जाना चाहिए ;
    • log_errors 1 पर सेट होना चाहिए
    • display_errors 0 पर सेट होना चाहिए

वास्तव में इसका उपयोग कैसे करें?

बस किसी भी कोड को हटा दें जो त्रुटि के लिए मैन्युअल रूप से जांच करता है , उन सभी को or die(), if ($result)और ऐसे। बस अपने डेटाबेस इंटरैक्शन कोड को तुरंत लिखें:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

फिर से, बिना किसी शर्त के । यदि कोई त्रुटि होती है, तो इसे आपके कोड में किसी अन्य त्रुटि के रूप में माना जाएगा। उदाहरण के लिए, एक विकास पीसी पर यह सिर्फ ऑन-स्क्रीन दिखाई देगा, जबकि एक लाइव साइट पर इसे प्रोग्रामर के लिए लॉग इन किया जाएगा, जबकि उपयोगकर्ता की सुविधा के लिए आप एक त्रुटि हैंडलर का उपयोग कर सकते हैं (लेकिन यह एक अलग कहानी है जो विषय के लिए बंद है MySQLi, लेकिन आप ऊपर दिए गए लेख में इसके बारे में पढ़ सकते हैं)।

आपको प्राप्त त्रुटि संदेश के साथ क्या करना है?

सबसे पहले आपको समस्या क्वेरी का पता लगाना होगा। त्रुटि संदेश में फ़ाइल नाम और सटीक स्थान की पंक्ति संख्या होती है जहाँ त्रुटि हुई। सरल कोड के लिए यह पर्याप्त है, लेकिन यदि आपका कोड फ़ंक्शंस या क्लासेस का उपयोग कर रहा है, तो आपको समस्या क्वेरी का पता लगाने के लिए स्टैक ट्रेस का पालन ​​करना पड़ सकता है ।

त्रुटि संदेश प्राप्त करने के बाद, आपको इसे पढ़ना और समझना होगा। यह बहुत स्पष्ट लगता है यदि कृपालु नहीं है, लेकिन शिक्षार्थी अक्सर इस तथ्य को नजरअंदाज करते हैं कि त्रुटि संदेश केवल एक अलार्म संकेत नहीं है, लेकिन इसमें वास्तव में समस्या का विस्तृत विवरण है । और आपको केवल त्रुटि संदेश पढ़ने और समस्या को ठीक करने की आवश्यकता है।

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

यदि आपको त्रुटि संदेश समझ में नहीं आता है, तो उसे Google पर आज़माएं। और परिणामों को ब्राउज़ करते समय, उत्तर देने के लिए चिपके रहें जो त्रुटि को स्पष्ट रूप से हल करने के बजाय बताते हैं। एक समाधान आपके विशेष मामले में काम नहीं कर सकता है, लेकिन स्पष्टीकरण आपको समस्या को समझने में मदद करेगा और आपको समस्या को स्वयं ठीक करने में सक्षम करेगा।

आपको त्रुटि संदेश पर भी भरोसा करना होगा। यदि यह कहता है कि टोकन की संख्या बाध्य चर की संख्या से मेल नहीं खाती है तो ऐसा है। अनुपस्थित तालिकाओं या स्तंभों के लिए भी यही होता है। पसंद को देखते हुए, चाहे वह आपकी अपनी गलती हो या त्रुटि संदेश गलत हो, हमेशा पूर्व से चिपके रहें। फिर से यह कृपालु लगता है, लेकिन इस साइट पर सैकड़ों प्रश्न इस सलाह को बेहद उपयोगी साबित करते हैं।

उन चीजों की एक सूची जो आपको कभी भी त्रुटि रिपोर्टिंग के संबंध में नहीं करनी चाहिए

  • कभी भी एक त्रुटि दमन ऑपरेटर ( @) का उपयोग न करें ! यह एक प्रोग्रामर को त्रुटि संदेश पढ़ने में असमर्थ बनाता है और इसलिए त्रुटि को ठीक करने में असमर्थ होता है
  • बिना स्क्रीन पर त्रुटि संदेश को प्रिंट करने के लिए या किसी अन्य फ़ंक्शन का उपयोग न करें die()या न करें echo। PHP अपने आप त्रुटियों की रिपोर्ट कर सकती है और इसे सही तरीके से करना पर्यावरण पर निर्भर करता है - तो बस इसे PHP के लिए छोड़ दें।
  • मैन्युअल रूप से (जैसे if($result)) क्वेरी परिणाम का परीक्षण करने के लिए एक शर्त न जोड़ें । त्रुटि अपवाद सक्षम करने से ऐसी स्थिति बस बेकार हो जाएगी।
  • try..catchत्रुटि संदेश गूँजने के लिए ऑपरेटर का उपयोग न करें । लेन-देन रोलबैक की तरह कुछ त्रुटि से निपटने के लिए इस ऑपरेटर का उपयोग किया जाना चाहिए। लेकिन कभी भी त्रुटियों को रिपोर्ट करने के लिए इसका उपयोग न करें - जैसा कि हमने ऊपर सीखा, PHP पहले से ही कर सकता है, सही तरीका।

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


@AdamWinter का उपयोग करना @ हमेशा गलत है, और इस विशेष मामले में दस गुना है। आपके प्रोग्राम के लिए त्रुटि संदेश आपके शरीर के दर्द के समान है। यह बताता है कि कुछ गलत है, जैसे आपका पैर टूट गया है। और आपको पैर को ठीक करना होगा न कि केवल एक दर्द निवारक दवा लें और चलें। मुझे भी। PHP आपको बताती है कि कोई चर नहीं है जिसकी आप अपेक्षा करते हैं। तो आपको इस वैरिएबल को उपलब्ध कराने के लिए फॉर्म को या जो भी हो, उसे ठीक करना होगा। त्रुटि को दरकिनार करने के लिए सिर्फ एक कोड नहीं लिखें।
आपका कॉमन सेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.