خطأ mysql_fetch_array(): يجب أن تكون المعلمة 1 من نوع resource — الحل

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

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

ابدأ الدورة

مقدمة: ذلك الخطأ الذي يجعلك ترغب في إغلاق المتصفح



إذا سبق لك أن كتبت استعلام PHP إلى MySQL وفجأة رأيت في المتصفح شيئًا مثل:



Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/site/index.php on line 15


...فأنت تعرف هذا الشعور. يبدو أن كل شيء صحيح: قمت بالاتصال، وكتبت الاستعلام، ولكن PHP يصرخ عليك باللون الأحمر. الأمر المحبط بشكل خاص هو عندما يعمل الكود على الخادم المحلي، ولكن لا يعمل على الاستضافة. أو العكس.



هذا الخطأ هو واحد من أكثر الأخطاء شيوعًا على Stack Overflow. آلاف المطورين (ونحن منهم) ضربوا رؤوسهم بلوحة المفاتيح محاولين فهم: «لماذا تتوقع المعلمة 1 أن تكون resource، ولكنها تتلقى boolean؟»



في هذه المقالة، لن نقوم فقط بتحليل السبب، بل سنمر بالمسار الكامل: من إعادة إنتاج الخطأ إلى إصلاحه. وسنرى أيضًا لماذا يجب استبدال الدوال القديمة mysql_* بالدوال الحديثة PDO أو MySQLi. هيا بنا!



كيف تبدو المشكلة عمليًا



دعنا نحاكي الموقف. لديك جدول users، وتريد عرض جميع المستخدمين. الكود مكتوب بالطريقة القديمة:



$link = mysql_connect('localhost', 'user', 'password');mysql_select_db('test');

$result = mysql_query("SELECT * FROM users");

while ($row = mysql_fetch_array($result)) { echo $row['name'] . '<br>';}


يبدو كلاسيكيًا. ولكن إذا كان الجدول users غير موجود، أو كان هناك خطأ نحوي في SQL، فإن mysql_query() سيعيد ليس resource، بل false. وعندها، mysql_fetch_array() يستقبل boolean بدلاً من resource — ومن هنا يأتي الخطأ.



غالبًا ما تكمن المشكلة في فشل تنفيذ الاستعلام. لكن دعنا نستعرض جميع الأسباب المحتملة بالترتيب.



السبب رقم 1: استعلام SQL أعاد false



هذا هو الموقف الأكثر شيوعًا. mysql_query() يعيد false إذا فشل الاستعلام. على سبيل المثال:

  • الجدول غير موجود
  • اسم الحقل غير صحيح
  • خطأ نحوي في SQL
  • مشاكل في صلاحيات الوصول


كيف تتحقق؟ ببساطة أضف فحصًا بعد الاستعلام:



$result = mysql_query("SELECT * FROM non_existent_table");

if (!$result) { die('خطأ في الاستعلام: ' . mysql_error());}

while ($row = mysql_fetch_array($result)) { // ...}


سيظهر لك هذا فورًا ما هي المشكلة. mysql_error() سيعرض نص الخطأ، على سبيل المثال: "Table 'test.non_existent_table' doesn't exist".



السبب رقم 2: فقدان الاتصال بقاعدة البيانات



أحيانًا ينقطع الاتصال (على سبيل المثال، بسبب انتهاء المهلة أو إعادة تشغيل MySQL). عندها، mysql_query() سيعيد أيضًا false. الحل هو دائمًا التحقق من الاتصال:



$link = mysql_connect('localhost', 'user', 'password');if (!$link) {    die('فشل الاتصال: ' . mysql_error());}


لكن حتى هذا ليس حلاً سحريًا. من الأفضل استخدام دوال يمكنها إعادة الاتصال تلقائيًا — على سبيل المثال، MySQLi.



السبب رقم 3: الخلط بين دوال mysql_* و mysqli_*



حالة شائعة أخرى. قد تخلط عن غير قصد بين المكتبتين المختلفتين. على سبيل المثال، تتصل عبر mysqli_connect()، ولكنك تنفذ الاستعلام عبر mysql_query(). هذا لن يعمل: mysql_query() يتوقع resource من mysql_connect()، وليس من mysqli_connect().



إليك مثال على الخلط:



// الاتصال عبر MySQLi$link = mysqli_connect('localhost', 'user', 'password', 'test');

// والاستعلام عبر mysql_* القديمة$result = mysql_query("SELECT * FROM users"); // خطأ!

while ($row = mysql_fetch_array($result)) { echo $row['name'];}


الحل هو الالتزام بمكتبة واحدة. إما

المدونات

توصيات الكتب