المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : اخطاء php و الحلول البرمجية في بناء المواقع



said
11-01-2013, بتوقيت غرينيتش 03:53 PM
http://www.dzbatna.com/images/icons/iconrote.gif ط§ط®ط·ط§ط، php ظˆ ط§ظ„ط*ظ„ظˆظ„ ط§ظ„ط¨ط±ظ…ط¬ظٹط© ظپظٹ ط¨ظ†ط§ط، ط§ظ„ظ…ظˆط§ظ‚ط¹ (http://www.dzbatna.com/t1727452/)




السلام عليكم ورحمة الله وبركاته

نبدأ الدرس مفصل على بركة الله




1. فهم معنى الأخطاء البرمجية (http://arab4host.net/vb/showthread.php?t=80) وأخطاء PHP بشكل خاص.
2. معرفة أنواع أخطاء الـ PHP ودلائل كل منها.
3. تعلم كيفية تخطي الكثير من الأخطاء وحلها بتعديل الكود code.
4. إنتاج إخطاء خاصة بك من خلال لغة PHP.
5. تجاهل أخطاء PHP وتوليد أخطاء خاصة بدلاً منها.
6. بعض النصائح الهامة في تفادي المشاكل والأخطاء.


أولاً: مفهوم الخطأ البرمجي Programming Error

دعونا نتعرف على مفهوم الخطأ لدينا كمبرمجين ، ولننسى المفاهيم القديمة التي عرفناها منذ الصغر .. ..

الخطأ البرمجي : هو طريقة خاطئة لتنفيذ عملية برمجية معينة ، ونص الخطأ هو عبارة عن مساعد للمبرمج لتحري الخطأ وتصحيحه ..

نص الخطأ هو نفسه رسالة الخطأ .. يا اخوان ، معظمنا نعتقد ان الخطأ رسالة تشاؤم تزعجنا دوماً ... وهذا فكر خاطئ .. فرسالة الخطأ هي مساعد أو دليل Guide يرشدنا إلى مكان الخطأ في الكود code لتصحيحه والوصول إلى النتيجة المطلوبة ..

إذاً اتفقنا على مفهوم الخطأ البرمجي ، دعونا نتعرف على أجزاء هذا الخطأ في لغة PHP ..

ثانياً: مكونات أخطاء لغة PHP

تتكون رسالة الخطأ في لغة الـ PHP من عدة أجزاء ، دعونا نعطيها أسماء معينة مع شرح طريقة لهذه الأجزاء ؛

لكن ، قبل ذلك ، دعونا نشاهد معاً الصيغة العامة لرسالة الخطأ :
كود code:

ERROR_TYPE: ERROR_MSG in FILE_PATH on line XX

1. ERROR_TYPE : وهو نوع رسالة الخطأ .

2. ERROR_MSG : وهو نص رسالة الخطأ .

3. FILE_PATH : مسار الملف ( على السيرفر SERVER ) الذي حدث الخطأ أثناء معالجته .

4. XX : رقم السطر الذي حدث فيه الخطأ في داخل ملف FILE_PATH .

إذاً، عندما ترى رسالة خطأ بالسياق السابق، فإنك تفهم أنه حدث خطأ من نوع ERROR_TYPE وهو بالتفصيل: ERROR_MSG داخل ملف FILE_PATHفي السطر رقم XX .

مهلاً ، هذا الكلام ليس للحفظ .. الغاية من كل هذا هو أن تفهم رسالة الخطأ ولا تظن أنها مجرد " تخبيصات " يرسلها السيرفر SERVER ..

ثالثاً: أنواع الأخطاء الرئيسية في PHP

بعد أن تعرفنا مفهوم الخطأ البرمجي وصورة رسالة الخطأ في لغة PHP ، فإنه يجدر بنا أن نورد أنواع الأخطاء التي يرسلها مترجم الـ PHP للمتصفح .. وهي كالتالي :

1. خطأ قاتل Fatal Error

وهي أخطاء كبيرة تتسبب في الإنهاء المباشر لتنفيذ السكربت. وبشكل أساسي ، يعمل هذا الخطأ على قتل برنامجك ( إيقافه عن العمل ) مع إظهار رسالة خطأ . وهذا النوع من الخطأ يحدث فقط أثناء سير (تنفيذ) البرنامج RunTime Error. الأخطاء الكبيرة فقط هي التي تسبب الخطأ القاتل Fatal Error مثل مشاكل تخصيص الذاكرة وما إلى ذلك.

فمثلاً ، لو كانت أقصى مدة لتنفيذ السكربت هي 60 ثانية في ملف إعدادات لغة PHP في الخيار max_execution_time ، وقمت مثلاً بتنفيذ صفحة رفع ملف أو أداء أي وظيفة تحتاج إلى مدة أكثر من 60 ثانية ، فإنها ستنتج خطأ قاتل من هذا النوع ..

في الحقيقة ، أثناء كتابتي لهذا الدرس مفصل ، قمت بتجربة ( ولا أنصحكم بها نهائياً ) وهي أني قمت بتغيير قيمة الخيار max_execution_time عن طريق دالة ini_set إلى ثانية واحدة .. ثم قمت بتنفيذ حلقة طويلة بعض الشيء لطباعة أرقام من 0 وحتى 99999999 .. ( الرقم كبير لأنني أعمل على السيرفر SERVER الشخصي ، أي أنه سريع لذلك فإنني احتجت إلى رقم كبير ) ..

قمت بتنفيذ الكود code التالي :
كود code PHP:

<?php

ini_set(&quot;max_execution_time&quot;, 1);
for($x=0; $x<100000000; $x++) {
echo $x;
}

?>
وطبعاً بعد أن توقفت الصفحة عن الاستيعاب لفترة قصيرة .. عدت إليها فوجدت أن عدداً كبيراً من الأرقام قد طبع في شاشة المتصفح ( لم أستطع أن أتبين آخر رقم كان قد طبع لأن الصفحة تعمل ببطء وثقل ) وفي أسفلها ظهرت رسالة الخطأ التالية كما هي :
كود code:

Fatal error: Maximum execution time of 1 second exceeded in D:Program Filesxampphtdocstest004.php on line 6

وهذا يعني أن هناك خطأ قاتل وهو أن مدة تنفيذ السكربت تعدت الـ ثانية الواحدة المسموحة لتنفيذ السكربت كحد أعلى ، ومصدر الخطأ هو الملف الذي قمت بالتجربة بداخله ، ورقم الخطأ هو السطر 6 ..

لاحظ أنه من الصعب على المترجم في هذه الحالة تحديد مكان الخطأ بالضبط .. فالضغط قد جاء من الحلقة ، لكن الجزء الذي لم يستطع إكماله هو جزء الإنهاء .. لذلك ، نكتشف أن علينا تسريع السكربت بعض الشيء في هذه الحالة .. ( طبعاً البطء كان متعمداً في هذه الحالة ) ..

2. خطأ إعرابي Parse Error

وهذا هو أكثر أنواع الأخطاء شيوعاً لدى المبرمجين ، ويحدث عندما يقوم معالج لغة PHP يقراءة الكود code ويكتشف أنك فقدت جزءاً بفوضويتك المعتادة في كتابة الكود code .. يكون النقص أو الخطأ في سياق الكود code ( التركيب install اللغوي ) .

أكثر الأخطاء التي يقع بها المبرمجون والتي تنتج هذا النوع من الأخطاء هي :

علامات التنصيص ( الاقتباس ) غير المهملة Unescaped Quotes ، وهذا يعني أنك تريد طباعة علامة تنصيص داخل سطر الطباعة بجملة joomla echo أو print .. وستجد أنك تتعرض إلى هذا الخطأ في بداية برمجتك .. وستنسى في كثير من الأحيان إهمال العلامات الداخلية ..

كمثال على ما ذكرته في الأعلى ، الكود code التالي يعتبر صحيحاً من ناحية نظرية :
كود code PHP:
echo &quot;This is my &quot;special&quot; code.&quot;;
لكن - وكما ذكرت في درس مفصل البيانات النصية - ، أن المترجم سيفهم الجملة joomla السابقة بأنك أردت إنهاء الطباعة عند &quot; التالية لـ my .. وهكذا سيحدث خلل في فهم بقية الكود code .. أي أن الكود code السابق سيعني للمترجم كما يلي :
كود code PHP:
echo &quot;This is my &quot;
special&quot; code.&quot;;
وهذا لا معنى له في لغة PHP .. أو مثلاً كما يلي :
كود code PHP:
echo 'This is Ahmad's car.';
بما أنك استخدمت نفس الاشارة التي ابتدأت فيها البيان النصي فإنه يجب عليك إهمالها ، ولن أطيل في هذا الموضوع لأنني تحدثت فيه بما يكفي سابقاً ، لكن دعونا نأخذ التصحيح للكود code الأول :
كود code PHP:
echo &quot;This is my &quot;special&quot; code.&quot;;
أي أننا أهملنا علامات التنصيص الداخلية بالشرطة المائلة للخلف Backslash ..

والتصحيح للكود code الثاني:
كود code PHP:
echo 'This is Ahmad's car.';
أما عند استخدام علامات مختلفة عن المستخدمة في بدء الجملة joomla ، أي مثلاً تضمين علامة تنصيص مفردة داخل بيانات نصية بعلامات مزدوجة ، فهو أمر طبيعي ، كما يلي :
كود code PHP:
echo 'This is my &quot;special&quot; code.';
أو:
كود code PHP:
echo &quot;This is Ahmad's car.&quot;;
انتقاص فاصلة منقوطة Semicolon ، فكل جملة joomla برمجية في لفة PHP ( مع وجود بعض الاستثناءات ) يجب أن تنتهي بفاصلة منقوطة Semicolon ..

فمثلاً ، الكود code التالي سينتج خطأ إعرابي Parse Error :
كود code PHP:

<?php

echo &quot;Hello&quot;
echo &quot;<br>How r u?&quot;;

?>
انظر إلى السطر الثالث ، لقد نسيت الفاصلة المنقوطة في نهاية السطر ، قم بتعديله إلى :
كود code PHP:

echo &quot;Hello&quot;;
وستكون الأمور على ما يرام بإذن الله تعالى ...

الآن جرب الكود code التالي :
كود code PHP:

<?php

echo &quot;Hello&quot;;
echo &quot;<br>How r u?&quot;

?>
يفترض أن هناك خطأ في السطر الرابع من الكود code ، حيث أنه يحتاج إلى فاصلة منقوطة في نهايته ، يؤسفني أن أقول لك أنك أخطأت هذه المرة ، فالكود code سيعمل بشكل صحيح ... هاه ؟ لماذا إذاً ؟؟

كالعادة سنفكر بعقلية المترجم ( لم يعد هناك شك بأننا قد فصمنا من تعدد الشخصيات ) ، فإنك ستقرأ سطر الطباعة الأخير هكذا :
كود code PHP:

echo &quot;<br>How r u?&quot;
ولا يوجد شيء بعد هذا السطر ( ككود code PHP ) ، عندها سننظر إلى أن هذا السطر سليم ، فلا نحتاج إلى فاصلة منقوطة Semicolon حتى نعرف أن السطر قد انتهى ، فليس هناك بعده ما نريد تنفيذه ... !

أما لو كان السطر الطباعي الأول هو الذي ينقص الفاصلة المنقوطة كأول مثال هنا ، فإن المترجم سيفهمه بالشكل التالي :
كود code PHP:

echo &quot;Hello&quot; echo &quot;<br>How r u?&quot;;
ففي وجهة نظر المترجم المتواضعة أن تنفيذ أمر الطباعة لم ينتهي ، لكن علامات الاستفاهم ستبدأ بالظهور على وجهه منذ أن يرى أن الكود code التالي لعلامة تنصيص إغلاق البيانات النصية لا يمكن تنفيذه .. فماذا يفهم منه ؟ لا شيء للأسف .. والنتيجة خطأ إعرابي Parse Error ..

انتقاص الأقواس العادية والأقواس المعرجة Curly Brackets

باختصار ، يجب أن يتم إغلاق أي قوس يتم فتحه في برنامجك ، سواء أكان قوس متعرج Curly Brace في جمل الشرط وغيرها من جمل PHP ، أو قوس عادي في نفس الأوضاع أو غيرها ،،، فالمثال التالي يعبر عن إحدى تلك الحالات :
كود code PHP:

if ($var) {
// Result
else {
// Otherwise
}
لاحظ أننا انتقصنا قوس إغلاق الشرط قبل else ، للتخلص مما سيطبع لنا من الأخطاء ، سنعيد القوس إلى مكانه الطبيعي :
كود code PHP:

if ($var) {
// Result
} else {
// Otherwise
}
أو المثال التالي الذي ينقص الأقواس العادية :
كود code PHP:

if ($var {
// Result
} else {
// Otherwise
}
كلها تطبع أخطاء إعرابية Parse Errors ، ولتصحيح الخطأ السابق، قم بتدارك القوس وإغلاقه كما يلي:
كود code PHP:

if ($var) {
// Result
} else {
// Otherwise
}
3. خطأ تنبيه Warning Error

أخطاء التنبيه من الأخطاء الأكثر شيوعاً في برامج الـ PHP ... وربما تكون ألطف بقليل من الأنواع السابقة ، حيث أنها لا تتسبب في تعطيل تنفيذ السكربت ، بل يتم طباعة الخطأ ومتابعة تنفيذ السكربت بشكل طبيعي ...

قد يتضمن هذا النوع من الأخطاء التعابير المنتظمة الخاطئة Invalid Regular Expressions ، أو مثلاً محاولة الوصول إلى ملف غير موجود ...

جرب هذا الكود code :
كود code PHP:

<?php

Echo &quot;Start&quot;;
include (&quot;blah-blah-blah.php&quot;);
Echo &quot;End&quot;;

?>
بحيث يكون الاسم المدخل غير موجود فعلياً .. في الحقيقة ، عند تجربتي للكود code وجدت الناتج كما يلي في شاشة المتصفح :
كود code:

Start
Warning: include(blah-blah-blah.php) [function.include]: failed to open stream: No such file or directory in D:Program Filesxampphtdocstest003.php on line 4

Warning: include() [function.include]: Failed opening 'blah-blah-blah.php' for inclusion (include_path='.;D:Program Filesxamppphppear') in D:Program Filesxampphtdocstest003.php on line 4
End

هذا يعني أن تنفيذ السكربت كان يسير على ما يرام حيث تم طباعة الجزء قبل الخطأ والجزء الآخر بعده .. وكان الخطأ من نوع Warning كالتالي :
كود code:

Warning: include(blah-blah-blah.php) [function.include]: failed to open stream: No such file or directory in D:Program Filesxampphtdocstest003.php on line 4

ولو عدنا إلى فعلياً إلى السطر رقم 4 من الملف الذي أدخلنا به الكود code لوجدناه هذا :
كود code PHP:
include (&quot;blah-blah-blah.php&quot;);
والخطأ هو أنه لم يتم العثور على الملف أو المجلد المطلوب ، ولإصلاح الخطأ يجب أن نبحث على اسم الملف الذي نطبعه ونتأكد من وجوده في مكانه ..

4. خطأ الملاحظة Notice Error

أخطاء الملاحظات هي أخطاء بسيطة لا تعمل على تعطيل عمل برنامجك أو توقفه .. لكنها في نفس الوقت تكون مفيدة بعض الشيء ..

هذه الأخطاء تظهر عندما يواجه معالج PHP شيئاً قد يكون خطأ ، وقد يكون في نفس الوقت صحيح ( أو يعمل بشكل صحيح ) ..!

من الأمثلة عل ذلك مثلاً طباعة متغير أو ثابت غير معرف مسبقاً ، كما يلي :
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
echo $var;

?>
الكود code السابق سينتج رسالة خطأ شبيهة بالتالية :
كود code:

Notice: Undefined variable: var in D:Program FilesxampphtdocsTZPCtest18.php on line 5

لاحظ أن الرسالة تقول أن المتغير غير معرّف .. دعونا نعرف متغيراً ولو كان فارغاً قبل طباعته :
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
$var = '';
echo $var;

?>
هاه؟ لقد اختفت ، أليس كذلك ؟ إذاً المشكلة من تعريف المتغير ..

وكذلك الثابت:
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
echo MY_NAME;

?>
سينتج خطأ كهذا :
كود code:

Notice: Use of undefined constant MY_NAME - assumed 'MY_NAME' in D:Program FilesxampphtdocsTZPCtest18.php on line 4

لاحظ هذه الرسالة التي تقوم أنه لم يتم العثور على الثابت ( الاستخدام للثابت غير المعرف ) .. تم افتراض أنك تريد بيان نصي قيمته 'MY_NAME' .. لذلك لاحظ أن الكود code سيطبع MY_NAME .. إذاً أي ثابت غير معرف عند استخدامه سيتم تعويضه باسمه كقيمة نصية وإظهار رسالة ملاحظة Notice Error إذا كانت قابلة للعرض ..

دعونا نعرض الثابت لنتأكد من كلامنا :
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
define(&quot;MY_NAME&quot;, &quot;PHP Player&quot;);
echo MY_NAME;

?>
لاحظ طباعة &quot;PHP Player&quot; بدلاً من 'MY_NAME' ودون رسالة خطأ لأن الثابت معرف والقيمة جاءت منا وليست مفترضة ..!

وهذا ينطبق على عناصر المصفوفات وهو خطأ شائع جداً بين المبرمجين ، فمثلاً لو دخلنا إلى صفحة بالطريقة التالية :
كود code:

http://example.com/page.php?var=val

فقد عرفنا أن طريقة الوصول إلى المتغير المرسلة بطريقة GET هي هكذا :
كود code PHP:

echo $_GET['var'];
حيث سيطبع هذا المثال القيمة 'val' دون أخطاء ... لكن الكثير من المبرمجين يتجاهلون علامات التنصيص بالشكل التالي :
كود code PHP:

echo $_GET[var];
وفي الوضع الافتراضي سيكون عرض رسائل الملاحظات معطّل في السيرفر SERVER .. لذلك ، فإن المبرمج يظن أن كود codeه سليم مئة بالمئة ...

لكن لو أظهرنا تلك الرسائل بالطريقة التالية :
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
echo $_GET['var'];

?>
سيتم طباعة 'val' أيضاً لكن دون رسالة خطأ ..

والسبب هو أن المترجم في الحالة الأولى اعتبر أن اسم المتغير المطلوب من المصفوفة هو الثابت var وليس الاسم 'var' .. لذلك فقد بحث عن ثابت اسمه var ليعوّض قيمته بدلاً من var في الجملة joomla التالية :
كود code PHP:

echo $_GET[var];
لكنه لم يجد قيمة للثابت var فافترضها بشكل مباشرة بقيمة تساوي اسم الثابت وهي 'var' ..

ولو عرفنا ثابتاً باسم VAR1 وجعلنا له محتوىً معين ، مثلاً : myvar ، فإنه سيبدل VAR1 بـ 'myvar' .. في المثال التالي :

كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
define('VAR1', 'myvar');
echo $_GET[VAR1];

?>
فالكود code السابق يساوي الكود code التالي في المعنى :
كود code PHP:

<?php

ini_set(&quot;error_reporting&quot;, E_ALL);
echo $_GET['myvar'];

?>
أتمنى أن تكون قد وصلتكم هذه الفكرة ...

رابعاً: مترجم PHP ورقم سطر الخطأ !!!؟

ربما قد لاحظت خلال جولتنا بين الأخطاء ( وما أجملها من جولة ) ، أن معالج لغة PHP لا يعطي رقم السطر الذي حدث فيه الخطأ بشكل دقيقة في بعض الأحيان ، تعال لنأخذ مثالاً قد نفهم خلاله كيف يفهم المترجم تلك الأخطاء ...

كود code PHP:

<?php

if ($i==0) {
echo &quot;Foo&quot;;

for ($i=0; $i < 10; $i++) {
echo $i;
}

?> // السطر العاشر 10
هنا تجاهلنا القوس المتعرج Curly Bracket الخاص بجملة joomla if .. وبالتالي نتج الخطأ التالي :
كود code:

Parse error: parse error, unexpected $end in D:Program FilesxampphtdocsTZPCtest18.php on line 10

لسنا بصدد شرح طريقة نوع الخطأ أو وظيفته فقد تكلمنا عن الاخطاء في الأعلى بما يكفي .. ولكن ، لو عددنا الأسطر لوجدنا أن الأخير هو السطر رقم 10 ...!

إذاً السطر العاشر يبدو هكذا:
كود code PHP:

<?php
فما الخطأ به ؟ هذا الخطأ سينتج على أنه في نهاية البرنامج حيث أن المترجم لن يتوقع مكان إغلاق جملة joomla if أو حلقة while أو for أو غيرها .. لذلك ، فهو يقترح نقطة نهاية البرنامج .. ناهيك عن إشارة الدولار ( $ ) التي عرضها الخطأ ...

إذاً ، علينا إصلاح الخطأ بإضافة { فقط لنهاية السكربت :
كود code PHP:

<?php

if ($i==0) {
echo &quot;Foo&quot;;

for ($i=0; $i < 10; $i++) {
echo $i;
}
}

?>
تخلصنا هكذا من الخطأ ... لكن ، كيف سنضمن أثناء كتابة الكود code أننا لم ننسى إغلاق أي من هذه الأقواس ؟؟

خامساً: التنظيم أساس التخلص من الأخطاء.

عندما تتداخل الشروط والحلقات سيصعب التمييز بين أقواسها ... خذوا مني شيئاً من النصائح التالية :
1. قم بتنظيم كود codeك باستخدام مفاتيح: Space, Enter, Tab .. حتى تفهم مواضع الإغلاق .. بهذه الطريقة :
كود code PHP:

<?php

if ($var == &quot;val&quot;) {
if ($var2 == &quot;val2&quot;) {
while ($var3 < $num) {
for ($x=0; $x<5; $x++) {
// Nothing to write :P
}
}
}
}

?>
هكذا يمكنك الرجوع بشكل سهل لكل قوس ووظيفته ... ماذا لو لم ننظم الكود code ، هل سيكون مشابهاً للتالي ؟
كود code PHP:

<?php

if ($var == &quot;val&quot;) {
if ($var2 == &quot;val2&quot;) {
while ($var3 < $num) {
for ($x=0; $x<5; $x++) {
// Nothing to write :P
}
}
}
}

?>
برأيك .. أيهما أكثر منطقية ؟ الأول أوضح وأسهل وأنسق ، وأريح للقراءة .. أليس كذلك ؟؟

2. حاول أن تضع تعليقاً إذا كنت بطيء الاستيعاب .. عند نهاية كل شرط أو حلقة .. ( عند قوس الإغلاق ) ، والمثال التالي يوضح المقصد :
كود code PHP:

<?php

if ($var == &quot;val&quot;) {
if ($var2 == &quot;val2&quot;) {
while ($var3 < $num) {
for ($x=0; $x<5; $x++) {
// Nothing to write :P
} // for ($x=0; $x<5; $x++)
} // while ($var3 < $num)
} // if ($var2 == &quot;val2&quot;)
} // if ($var == &quot;val&quot;)

?>
لاحظ مدى السهولة في الكود code السابق .. كلما استخدمنا الطرق التنظيمية يمكننا البرمجة بسلاسة أكبر .. ( ومع أني لا أحبذ استخدام الطريقة الأخيرة ) ..

سادساً: فقط لعشاق الأخطاء البرمجية (http://arab4host.net/vb/showthread.php?t=80) !

إذا كنت متميزاً في كتابة الكود code وذا كود code خالٍ من الأخطاء فلا تحرم نفسك من مشاهدة تلك الرسائل الجذابة ..




عفواً ، أقصد إذا كنت تريد طباعة رسائل أخطاء خاصة بك ، فتعال نتعلم ذلك ...

دالة trigger_error تعمل على توليد رسائل خطأ قاتلة أو تحذيرية أو ملاحظات خاصة بالمبرمج ..

الصيغة العامة لكتابة تلك الدالة هي :
كود code:

bool trigger_error ( string $error_msg [, int $error_type] )

هذا يعني أن الدالة تعيد قيمة من نوع Boolean عند التنفيذ .. أي TRUE في حالة النجاح ، و FALSE في حالة تمرير نوع رسالة خاطئ ..

وهي تأخذ بداية بيان من نوع نصي String يحتوي على نص رسالة الخطأ ( يجب أن لا يتعدى 1024 حرفاً ، وإن تعدى فسيتم إهمال الحروف الزائدة ) ، ومن ثم باراميتر آخر اختياري تحدد فيه نوع الرسالة ، ونوع الرسالة يجب أن يكون من عائلة E_USER ..

الأنواع المسموحة من عائلة E_USER هي التالية :
كود code:

E_USER_ERROR : خطأ قاتل ( Fatal Error )
E_USER_WARNING : خطأ تنبيه ( Warning Error )
E_USER_NOTICE : خطأ ملاحظة ( Notice Error )

لاحظ أن الأنواع عبارة عن ثوابت Constants ،، تكتب دون علامات تنصيص ، وأي نوع آخر لن يتم قبوله وستظهر رسالة خطأ تحذيرية ..

لنفرض أننا نريد طباعة خطأ ملاحظة يقول أن اللغة المطلوبة غير موجودة مثلاً في برنامج فيه تعدد لغات .. دعونا من الفكرة ، ما يهمنا هو الخطأ :
كود code PHP:
trigger_error(&quot;The specified language is not found.&quot;, E_USER_NOTICE);
سطيبع لنا شيئاً مشابهاً للتالي :
كود code:

Notice: The specified language is not found in D:Program FilesxampphtdocsTZPCtest19.php on line 3

لاحظ أنه أعطانا رقم السطر الذي طبعنا خلاله الخطأ ..

لاحظ أن نوع الخطأ الافتراضي هو E_USER_NOTICE ، أي إذا حذفنا النوع ستطبع نفس الرسالة ، مالم نحدد نوعاً آخراً .. أما لخطأ التحذير :
كود code PHP:
trigger_error(&quot;The specified language is not found&quot;, E_USER_WARNING);
والخطأ القاتل :
كود code PHP:
trigger_error(&quot;The specified language is not found&quot;, E_USER_ERROR);
الآن ، يمكنك أن ترى رسائلك المفضلة بهذه الطريقة ...!

سابعاً: أخطاؤك تزعجك ؟ دعنا نتخلص من الرسائل ..

بعد أن أوجدنا حلاً لعشاق الأخطاء .. لا بد أن نذكر حلاً لكارهي الأخطاء أيضاً ..

لم تعد إشارة ( @ ) خاصة بالبريد الإلكتروني من الآن فصاعداً .. فهي تعني هنا إخفاء رسالة الخطأ ..

هذا المعامل الصغير في حجمه ، والكبير في مفعوله .. نضعه قبل التعبير الذي نريد التخلص من رسائل الخطأ الناتجة عنه ..

فمثلاً ، القسمة على 0 غير جائزة ، فلو جربنا الكود code التالي :
كود code PHP:

<?php

$x = 5/0;

?>
سنجد الرسالة المزعجة التالية:
كود code:

Warning: Division by zero in D:Program FilesxampphtdocsTZPCtest20.php on line 3

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

<?php

$x = @(5/0);

?>
هكذا لن تظهر رسالة الخطأ ... لكن ، ماذا لو كنا سنستخدم قيمة المتغير الناتجة ( x$ ) في خطوات لاحقة في برنامجنا ؟ ربما قد يعيق عملنا عدم معرفة الخطأ .. وكذلك يعيق عمل المستخدم ظهور تلك الرسالة المزعجة ..

لو نظرنا حولنا ، لوجدنا هناك تعبير يدعى die وهو مساوي للتعبير exit .. وحيث أننا لم نشرح طريقة أيٍ منهما فقد جاء دورهما ..

exit أو die تعبيران يقومان بطباعة البيانات الممررة إليها ( إن وجدت ) ثم إنهاء عمل السكربت ( أي لن يتم تنفيذ أي سطر بعدهما ) .. فمثلاً :
كود code PHP:

<?php

exit(&quot;Bye Bye&quot;);
echo &quot;لن يتم طباعة هذا السطر&quot;;

?>
لاحظ طباعة &quot; Bye Bye &quot; على شاشة المتصفح وعدم طباعة السطر التالي لها .. وكذلك لو استخدمنا die بدلاً من exit ..

يمكننا أيضاً استخدام تعبير خاص هو or die أو or exit .. بعد التعابير المختلفة ..

فمثلاً ، إذا كنا نخشى من وقوع خطأ في جملة joomla ما ، فيمكننا استخدام :
كود code PHP:

$x = something() or die(&quot;error&quot;);
فمثلاً ، بما أن القسمة على 0 تنتج خطأً ، فإننا نريد طباعة ذلك الخطأ بالعربية ، سنستخدم die :
كود code PHP:

$x = (5/0) or die('خطأ في عملية القسمة');
جرب رقماً غير الصفر ولاحظ اختفاء تلك الرسالة .. لا بد أنك لاحظت في المثال السابق وجود رسالتا خطأ .. واحدة تلقائية ( اعتيادية ) والأخرى خاصتك ( العربية ) ، فيبدو شكل النواتج كالتالي :
كود code:

Warning: Division by zero in D:Program FilesxampphtdocsTZPCtest20.php on line 3
خطأ في عملية القسمة

لكننا سنعود إلى المعامل ( @ ) ونخفي رسالة الخطأ الافتراضية ، وستعمل die بشكل طبيعي في نفس الوقت :
كود code PHP:

$x = @(5/0) or die('خطأ في عملية القسمة');
لاحظ أن الناتج الآن هو فقط :
كود code:

خطأ في عملية القسمة

حاول استبدال تعبير die بـ exit ، ستلاحظ طباعة النتيجة نفسها على الشاشة :
كود code PHP:

$x = @(5/0) or exit('خطأ في عملية القسمة');
لاحظ أن هذه الطريقة سوف تعمل على تعطيل كل ما يلي ذلك الخطأ ، فإن حدث خطأ واستخدمت die أو exit فلن يتم تنفيذ أي سطر لاحق ...

نرى هذه الطريقة كثيراً في اتصالات قاعدة البيانات :
كود code PHP:

$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die(&quot;فشل في الاتصال بمزود القاعدة&quot;);
$select = mysql_select_db($dbname, $connect) or die(&quot;فشل في اختيار قاعدة البيانات&quot;);
لا عليك ، لا تهتم لدوال الاتصال بقاعدة البيانات MySQL ، فنحن ما زلنا نتعلم لغة PHP ولم نصل للربط مع قواعد البيانات ...

وهكذا تكون قد تعرفت على كيفية إدارة أخطائك في لغة PHP ..

ثامناً: احذر الحلقات غير المنتهية ؟

مع أننا لم نتعلم الحلقات ، إلا أن علينا التحدث عنها حتى تكون على حذر من تركها مفتوحة عندما نتعلمها ..

الحلقة تعمل على تكرار تنفيذ أمر معين وفقاً لشرط تقوم بتحديده برمجياً ..

أي مثلاً ، نقول قم بعمل كذا وكذا ما دام المتغير x$ قيمته أقل من 5

فلو نفذنا ذلك برمجياً سيكون شيئاً كالتالي :
كود code PHP:

<?php

$x = 0;
while ($x < 5) {
// do something
}

?>
قمنا بتصفير العداد x$ ثم وضع حلقة تعمل ما دام العداد أقل من 5 ... الفكرة منطقية ، لكن ، إلى متى سيعمل العداد .. جرب تنفيذها في ذهنك ..

المرة الأولى سينفذ الامر والثانية كذلك والثالثة وهكذا حتى يتعدى الخامسة وما زال ينفذ الأمر .. لماذا ذلك ؟ لأن قيمة x$ لم تتغير ... أي أنها تساوي 0 ولم تصبح 5 حتى تتوقف الحلقة ..

ونسمي هذه الحلقة حلقة غير منتهية Infinite Loop .. وحتى نجعلها منتهية ، علينا أن نجعل x$ يزداد بمقدار واحد في كل مرة .. والزيادة بمقدار واحد هي :
كود code PHP:

$x = $x + 1;
أو بالطريقة التالية وفقاً لمعاملات PHP التي لم ندرس مفصلها بعد :
كود code PHP:

$x++;
إذاً، في كل مرة سنعمل على زيادة العداد بعد تنفيذ الأمر :
كود code PHP:

<?php

$x = 0;
while ($x < 5) {
// do something
$x++;
}

?>
هكذا ستصبح الحلقة منتهية ،، .. ومن أمثلة الحلقات غير المنتهية أيضاً ، جعل شرط الحلقة هو أن تساوي قيمة شيئاً معيناً ، ولا يتم تغيير تلك القيمة ، مثل :
كود code PHP:

<?php

$x = 0;
while ($x = 0) {
// do something
}

?>
حيث ستعمل الحلقة دون توقف .. وهذه الحلقات ستؤدي إلى تعطل البرنامج وخروج المتصفح عن الاستيعاب من كثرة المعلومات المرسلة ودون توقف .. ..

تاسعاً: أخطاء شائعة قد تواجهها أثناء عملك ..!

وأخيراً وليس آخراً، قد تواجه بعض الأخطاء في تجاربك وأعمالك تشغلك في صيانتها عن التقدم والتطور ... ومن هذه الأخطاء :

كود code:

Parse error: parse error, expecting `','' or `';'' in *** on line xx

السطر المذكور رقمه يفتقد إلى فاصلة منقوطة Semicolon ( في نهايته ، أو سطر يسبقه بسطرين أو يليه بقليل .. ( تذكر أن تنظر إلى السطور السابقة واللاحقة مباشرة للسطر المذكور ) ..

كود code:

[Notice: Undefined index: fooindex in *** on line xx

المفتاح المطلوب داخل مصفوفة معينة في السطر المذكور في ذلك الملف غير موجود فعلياً في المصفوفة ، تأكد أن المفتاح المطلوب ، هو مفتاح لأحد العناصر في تلك المصفوفة المحددة ..

كود code:

Parse error: parse error, unexpected $ in *** on line xx

ذكرناها سابقاً، وتعني أنك فقدت قوساً متعرجاً Curly Brace في أحد الجمل الشرطية أو الحلقات في الغالب في برنامجك ، راجع السطور القريبة من السطر المطلوب، أو ابحث عن حلقاتك وشروطك ورتبها كما ذكرنا في المقال ..

وهكذا ، نكون قد ألممنا بمعظم أنواع الأخطاء وطرق التعامل معها ، ولم يبق سوى أن تجرب بنفسك بعض الأكواد وتصل إلى حل أخطائها بنفسك إن شاء الله تعالى

المصدر: معهد عرب فور هوست (http://arab4host.net/vb) - من قسم: ركـــن تطويــــر المواقـــــــــــــع (http://arab4host.net/vb/forumdisplay.php?f=20)






ألعاب الأندرويد مجانا و حصريا (http://www.apotox.info/forum)




https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/482113_236967293114455_1193518507_n.png (http://www.dzbatna.com)
©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى (http://www.dzbatna.com)©

استعمل مربع البحث في الاسفل لمزيد من المواضيع


سريع للبحث عن مواضيع في المنتدى