بسم الله الرحمن الرحيم
يبيّن الشرح أدناه الاسباب المحتملة لمعظم أخطاء PHP الشائعة:-
Parse error إغفال فاصلة منقوطة، أو أقواس معكوفة غير مغلقة، أو أقواس عادية، أو علامات اقتباس، أو إستخدام علامة إقتباس في سلسلة محرفية دون تجاوزها/الهروب منها
Empty variable value إغفال $ قبل إسم المتحول، أو عدم كتابة إسم متحول بشكل صحيح، أو نطاق متحول (scope) غير مناسب، أو كون الإعداد register_globals معطّلآ
Undifined variable الرجوع إلى متحول قبل إعطائه قيمة
Call to undefined function عدم صحة كتابة إسم التابع، أو تعريف التابع بعد إستخدامه في (PHP 3 فقط)، أو مستند يحوي تعريف تابع ولم يتم تضمينه بشكل صحيح
Cannot redeclare function مستند يحوي تعريف تابع وتم تضمينه مرتين
Headers already sent وجود فراغ أبيض في البرنامج النصي(السكربت) قبل علّامات PHP، أو كون البيانات قد طبعت من قبل، أو تم تضمين ملف
--------------------------------------------------------
يمثل الخطأ القواعدي اللفظي ( syntactical) أول خطأ قد تواجهه، وهو يمنع تنفيذ برامجك النصية، وسوف ينجم مثل عن هذا الخطأ رسائل تشبه التالي:
كود PHP:
Parse error: parse error, unexpected ';' in /Users/Sites/test.php on line 54
لتجنب إرتكاب هذا النوع من الاخطاء في برامجك، تأكد من :-
- أنه كل عبارة (وليس بنى اللغة مثل الحلقات والتعابير الشرطية) بفاصلة منقوطة
- قم بموازنة علامات الاقبتاس والاقواس على اختلاف انواعها (يجب أن يتم إغلاق كل قوس وعلامة اقتباس)
- إلتزم بإستخدام علامات الاقتباس بشكل متوافق، أي يجب إغلاق علامات الاقتباس المفردة بعلامة إقتباس مفردة فقط، وكذلك الحال مع علامات الاقتباس المزدوجة
- قم بتجاوز/الهروب من جميع علامات الاقتباس المفردة المزدوجة ضمن عبارات print( )
يجب أن تنتبه لشيء آخر أيضآ يخص الاخطاء القواعدية، ذلك أن مجرد قول رسالة خطأ PHP بأن الخطأ في السطر 12، فهذا لا يعني البته أن الخطأ في هذا السطربالفعل. وعلى الاقل، لا يمكن أن يكون هناك إختلاف بين ما تعتقد PHP بأنه السطر 12 وما هو عليه في محرر نصوصك. لذلك، ومع علمك بفائدة التوجيه الذي تقدمه PHP لملاحقة المشكلة، عامل رقم السطر كمرجع لنقطة الانطلاق أكثر منه الموضع المطلق للمشكلة
-------------------------------------
ينجم النوع الثاني من الاخطاء التي قد تواجهها عن سوء إستخدام تابع، وتقع مثل هذه الاخطاء مثلآ عند إستدعاء التابع setcookie( ) أو header( ) بعد تلقي مستعرض الويب لشيفرة HTML، أو عند إستدعاء تابع بدون إستخدام الوسطاء المناسبين. وتكشف PHP هذا الخطأ عند تنفيذ الشفرة.
أنظر المثال أدناه
كود PHP:
Warning: Wrong parameter count for round ( ) in /Users/Sites/test.php on line 54
-------------------------------------
أما النوع الثالث من الاخطاء فلا يتعلق باللغة PHP على الاطلاق، وإنما هو خطأ من قبل المبرمج أو خطأ منطقي (معظم الاخطاء هي أخطاء مبرمج!). ويعود السبب إلى فشل المبرمج في استخدام إسم متحول صحيح. فإذا فعلت ذلك، لن تشاهد رسالة خطأ مثل الرسائل التي وجدتها في الامثلة السابقة، وإنما ستشاهد نتائج غريبة أو غير متوقعة. يعتبر هذا النوع من الاخطاء الأصعب على الاطلاق، ذلك أن PHP لن تقم لك مفتاحآ للدلالة على المشكلة وكيفية تصويبها، وستحتاج هنا إلى عمل إستكشافي لمعرفة الاخطاء المرتكبة ومواضعها.
لتتبع اخطاء برامجك النصية قم بالتالي :
- إعرض مصدر HTML
سوف تقدم بعض المستعرضات صفحة فارغة عند وقوع خطأ PHP وقد يكون عرض شيفرة المصدر الطريقة الوحيدة لمعرفة المشكلة، وإذا لم يكن الخطأ خطأ PHP، فقد يكون خطأ HTML
- إستخدم التعليقات:
كما يمكنك إستخدام التعليقات لتوثيق برامجك النصية، يمكنك إستخدامها أيضآ لإبعاد الاسطر الإشكالية. وإذا كانت PHP تشير عليك بوجود خطأ في السطر 12، فقد يخلصك جعله تعليقآ من الخطأ، وإذا لم يجد ذلك نفعآ، فستدرك بأن الخطأ في موضع آخر
- إستدع التابعين print( ) و echo ( ) ، عادة ما نستخدم عبارات print ( ) لنحصل على ملاحظات عما يحدث عد تنفيذ البرنامج النصي، فعندما يقوم برنامج نصي على عدة خطوات، فقد يكون من السهولة بمكان معرفة ما إذا كانت المشكلة تقع في الخطوة 2 أو الخطوة 5 مثلآ، ويمكنك بإستخدام عبارة rint ( ) حصر المشكلة في موضع ضيق للغاية
يمكن تحقيق تتبع أخطاء أكثر تعقيدآ بعرض ملاحظات أثناء تنفيذ البرنامج النصي
أنظر المثال أدناه
كود PHP:
The form has been submitted!
The username and password were enterd!
Arow returned from the database!
- لاحق المتحولات :
بإستخدام التابع print ( ) أو echo ( ) أو print_r ( ) أو var_dump ( ) يمكنك ملاحقة قيم المتحولات مع تنفيذ برنامجك النصي
أنظر المثال أدناه
كود PHP:
Username was submitted as: name
Password was submitted as: password
من السهولة أن يفشل البرنامج النصي في عمله جراء رجوعك إلى متحول الخطأ، أو إلى المتحول الصحيح بإسم خاطيء، أو لأن المتحول لا يملك القيمة التي تتوقعها منه. وللتحقق من هذه الاحتمالات، إستخدم عبارة print ( ) أو echo ( ) لطباعة قيم المتحولات في المواضع الهامة من برامك النصية.
وبالنسبة لأنواع المتحولات الاكثر تعقيدآ (المصفوفات والكائنات)، إستخدم التابعين print_r ( ) و var_dump ( ) اللذين سيطبعا قيمها دون الحاجة إلى حلقات. ويحقق التابعان نفس المهمة، رغم أن التابع var_dump ( ) أكثر تفصيلآ في تقريره من التابع print_r ( )
-------------------------------------------------
ملاحظات ونصائح مهمة :
- تتضمن معظم محررات النصوص أدوات للتحقق من توازن الاقواس وعلامات الاقتباس
- إذا لم تستطع العثور على خطأ المفسر في برنامج نصي معقد، فإبدأ بإستخدام التعليقات /**/ لجعل شيفرة PHP بأكملها غير فعالة. وتابع بعد ذلك في الغاء التعليق عن المقاطع واحدآ تلو الاخر ونفذ البرنامج النصي، لتصل أخيرآ إلى معرفة الاسطر التي تسبب الخطأ
- يفضل بعض المبرمجين الاختبار العكسي للتقليل من احتمال وقوع الاخطاء المنطقية، ونقصد بالاختبار العكسي النهج الذي يحقق تبديلآ للشروط فمثلآ :
كود PHP:
if ($variable = 5) ( ...
قد لا يبدو غير صحيح ضمن 500 سطر من الشيفرة، ولكنه يسبب مشكلات لأن الشرط سيكون TRUE دائمآ، لذلك عدّله إلى :
كود PHP:
if (5 = $variable ) ( ...
لتحصل بذلك مباشرة على علم أحمر، إذ لا يمكن تعيين قيمة للعدد 5
- لجعل نتائج PRINT_R ( ) و VAR_DUMP ( ) أكثر قابلية في مستعرض الويب، يمكن وضعها دائمآ ضمن علّامات <pre> (مسبقة التنسيق)
كود PHP:
echo '<pre>';
print_r ($var) ;
echo '</pre>';
إنتظرونا في درس مقبل
تمنياتنا للجميع بدوام الصحة والعافية