Поиск

Отслеживание ошибок

Труднее всего обнаружить ошибки в логике программы. В этом случае не будет подсказки, с какой строки начинать поиск. При возникновении такого рода

ошибок вы просто видите, что полученные результаты отличаются от ожидае мых. Чтобы найти, какие ошибки были сделаны и где, необходимо провести небольшое «детективное расследование».

В этом вам помогут три приема:

  • использование комментариев;
  • применение инструкции print ( ) ;
  • отслеживание переменных.

Комментарии можно использовать не только для документации ваших сце нариев, но и для исключения проблематичных строк кода. Если вы видите со общение о том, что ошибка обнаружена в строке 12, закомментируйте эту стро ку. Если в результате этого действия ошибка не исчезла, значит, она в другом месте.

В более сложных сценариях я часто использую инструкцию print ( ) , чтобы на экран выводились сообщения о том, что происходит во время исполнения сценария. Если сценарий состоит из нескольких шагов, порой нелегко опреде лить, на каком из .них возникла проблема. С помощью инструкции print ( ) вы можете сузить поиск до одного шага.

Часто причиной некорректной работы сценария является обращение к несу ществующей переменной, или к существующей, но с ошибочным именем. Про верить это можно с помощью инструкции print ( ) , которая позволяет отслежи вать значения переменных в процессе выполнения сценария. В этом случае вы будете знать наверняка, какие именно переменные вызвали проблему. Эти приемы я покажу, модифицировав страницу HandleLogin.php (см. нача ло данной главы) и показав, как отладить сценарий, если получены непредска зуемые результаты.

Отладка сценария

  1. Откройте сценарий HandleLogin.php в текстовом редакторе (см. также листинг 14.2).
  2. Удалите первую пустую строку. Теперь на первой строке будет размещен открывающий РНРтэг.
  3. <?php
  4. После условной конструкции headers_sent ( ) (строка 2) добавьте инструк цию print ()
  5. if ( headers_sent() ) {
    print ("Headers have been sent. Not attempting to verify.<P>\n"); .
    print ("Cannot process your reguest due to a system error!/n");

    Если проблема возникла изза того, что заголовки были уже отправлены, это будет ясно при тестировании.

  6. После конструкции else (строка 5) добавьте еще три инструкции print ( ) .
  7. } else {
    print ("Headers have not been sent. Attempting to verify.<P>\n");
    print ("UserName is $UserName. <P>");
    print ("Password is $Password. <P>");

    Первая инструкции print () связана с расположенной выше и указывает, что проблема не зависит от функции header ( ) .

    Две последующие инструкции print () указывают, какие значения были по лучены для переменных $UserName и $Password. Вы имеете возможность отсле дить значения переменных по всему сценарию, распечатывая их в ключевых моментах.

  8. После второй условной конструкции i f (строка 9) добавьте еще одну ин струкцию print О и закомментируйте строку с функцией header ( ) .
  9. if (($UserName == "Larry") && ($Password == "LarryPass") ) {
    print ("<P>Match! " ) ,•
    // header ("Location: index. php?UserName=$UserName" ) ;
    exit;
    } else {

    Напечатав слово "Match! ", вы будете знать, проверены ли имя пользовате ля и пароль, что позволит исключить возможную причину ошибки. Так как вы отлаживаете сценарий, то можете закомментировать вызов функ ции header ( ) , поставив в начале строки два обратных слеша. Закончив отлад ку, удалите эти знаки, и команда снова будет работать.

  10. После строки с else (строка 13) добавьте еще одну инструкцию print ( ) , после чего закомментируйте строку с функцией header ( ) .
  11. print ("<P>Not a Match!");
    // header ("Location: login. php?Message=Inval id ");
    exi t;
  12. Сохраните сценарий как HandleLogin.php (листинг 14.3), загрузите его на сервер в один каталог с login. php и протестируйте обе страницы в браузе ре (рис. 14.814.10).
  13. Листинг 14.5 т Можно модифицировать страницу HandleLogin.php для от ладки, если она странно работает и выдает непредсказуемые результаты. Ис пользование инструкций print ( ) , отслеживание переменных и подробное комментирование строк кода поможет быстро решить любую проблему.

    1 <?php
    2 if ( header s_sent () ) {
    3 print ("Headers have been sent. Not attempting to verify. <P>\n" );
    4 print ("Cannot process your request due to a system error !\n");
    5 } else {
    6 print ("Headers have not been sent. Attempting to verify.<P>\n");
    7 print ("UeerName is $UeerName. <P>");
    8print ("Password is $Password. <P>");
    9if (($UserName == "Larry") && ($Password == "LarryPass")) {
    10print ("<P>Match!");
    11 // header ("Location: index.php?TJeerName=$TJserName") ;
    12exit;
    13} else {
    14 print ("<P>Not a Match!");
    15 header ("Location: login.php?Message=Invalid");
    16exit;
    17}
    18 }
    19 ?>