خطأ mysql_fetch_array(): يجب أن تكون المعلمة الأولى resource – طريقة الإصلاح

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: "شعارك لا يعمل، وقاعدة البيانات تبكي"

\n\n

إذا سبق لك كتابة سكربت PHP يتعامل مع MySQL، فبالتأكيد واجهت هذه العبارة المخيفة:
\nWarning: mysql_fetch_array() expects parameter 1 to be resource, boolean given.

\n\n

دعنا نتفق فورًا: هذه ليست نهاية العالم. إنها مجرد إشارة من PHP تقول: "مرحبًا، لا يمكنني جلب البيانات من الشيء الذي أعطيته لي!"

\n\n

في هذا الدليل التعليمي، سنشرح لماذا يظهر خطأ mysql_fetch_array() expects parameter 1 to be resource، وكيفية إصلاحه، والأهم من ذلك كيف تتخلص منه نهائيًا (تلميح: الانتقال إلى PDO أو MySQLi).

\n\n

المقالة مكتوبة خصيصًا لـ pythonlib.ru – بوابة تعليمية نعلم فيها كتابة الكود بدون ألم. هيا بنا!

\n\n

لماذا يصرخ PHP بشأن المعامل؟ (الأسباب)

\n\n

لفهم جذر المشكلة، دعنا نتذكر كيف تعمل دوال mysql_* القديمة (نعم، تلك التي أصبحت قديمة منذ PHP 5.5).

\n\n

الكود النموذجي للمبتدئين يبدو هكذا:

\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\n
    \n
  • خطأ نحوي في SQL – علامة الاقتباس غير مغلقة.
  • \n
  • لا يوجد اتصال بقاعدة البيانات – mysql_connect() أرجعت false.
  • \n
  • لم يتم تحديد قاعدة البيانات – mysql_select_db() لم تعمل.
  • \n
  • الجدول غير موجود.
  • \n
\n\n

عندما تفشل mysql_query()، فإنها تُرجع false (نوع منطقي)، وليس resource. وأنت تحاول تمرير false إلى mysql_fetch_array() التي تنتظر resource. صراع! ومن هنا يأتي الخطأ.

\n\n

ما هي الدوال المتأثرة؟

\n
    \n
  • mysql_fetch_array()
  • \n
  • mysql_fetch_assoc()
  • \n
  • mysql_fetch_row()
  • \n
  • mysql_num_rows()
  • \n
  • mysql_data_seek()
  • \n
\n\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: التحقق من تحديد قاعدة البيانات

\n
if (!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

لماذا لا يزال هذا يعمل؟ (السياق التاريخي)

\n\n

على Stack Overflow، حصد هذا السؤال آلاف المشاهدات. وهذا ليس مفاجئًا: لا يزال العديد من الاستضافات يعمل بـ PHP 5.x، والكثير من الدروس (حتى على YouTube) تشرح باستخدام mysql_*.

\n\n

لكن تذكر مرة واحدة وإلى الأبد: إضافة mysql قديمة وتمت إزالتها من PHP 7.0. إذا كنت تكتب كودًا جديدًا – استخدم mysqli أو PDO.

المدونات

توصيات الكتب