परिचय: "आपका लोगो काम नहीं कर रहा, और डेटाबेस रो रहा है"
\n\nअगर आपने कभी PHP में MySQL के साथ काम करने वाला स्क्रिप्ट लिखा है, तो आपने यह डरावना संदेश ज़रूर देखा होगा:
\nWarning: mysql_fetch_array() expects parameter 1 to be resource, boolean given.
चिंता न करें: यह दुनिया का अंत नहीं है। यह सिर्फ PHP का एक संकेत है: "अरे, मैं उस चीज़ से डेटा नहीं ले सकता जो तुमने मुझे दी है!"
\n\nइस ट्यूटोरियल में हम जानेंगे कि mysql_fetch_array() expects parameter 1 to be resource त्रुटि क्यों होती है, इसे कैसे ठीक करें, और सबसे महत्वपूर्ण बात — इसे हमेशा के लिए कैसे खत्म करें (स्पॉयलर: PDO या MySQLi पर स्विच करें)।
यह लेख pythonlib.ru के लिए विशेष रूप से लिखा गया है — एक शैक्षिक पोर्टल जहाँ हम बिना दर्द के कोड लिखना सिखाते हैं। चलिए शुरू करते हैं!
\n\nPHP क्यों चिल्ला रहा है? (कारण)
\n\nसमस्या की जड़ को समझने के लिए, याद करें कि पुराने mysql_* फंक्शन कैसे काम करते हैं (हाँ, वे जो PHP 5.5 में ही पुराने हो गए थे)।
शुरुआती लोगों का विशिष्ट कोड कुछ इस तरह दिखता है:
\n// कनेक्शन\n$link = mysql_connect('localhost', 'user', 'password');\nmysql_select_db('test');\n\n// क्वेरी (गलती के साथ)\n$result = mysql_query("SELECT * FROM users WHERE id = '1");\n\n// पढ़ने का प्रयास\nwhile($row = mysql_fetch_array($result)) { // त्रुटि!\n echo $row['name'];\n}\n\nयहाँ क्या गलत है? सब कुछ! लेकिन मुख्य बात: mysql_query() ने false लौटाया, न कि resource। क्यों?
- \n
- SQL में सिंटैक्स त्रुटि — कोटेशन बंद नहीं हुआ। \n
- डेटाबेस से कनेक्शन नहीं —
mysql_connect()ने false लौटाया। \n - डेटाबेस चयनित नहीं —
mysql_select_db()काम नहीं किया। \n - टेबल मौजूद नहीं। \n
जब mysql_query() विफल होता है, तो वह false (बूलियन टाइप) लौटाता है, न कि resource। आप false को mysql_fetch_array() में भेजने की कोशिश कर रहे हैं, जो resource की उम्मीद करता है। यही संघर्ष है! इसलिए त्रुटि आती है।
कौन से फंक्शन प्रभावित होते हैं?
\n- \n
mysql_fetch_array()\n mysql_fetch_assoc()\n mysql_fetch_row()\n mysql_num_rows()\n mysql_data_seek()\n
ये सभी एक ही बात कहते हैं: "expects parameter 1 to be resource"।
\n\nचरण-दर-चरण समाधान (पुराने कोड के लिए)
\n\nअगर आपके पास लीगेसी प्रोजेक्ट है और आप अभी PHP अपडेट नहीं कर सकते (हालाँकि मैं दृढ़ता से सलाह देता हूँ), तो यहाँ त्रुटि को पकड़ने और ठीक करने का तरीका है।
\n\nचरण 1. कनेक्शन जाँचें
\n$link = mysql_connect('localhost', 'user', 'password');\nif (!$link) {\n die('कनेक्शन त्रुटि: ' . mysql_error());\n}\n\nचरण 2. डेटाबेस चयन जाँचें
\nif (!mysql_select_db('my_database')) {\n die('डेटाबेस चयन विफल: ' . mysql_error());\n}\n\nचरण 3. क्वेरी को जाँच के साथ करें
\n$sql = "SELECT * FROM users WHERE id = 1";\n$result = mysql_query($sql);\n\nif (!$result) {\n die('क्वेरी त्रुटि: ' . mysql_error());\n}\n\n// अब सुरक्षित रूप से उपयोग कर सकते हैं\nwhile($row = mysql_fetch_assoc($result)) {\n echo $row['name'];\n}\n\nअंतर देखा? हम हर कदम की जाँच कर रहे हैं। अगर mysql_query() false लौटाता है — हम त्रुटि संदेश के साथ रुक जाते हैं, न कि false को आगे भेजते हैं।
यह अभी भी क्यों काम करता है? (ऐतिहासिक संदर्भ)
\n\nStack Overflow पर इस प्रश्न के हज़ारों व्यूज़ हैं। और यह आश्चर्य की बात नहीं है: आज भी कई होस्टिंग्स पर PHP 5.x चल रहा है, और ढेरों ट्यूटोरियल (YouTube पर भी) mysql_* के माध्यम से पढ़ाते हैं।
लेकिन हमेशा याद रखें: mysql एक्सटेंशन पुराना हो चुका है और PHP 7.0 से हटा दिया गया है। अगर आप नया कोड लिख रहे हैं — mysqli या PDO का उपयोग करें।