تصميم موقع الويب الخاص بك مع PHP و MySQL


الدرس: النجدة ! تعطل سكريبتscript الخاص بي!


الصفحة السابقة
فكيف فشل السكريبت Scriptالخاص بك ، ويظهر لك PHP أخطاء غير مفهومة؟
لا تقلق بشأنك: إنه أمر طبيعي تمامًا ، ولن تنجح أبداً في كتابة كود في المرة الأولى (على أي حال ، أبداً!).
يمكن أن تحدث الآلاف من رسائل الخطأ المختلفة (حسنًا ، لا يوجد شيء مطمئن للغاية حتى الآن) ، وليس لدي حقًا إمكانية عمل قائمة كاملة ... لكن يمكنني تقديم الأخطاء الأكثر شيوعًا ، والتي يجب أن تحل الغالبية العظمى من مشاكلك. 

الأخطاء الأكثر شيوعا


أعتقد أنه من السهل التحدث عن الأخطاء "الشائعة" لأنك ستجد أن بعض الأخطاء تظهر أكثر من غيرها.
سنراجع الأخطاء التالية:
  • خطأ في التحليل  Parse error ;
  • وظيفة غير معروف  Undefined function ;
  • عدد المعلمات غير صحيح Wrong parameter count.
خطأ في التحليل Parse error
إذا كان علينا أن نقول أنه يوجد خطأ أساسي واحد ، فسيكون ذلك بالتأكيد خطأً واحدًا. لا يمكن البرنامج في PHP دون أن يكون لديك الحق في يوم واحد.
تبدو رسالة الخطأ التي تظهر لك كما يلي:

Parse error: parse error in file.php on line 15
تشير هذه الرسالة إلى حدوث خطأ في file.phpالسطر 15. عمومًا ، هذا يعني أن مشكلتك في السطر 15 ، ولكن هذا ليس هو الحال دائمًا (من السهل جدًا ، إن لم يكن). في بعض الأحيان يكون السطر السابق هو المشكلة: لذا فكر في البحث حول الخط المشار إليه.
مع محرر نصوص متخصص مثل Notepad ++ ، لديك أرقام الأسطر على يسارك ، كما في الشكل التالي.
web dynamique php
حسنا ، ما هو خطأ التحليل ؟ خطأ التحليل هو في الواقع بيان PHP مشوه. يمكن أن يكون هناك عدة أسباب:
  • لقد نسيت الفاصلة المنقوطة في نهاية البيان. نظرًا لأن كل التعليمات يجب أن تنتهي بفاصلة منقوطة ، فإذا نسيت وضع واحدة ، فسيؤدي ذلك إلى حدوث خطأ في التحليل . مثلا :
    
    $id_news = 5
    
    سيولد خطأ في التحليل . إذا وضعت الفاصلة المنقوطة في النهاية ، فسيكون كل شيء على ما يرام!
    
    $id_news = 5;
    
  • لقد نسيت إغلاق علامة اقتباس (أو علامة اقتباس أحادية ، أو قوس) . مثلا :
    
    echo "Bonjour !;
    
    ... فقط أغلق علامات الاقتباس بشكل صحيح ولن تواجه أي مشكلة:
    
    <?php
    echo "Bonjour !";
    
  • لقد كنت مخطئًا في السلسلة ، ربما تكون قد نسيت نقطة:
    
    <?php
    echo "J'ai " . $age " ans";
    
    بمجرد تصحيح الخطأ ، فإنه يعطي:
    
    <?php
    echo "J'ai " . $age . " ans";
    
  • يمكن أن يكون أيضًا قوسا مغلقًا سيئًا ( if على سبيل المثال) . تحقق من أنك قمت بإغلاق جميع الأقواس بشكل صحيح. إذا نسيت إغلاق أحدها ، فمن المحتمل أن يخبرك خطأ التحليل أن الخطأ موجود في السطر الأخير من الملف (أي ، في السطر 115 إذا كان الملف الخاص بك يحتوي على 115 سطرًا).
