Поиск
Отслеживание ошибок
Труднее всего обнаружить ошибки в логике программы. В этом случае не будет подсказки, с какой строки начинать поиск. При возникновении такого рода
ошибок вы просто видите, что полученные результаты отличаются от ожидае мых. Чтобы найти, какие ошибки были сделаны и где, необходимо провести небольшое «детективное расследование».
В этом вам помогут три приема:
- использование комментариев;
- применение инструкции print ( ) ;
- отслеживание переменных.
Комментарии можно использовать не только для документации ваших сце нариев, но и для исключения проблематичных строк кода. Если вы видите со общение о том, что ошибка обнаружена в строке 12, закомментируйте эту стро ку. Если в результате этого действия ошибка не исчезла, значит, она в другом месте.
В более сложных сценариях я часто использую инструкцию print ( ) , чтобы на экран выводились сообщения о том, что происходит во время исполнения сценария. Если сценарий состоит из нескольких шагов, порой нелегко опреде лить, на каком из .них возникла проблема. С помощью инструкции print ( ) вы можете сузить поиск до одного шага.
Часто причиной некорректной работы сценария является обращение к несу ществующей переменной, или к существующей, но с ошибочным именем. Про верить это можно с помощью инструкции print ( ) , которая позволяет отслежи вать значения переменных в процессе выполнения сценария. В этом случае вы будете знать наверняка, какие именно переменные вызвали проблему. Эти приемы я покажу, модифицировав страницу HandleLogin.php (см. нача ло данной главы) и показав, как отладить сценарий, если получены непредска зуемые результаты.
Отладка сценария
- Откройте сценарий HandleLogin.php в текстовом редакторе (см. также листинг 14.2).
- Удалите первую пустую строку. Теперь на первой строке будет размещен открывающий РНРтэг.
- После условной конструкции headers_sent ( ) (строка 2) добавьте инструк цию print ()
- После конструкции else (строка 5) добавьте еще три инструкции print ( ) .
- После второй условной конструкции i f (строка 9) добавьте еще одну ин струкцию print О и закомментируйте строку с функцией header ( ) .
- После строки с else (строка 13) добавьте еще одну инструкцию print ( ) , после чего закомментируйте строку с функцией header ( ) .
- Сохраните сценарий как HandleLogin.php (листинг 14.3), загрузите его на сервер в один каталог с login. php и протестируйте обе страницы в браузе ре (рис. 14.814.10).
<?php
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");
Если проблема возникла изза того, что заголовки были уже отправлены, это будет ясно при тестировании.
} 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. Вы имеете возможность отсле дить значения переменных по всему сценарию, распечатывая их в ключевых моментах.
if (($UserName == "Larry") && ($Password == "LarryPass") ) {
print ("<P>Match! " ) ,•
// header ("Location: index. php?UserName=$UserName" ) ;
exit;
} else {
Напечатав слово "Match! ", вы будете знать, проверены ли имя пользовате ля и пароль, что позволит исключить возможную причину ошибки. Так как вы отлаживаете сценарий, то можете закомментировать вызов функ ции header ( ) , поставив в начале строки два обратных слеша. Закончив отлад ку, удалите эти знаки, и команда снова будет работать.
print ("<P>Not a Match!");
// header ("Location: login. php?Message=Inval id ");
exi t;
Листинг 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 ?>

