Простейшие ошибки

Автор: brian Сайт: http://webpro.narod.ru
   
   Не думаю, что напоминание о самых распространенных ошибках будет Вам сильно вредить. По крайней мере, будет полезно знать и постоянно вспоминать о том, что можно сделать не так. ПО ходу материала я буду стараться давать Вам другие советы по тем или иным ошибкам или подводным камням, встречающимся в процессе разработки. Однако тут перечислены несколько самых простейших ошибок, с которыми сталкивается каждый, кто задается целью написать программу.
   
   Самое распространенное - не стоит завершающая оператор точка с запятой. Не ставится она только в конструкции if () {} {} Основной признак - ошибка в следующей строке за тем оператором, в котором нет точки с запятой. В окно браузера, если только это разрешено, посылается сообщение об ошибке, имя и путь к файлу, в котором произошла ошибка и порядковый номер строки (вот где нам пригодится нумерация строк!). Выглядит это следующим образом:
   Parse error: parse error in c:\usr\local\public_html\host\virtual\index.phtml on line 2
   
   При сравнении на равенство двух переменных ставится два знака равенства. Исключений нет. Основной признак - скрипт работает, но не так как это от него ожидается. Найти такую ошибку бывает порой очень трудно. Ведь сообщений не появляется, так как с точки зрения парсера тут нет ошибки. Бороться можно только одним способом – внимательно писать сравнения и не забывать об этом правиле.
   В конструкции if () {} {} отсутствует или стоит лишний завершающий знак - } Исключений нет. Признак этой ошибки очень простой, и позволяет детектировать эту ошибку очень просто. При запуске скрипта на выполнение интерпретатор выдает ошибку в самой последней строчке кода, где стоит завершающий тег ?>. Однако найти где именно не стоит кавычка, бывает не так уж и просто. Придется перелопатить весь код. Иногда меня выручала обычная интуиция – вместо того, что бы искать ошибку, исследуя весь код, я ставил ее в предполагаемом месте и смотрел, как работает программа. Раза с 5-го все получалось. Но это уже из области личных пристрастий.
   А вот теперь более сложный вопрос по ошибкам. На самом деле, его следовало бы рассмотреть чуть позже, после того, как мы рассмотрим примеры работы сессий и cookie. Что это такое? Мы познакомимся чуть позже на примерах, и Вы все узнаете. Но раз уж тут у нас разговор зашел об элементарных ошибках программиста, я не могу не упомянуть одну очень важную и нужную проблему. Речь идет о заголовках.
   
   Давайте рассмотрим, как вообще работает браузер с сервером. А работает он с ним по специальному протоколу, который называется «HTTP». Когда Вы вводите адрес в адресной строке браузера и нажимаете ввод, программа посылает именно HTTP-запрос серверу, и на этот запрос сервер всегда отвечает, если только он доступен. Так вот, первыми в ответе сервера всегда идут так называемые «HTTP»-заголовки, и только потом уже могут идти какие-то символы, HTML, или картинки. Сервер устроен так, что заголовки посылаются автоматически перед любыми символами, даже перед пробелом. Это значит, что если хоть один символ ушел в браузер, заголовки уже давно там же и вторично их послать никак нельзя. А PHP умеет работать с этими заголовками, используя их при работе, например, с сессиями, cookie, header и т.д.
   
   Вот тут-то и возникает эта ошибка. Ее текст в окне браузера может выглядеть примерно так: Warning: Cannot add header information - headers already sent by (output started at /site/name.phtml:3) on line 5. Анализ этой строчки дает нам следующее. Ошибка отправки заголовков. Дальше РНР сообщает, в каком скрипте и в какой его строке (output started at /site/name.phtml:3) произошел вывод информации, вызвавший автоматическую посылку заголовков. Очень легко найти и исправить. Может быть там HTML теги, может быть, echo, а может и просто пустая незамеченная строка или пробел перед первым тегом <?.
   
   Очень часто такую ошибку вызывает файл, подключаемый через include, в котором либо есть какой-то вывод, либо пустая строка после закрывающего PHP тега - обнаружить ее очень трудно. Для решения этой проблемы нужно функцию header() (или session_start(), setcookie), поместить ДО любого вывода в браузер. Просто перенести повыше в скрипте.
   
   Эта ошибка появляется не оттого, что у вас в скрипте "что-то написано выше". А потому, что РНР выводит что-то в браузер. Это не обязательно код. Это может быть сообщение об ошибке, может быть пробел или HTML тег. Речь идет о любом символе, отправленном в браузер, а не только о тех, которые браузер отображает неискушенному пользователю. У HTML страниц есть исходный текст, и именно он является результатом работы PHP скрипта, а не то, что показывает на экране браузер пользователю. Добраться до исходного кода HTML можно достаточно легко, надо в браузере найти в меню ВИД-Просмотр HTML-кода.
   
   Не забывайте об этом простом правиле, и ошибка не будет Вас тревожить.
   
   Пример по сравнению чисел
   Придумаем пример немного посложнее предыдущего. Задача стоит перед нами вот какая - выбрать из двух чисел большее, и вывести его на экран. Если числа равны - вывести сумму чисел. Просто? Да конечно. Тем более нам, уже знакомым с основами PHP.
   
   <?php
   $w = "4"; // первое число
   $e = "6"; // второе число
   if ( $w == $e )
   
   {
   
   echo $w+$e; // если 1-е и 2-е равны выводим их сумму
   
   exit;
   
   }
   if ( $w > $e ) { echo $w; } else { echo $e; }
   
   // если нет – и одно больше другого – выводим числа
   exit;
   ?>
   
   Вот и весь скрипт! На входе имеем два числа. Не важно, откуда они берутся, важно то, что мы потом с ними делаем. А делаем мы с ними вот что.
   
   Сначала пытаемся проверить, равны числа или нет. Обратите внимание на двойной знак равенства в операторе if. Дело в том, что если оставить тут один знак равенства, переменной $w будет присвоено значение переменной $e. А в нашем случае надо проверить, равны ли переменные. Это и достигается двумя знаками равенства. Другими словами, если Вам надо провести сравнение, равны ли две переменных, не забудьте поставить два знака равенства - это вторая самая распространенная ошибка начинающих программистов. Поставите один - и будете очень долго искать правды от Вашего скрипта, а работать он в упор не будет.
   
   Если числа равны, выводим их сумму, что достигается простым знаком плюс между переменными и командой «echo» а потом завершаем скрипт, если это надо командой «exit». Этого, кстати можно было бы и не делать, в этом случае интерпретатор пошел бы дальше обрабатывать код, и в конце его нашел бы туже команду, но... Время, братцы, время... Старайтесь не заставлять интерпретатор производить ненужные действия, и он отплатит Вам приличной скоростью работы.
   
   Если же числа не равны, код вывода на экран суммы (обратите внимание, что он заключен в кавычки типа {}) будет проигнорирован, и интерпретатор продолжит свою работу дальше. А дальше у нас идет проверка, какая из переменных больше. Само собой, что если переменные не равны, то одна из них больше, а другая меньше.
   
   Итак, если $w>$e, выводим на экран $w, так как оно больше. А если условие не выполняется (короче - $w<=$e) , выполняется конструкция в скобках после «else». Но так как на равенство мы уже проверяли вначале скрипта, то эта конструкция выполнится, только если $w<$e. Вот тут то и пригодился нам оператор «exit» в предыдущей строке, так как если бы его не было, на экран кроме суммы переменных была бы выдана переменная $e.
   
   После обработки всех строк интерпретатор завершает свою работу, а браузеру передается результат в виде одного числа.
   

Опубликовано: HTTP://WWW.R-T-F-M.INFO, pauk ©® 2000-2011.
All rights reserved.
При перепечатки ссылка на сайт обязательна.
Мнение администрации сайта не всегда совпадает с мнением автора..