السلام عليكم ورحمة الله و ربركاته أخى الزائر أرجو أن تعجبك مواضيع منتدانا ياريت تشاركنا مواضيعك من خلال تسجيلك في منتدنا ....وشكرا لكم ...
السلام عليكم ورحمة الله و ربركاته أخى الزائر أرجو أن تعجبك مواضيع منتدانا ياريت تشاركنا مواضيعك من خلال تسجيلك في منتدنا ....وشكرا لكم ...
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.


مرحبا بزائرنا العزيز و الغالي في منتديات العلم نور
 
الرئيسيةأحدث الصورالتسجيلدخول

 

 اخطاء php و الحلول البرمجية في بناء المواقع

اذهب الى الأسفل 
كاتب الموضوعرسالة





تاريخ التسجيل : 01/01/1970

اخطاء php و الحلول البرمجية في بناء المواقع Empty
مُساهمةموضوع: اخطاء php و الحلول البرمجية في بناء المواقع   اخطاء php و الحلول البرمجية في بناء المواقع Emptyالأحد فبراير 26, 2012 8:12 pm

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



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




    1. فهم معنى الأخطاء البرمجية وأخطاء PHP بشكل خاص.
    2. معرفة أنواع أخطاء الـ PHP ودلائل كل منها.
    3. تعلم كيفية تخطي الكثير من الأخطاء وحلها بتعديل الكود.
    4. إنتاج إخطاء خاصة بك من خلال لغة PHP.
    5. تجاهل أخطاء PHP وتوليد أخطاء خاصة بدلاً منها.
    6. بعض النصائح الهامة في تفادي المشاكل والأخطاء.


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

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

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

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

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

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

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

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

ERROR_TYPE: ERROR_MSG in FILE_PATH on line XX

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

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

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

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

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

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

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

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

1. خطأ قاتل Fatal Error

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

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

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

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

<?php

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

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

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

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

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

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

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

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

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

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

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

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

<?php

echo "Hello"
echo "<br>How r u?";

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

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

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

<?php

echo "Hello";
echo "<br>How r u?"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?php

Echo "Start";
include ("blah-blah-blah.php");
Echo "End";

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

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 كالتالي :
كود:

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 من الملف الذي أدخلنا به الكود لوجدناه هذا :
كود PHP:
include ("blah-blah-blah.php");
والخطأ
هو أنه لم يتم العثور على الملف أو المجلد المطلوب ، ولإصلاح الخطأ يجب أن
نبحث على اسم الملف الذي نطبعه ونتأكد من وجوده في مكانه ..

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

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

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

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

<?php

ini_set("error_reporting", E_ALL);
echo $var;

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

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

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

<?php

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

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

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

<?php

ini_set("error_reporting", E_ALL);
echo MY_NAME;

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

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

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

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

<?php

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

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

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

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]

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

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

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

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

<?php

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

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

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

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

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

كود PHP:

<?php

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

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

<?php

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

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

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

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

كود PHP:

<?php

if ($i==0) {
echo "Foo";

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

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

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

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

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

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

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

<?php

if ($i==0) {
echo "Foo";

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

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

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

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

<?php

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

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

<?php

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

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

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

<?php

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

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

سادساً: فقط لعشاق الأخطاء البرمجية !

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?php

$x = 5/0;

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

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

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

<?php

$x = @(5/0);

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

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

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

<?php

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?php

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

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

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

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

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

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

<?php

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

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

<?php

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

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

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

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

كود:

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

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

كود:

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

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

كود:

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

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

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




المصدر : freeforarab
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
اخطاء php و الحلول البرمجية في بناء المواقع
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1
 مواضيع مماثلة
-
» دروس بناء سكربت دليل المواقع بالدريم ويفر DreAmWeAveR + مثال العمل
» حلول لبعض المشاكل البرمجية الشائعة
»  سورة النور ودورها في بناء الأسرة المسلمة
» لكل عشاق الدريم ويفر - دروس كاملة في بناء سكربت تراجم المشايخ والعلماء - DreAmWeAveR
» الجيزة مدينة بناء الاهرامات المفقوده - فيلم وثائقي - تقديم قناة العربي- افلام وثائقية

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
 :: برمجة وتطوير وإنترنت :: مشاكل وحلول برمجية-
انتقل الى: