परिचय: वह त्रुटि जिससे ब्राउज़र बंद करने का मन करता है
\n\nयदि आपने कभी PHP में MySQL से क्वेरी लिखी है और अचानक ब्राउज़र में कुछ इस तरह देखा:
\n\nWarning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/site/index.php on line 15\n\n...तो आप उस भावना को जानते हैं। ऐसा लगता है कि सब कुछ सही है: कनेक्ट किया, क्वेरी लिखी, लेकिन PHP आप पर लाल रंग में चिल्ला रहा है। यह विशेष रूप से तब कष्टप्रद होता है जब कोड स्थानीय सर्वर पर काम करता है, लेकिन होस्टिंग पर नहीं। या इसके विपरीत।
\n\nयह त्रुटि Stack Overflow पर सबसे लोकप्रिय में से एक है। हज़ारों डेवलपर्स (और हम भी उनमें से) ने यह समझने के लिए अपना सिर कीबोर्ड पर पटका: «पैरामीटर 1 resource की उम्मीद क्यों करता है, लेकिन boolean प्राप्त करता है?»
\n\nइस लेख में, हम केवल कारण का विश्लेषण नहीं करेंगे, बल्कि पूरी यात्रा करेंगे: त्रुटि को पुन: उत्पन्न करने से लेकर उसे ठीक करने तक। और साथ ही, हम देखेंगे कि पुराने mysql_* फ़ंक्शन को आधुनिक PDO या MySQLi से क्यों बदलना चाहिए। चलिए शुरू करते हैं!
व्यवहार में समस्या कैसी दिखती है
\n\nआइए एक स्थिति बनाते हैं। आपके पास एक तालिका users है, और आप सभी उपयोगकर्ताओं को प्रदर्शित करना चाहते हैं। कोड पुराने तरीके से लिखा गया है:
$link = mysql_connect('localhost', 'user', 'password');\nmysql_select_db('test');\n\n$result = mysql_query("SELECT * FROM users");\n\nwhile ($row = mysql_fetch_array($result)) {\n echo $row['name'] . '<br>';\n}\n\nयह क्लासिक लगता है। लेकिन अगर तालिका users मौजूद नहीं है, या SQL में सिंटैक्स त्रुटि है, तो mysql_query() resource नहीं, बल्कि false लौटाएगा। और फिर mysql_fetch_array() को resource के बजाय boolean प्राप्त होता है — इसलिए त्रुटि होती है।
अक्सर, समस्या क्वेरी के असफल निष्पादन में होती है। लेकिन आइए सभी संभावित कारणों को क्रम से समझते हैं।
\n\nकारण #1: SQL क्वेरी ने false लौटाया
\n\nयह सबसे सामान्य स्थिति है। mysql_query() false लौटाता है यदि क्वेरी विफल होती है। उदाहरण के लिए:
- \n
- तालिका मौजूद नहीं है \n
- गलत फ़ील्ड नाम \n
- SQL में सिंटैक्स त्रुटि \n
- एक्सेस अधिकारों की समस्या \n
कैसे जाँचें? बस क्वेरी के बाद एक जाँच जोड़ें:
\n\n$result = mysql_query("SELECT * FROM non_existent_table");\n\nif (!$result) {\n die('क्वेरी त्रुटि: ' . mysql_error());\n}\n\nwhile ($row = mysql_fetch_array($result)) {\n // ...\n}\n\nयह तुरंत दिखाएगा कि समस्या क्या है। mysql_error() त्रुटि का टेक्स्ट देगा, जैसे: "Table 'test.non_existent_table' doesn't exist"।
कारण #2: डेटाबेस से कनेक्शन खो जाना
\n\nकभी-कभी कनेक्शन टूट जाता है (उदाहरण के लिए, टाइम-आउट या MySQL के रीस्टार्ट के कारण)। तब mysql_query() भी false लौटाएगा। समाधान — हमेशा कनेक्शन की जाँच करें:
$link = mysql_connect('localhost', 'user', 'password');\nif (!$link) {\n die('कनेक्ट करने में विफल: ' . mysql_error());\n}\n\nलेकिन यह भी कोई रामबाण नहीं है। बेहतर है कि ऐसे फ़ंक्शन का उपयोग करें जो स्वचालित रूप से पुन: कनेक्ट हो सकें — उदाहरण के लिए, MySQLi।
\n\nकारण #3: आप mysql_* और mysqli_* फ़ंक्शन को मिला रहे हैं
\n\nएक और सामान्य मामला। आप गलती से दो अलग-अलग लाइब्रेरीज़ को मिला सकते हैं। उदाहरण के लिए, mysqli_connect() के माध्यम से कनेक्ट करना, लेकिन mysql_query() के माध्यम से क्वेरी करना। यह काम नहीं करेगा: mysql_query() mysql_connect() से resource की उम्मीद करता है, न कि mysqli_connect() से।
यहाँ भ्रम का एक उदाहरण है:
\n\n// MySQLi के माध्यम से कनेक्शन\n$link = mysqli_connect('localhost', 'user', 'password', 'test');\n\n// और पुराने mysql_* के माध्यम से क्वेरी\n$result = mysql_query("SELECT * FROM users"); // त्रुटि!\n\nwhile ($row = mysql_fetch_array($result)) {\n echo $row['name'];\n}\n\nसमाधान — एक ही लाइब्रेरी पर टिके रहें। या