مقدمة: "شعارك لا يعمل، وقاعدة البيانات تبكي"
\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\nلماذا يصرخ PHP بشأن المعامل؟ (الأسباب)
\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\nعلى Stack Overflow، حصد هذا السؤال آلاف المشاهدات. وهذا ليس مفاجئًا: لا يزال العديد من الاستضافات يعمل بـ PHP 5.x، والكثير من الدروس (حتى على YouTube) تشرح باستخدام mysql_*.
لكن تذكر مرة واحدة وإلى الأبد: إضافة mysql قديمة وتمت إزالتها من PHP 7.0. إذا كنت تكتب كودًا جديدًا – استخدم mysqli أو PDO.