لذا ، إذا قيل لك خطأ في السطر الأخير ، فمن المحتمل أن يكون من الضروري إعادة قراءة ملف PHP بأكمله!
إذا تم إخبارك أن الخطأ موجود في السطر 15 وأنك لا ترى أي خطأ في هذا السطر ، فلا تتردد في البحث عن الخطأ في السطر أعلاه ، يمكن العثور عليه هناك أن تكون!
وظيفة غير محددة Undefined function 
خطأ كلاسيكي آخر: الوظيفة غير المعروفة. تظهر لك رسالة الخطأ هذه:

Fatal Error: Call to undefined function: fonction_inconnue() in fichier.php on line 27
هناك عليك أن تفهم أنك قد استخدمت وظيفة غير موجودة.
احتمالان:
  • هي وظيفة في الحقيقة ليست موجودة . من المحتمل أنك قمت بخطأ مطبعي ، تحقق من وجود وظيفة إملائية مماثلة ؛
  • إما أن الوظيفة موجودة بالفعل ، لكن PHP لا يتعرف عليها. هذا لأن هذه الوظيفة في امتداد PHP الذي لم تقم بتمكينه . على سبيل المثال ، إذا حاولت استخدام الوظيفة imagepng  عندما لم تقم بتنشيط المكتبة الضرورية للصور في PHP ، فسيتم إخبارك بأن الوظيفة غير موجودة. قم بتنشيط المكتبة التي تستخدم الوظيفة وسيتم تعيين كل شيء.
شيء أخير: من الممكن أيضًا محاولة استخدام وظيفة غير متوفرة في إصدار PHP لديك.
تحقق في الدليل الذي تتوفر فيه إصدارات PHP هذه الوظيفة.
عدد المُدخلات غير صحيح Wrong parameter count
إذا كنت تستخدم دالة بشكل سيء ، فستحصل على هذا الخطأ:

Warning: Wrong parameter count for fonction() in fichier.php on line 112
هذا يعني أنك نسيت المُدخلات الخاصة بالوظيفة ، أو حتى أنك وضعت الكثير منها. إذا كان هناك وظيفة توفرها PHP ، قم بزيارة الوثائق  وقم  بالاطلاع على طريقة استدعاء الوظيفة لتحديد عدد المُدخلات وتلك التي هي اختيارية.
على سبيل المثال ، fopen تتطلب الوظيفة مُدخلين على الأقل: الأولى لفتح اسم الملف والثانية لوضع مفتوح (للقراءة فقط ، والكتابة ، وما إلى ذلك). إذا وضعت اسم الملف فقط لفتح ، مثل هذا:

$fichier = fopen("fichier.txt");
... سوف تحصل على الخطأ " Wrong parameter count " . لذلك تذكر أن تضيف المٌدخل المفقود ، على سبيل المثال مثل هذا:

$fichier = fopen("fichier.txt", "r");
في الإصدارات الحالية من PHP ، تمنحك رسالة الخطأ عدد المٌدخلات التي نسيتها!

بعض الأخطاء النادرة


أخطاء PHP متنوعة جدا. لذلك لا تتوقع مني أن أدرج هنا أخطاء 3946 PHP ، لن أكون قادرًا على ذلك (لم أواجهها جميعًا بعد ، لكن ذلك لن يكون طويلًا في وتيرة عملي).
سأريكم بعض الأخطاء النادرة قليلاً من "خطأ التحليل" ، لكن من المحتمل أن تصادفك ذات يوم. إذا كان بإمكاني مساعدتك بالفعل في هذه الأخطاء ، فسيكون ذلك جيدًا.
سوف نرى الأخطاء:
  • "الرؤوس المرسلة بالفعل بواسطة ..."؛  Headers already sent by…
  • "الصورة تحتوي على أخطاء" ؛ The image contains errors
  • "تم تجاوز الحد الأقصى لوقت التنفيذ". Maximum execution time exceeded
تم إرسال الرؤوس بالفعل بواسطة ... HEADERS ALREADY SENT BY…
هذا خطأ كلاسيكي عند العمل مع الجلساتsessions أو مع ملفات تعريف الارتباط: cookies

