Труднее всего обнаружить ошибки в логике программы. В этом случае не будет
подсказки, с какой строки начинать поиск. При возникновении такого рода
ошибок вы просто видите, что полученные результаты отличаются от ожидае
мых. Чтобы найти, какие ошибки были сделаны и где, необходимо провести
небольшое «детективное расследование».
В этом вам помогут три приема:
- использование комментариев;
- применение инструкции 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 ?>