Cannot modify header information - headers already sent by ...
ماذا يجب أن نفهم من ذلك؟
headers هي معلومات تٌرسل قبل كل شيء إلى متصفح الزائر. لقول "ما ستتلقاه هو صفحة HTML " أو "ما ستتلقاه هو صورة PNG " أو "تسجيل ملف تعريف ارتباط".
كل هذه الأشياء يجب القيام بها قبل إرسال أي كود HTML . في PHP ، تسمى الوظيفة التي ترسل معلومات headers header()  . سنستخدمها بشكل خاص في الفصل الخاص بإنشاء الصور في PHP للإشارة إلى أن المرء يرسل صورة وليس صفحة HTML .
هناك وظائف أخرى ترسل headers بمفردها . هذا هو حال  session_start() و setcookie() .
ما تحتاج إلى تذكره هو أن كل من هذه الوظائف يجب أن تستخدم في بداية كود PHP الخاص بك . لا يجب وضعه من قبل ، وإلا فإنه سيتسبب في الخطأ " " Headers already sent by…
كود المثال الذي ينشئ الخطأ:

<html>
<?php session_start();?>
هنا ، كان لدي سوء حظ لوضع بعض HTML من قبل session_start()، وهذا هو سبب الخطأ . ضعها session_start() أولاً ، ولن تواجه أي مشكلة:
<html>
تحتوي الصورة على أخطاء The image contains errors
إنه المستعرض الذي يعطيك رسالة الخطأ هذه وليس PHP .
تحدث هذه الرسالة عند العمل مع مكتبة GD  . إذا ارتكبت خطأً في الكود (على سبيل المثال "خطأ تحليل عادي") ، فسيتم كتابة هذا الخطأ في الصورة . نتيجة لذلك ، لن تكون الصورة صالحة ولن يتمكن المستعرض من عرضها.
حسنا ، الخطأ هو في الصورة. ولكن كيف نفعل لجعل الخطأ يظهر ؟
احتمالان:
  • يمكنك حذف السطر التالي في الكود:
    
    <?php
    header ("Content-type: image/png"); 
    ?>
    
    سيظهر الخطأ بدلاً من الرسالة "تحتوي الصورة على أخطاء"؛
  • يمكنك أيضًا عرض التعليمات البرمجية المصدر للصورة (كما لو كنت ستنظر إلى مصدر HTML للصفحة ، باستثناء أنها صورة) .
في كلتا الحالتين ، سترى رسالة الخطأ تظهر. من هناك ، عليك فقط إصلاح الخلل!
تم تجاوز الحد الأقصى لوقت التنفيذ MAXIMUM EXECUTION TIME EXCEEDED
هذا هو نوع الخطأ الذي يحدث غالبًا بسبب حلقة لا نهائية:

Fatal error: Maximum execution time exceeded in fichier.php on line 57
تخيل أنك تقوم بعمل حلقة  while ، لكنها لا تتوقف أبدًا: سيتم تشغيل نص PHP الخاص بك في حلقة دون توقف.
لحسن الحظ ، يحصر PHP وقت تشغيل صفحة PHP على 30 ثانية افتراضيًا. إذا استغرق إنشاء الصفحة أكثر من 30 ثانية ، يتوقف PHP مع الإشارة إلى أنها طويلة جدًا. وهذا جيد ، لأنه بخلاف ذلك قد يؤدي إلى إبطاء الخادم بالكامل وجعل الوصول إلى موقعك غير ممكن!
فيما يلي مثال على حلقة  while لن تتوقف أبدًا:

<?php
$nombre = 5;
while ($nombre == 5)
{
    echo 'Zéro ';
}
?>
كما ترون ، لن يتوقف كود PHP أبدًا نظرًا لأن $nombre يساوي دائمًا 5 ...
إذا كان لديك الخطأ "تم تجاوز الحد الأقصى لوقت التنفيذ" ، فسيتعين عليك العثور على حلقة لا تتوقف أبدًا ، لأنها تسبب هذه المشكلة.
كن مطمئنًا: الحد الأقصى هو 30 ثانية ، ولكن لن يتم مواجهتك أبدًا. بشكل عام ، يستغرق الخادم أقل من 50 مللي ثانية لتحميل صفحة PHP (نحن بعيدون جدًا عن 30 ثانية! )