Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Въведение в Debugging и проверка за грешки
  1. Какво е Дебъг
  2. Полезни функции
     
Автор  plamenSm (04.03.2008 15:59)  съобщение до автора
Погледнат  2714 пъти  добави към любими
Оценка  добави коментар
Гласове  2  изпрати на приятел
Коментари  (9)  абонирай се за PHP
    Страница 1 / 2

 



Тъй, като няма реално точен превод на термина "Debug" по-нататък ще го използваме.
"Дебъг" е вече приет термин и мисля, че не би притеснило никой в областта.
"Бъг" – буквално преведено е "буболечка". Иначе казано – малка грешка в програмата, която се открива трудно и сработва само при определени обстоятелства.


Какво е Дебъг

Прост и ефикасен метод за откриване на грешки. Имате грешка – открийте я!

В тази част ще ви запознаем с с някои от основните методи за откриванена грешки. Също така и с някои от вградените в PHP функции, които са предназначени за тази цел и биха ви помогнали, като например var_dump().

Съществуват разбира се и други мощни средсва за пълноценен дебъг, като поставяне на точки на прекъсване, набюдаване на променливи, но това не е целта на тази част.

Първо правило: винаги проверявай!

Това е моето първо правило, когато пиша приложения. Винаги е възможно в кода да има грешка. Винаги проверявайте резултата!

Ето един примерен фрагмент, в който няма синтактична грешка:

CODE
1
2
3
4
5
6

<?php
$name = $_GET['name'];
echo 'Hello ' . $name . ', welcome to our website!';
...
?>

Ако този скрипт получи HTTP-GET заявка от вида:

http://www.example.com/myScript.php?name=Alan

Резултата ще бъде коректен:

Hello Alan, welcome to our website!

Но какво ще стане, ако name няма стойност параметъра. Ето резултата:

Hello , welcome to our website!

Съгласете се, че не е професионално.

За да разрешим проблема е необходимо просто да проверим стойността на параметъра name. Така скрипта ни ще изглежда по следния начин:

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if ($_GET['name'])
{
   
$name = $_GET['name'];
}
else
{
   
$name = 'Visitor';
}

echo 'Hello ' . $name . ', welcome to our website!';
...
?>

Както виждате, тук проверяваме дали параметъра name има стойност и ако не, му присвояваме подразбираща се такава – в случая „Visitor”.

Сега нека стартираме нашия скрипт, без парамерър name. Ето и резултата:

Hello Visitor, welcome to our website!

Примерът до тук показа важността на проверките за очаквани грешки при приемане на http заявки.

В следващия пример ще покажем грешки и тяхната обработка при работа с база данни. Примера е с MySQL. Разгледайте следващия код (грешката в SQL кода е умишлена и ще бъде разгледана по-долу):

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

// Свързване с MySQL базата 'myDatabase'  
$db = mysql_connect('localhost', 'username', 'password');
mysql_query('USE myDatabase');

// Извличане на 5-те заглавия с най-висок рейтинг от таблица „rating”
$top5_q = "SELECT id, title, MAX(rating) FROM rating ORDER BY articles DESC LIMIT 5";
$top5_r = mysql_query($top5_q);

// Да изчетем резултата...
while ($top5_a = mysql_fetch_array($top5_r))
{
   
// ... и да формираме html кода
   
echo $top5_a['title'] . '<br />';
}
...
?>

На пръв поглед - напълно коректен код. Първо отваряме връзка с базата данни, конструираме SQL заявка и извеждаме резултата в подреден списък. Но да приемем, че не работи. Нещо пречи на нормалната работа на скрипта. Имаме "бъг", но нямаме идея къде може да бъде.

Сега нека добавим код, който ще ни помогне да открием проблема.

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

CODE
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// Свързване с MySQL базата 'myDatabase'  
$db = mysql_connect('localhost', 'username', 'password');

// Проверка дали връзката е успешна

if (!$db)
{
   
// ...Има проблем! Спираме скрипта и показваме грешката!    die('Could not connect to the database: ' . mysql_error());
}
...
?>

Както забелязвате, важно е да поставяме проверки на критични места в програмите. В примера, ако $db има стоност false, тоест няма връзка с базата данни, ние прекратяваваме работата на скрипта с фунция die() и съответното съобщение за грешка върнато от функция mysql_error().

Функцията mysql_error() връща текст, който би ни помогнал да установим причината за проблема при свързването с базата данни. Тоест защо е пропаднал израза

CODE
1
2
3
<?php
$db = mysql_connect('localhost', 'username', 'password');
?>

Ако сега, след като сме изчисили „бъговете”, стартираме нашия скрипт, ще видим, че той работи, но все още не получаваме желания резултат. Може би сте забелязали нередност в SQL синтаксиса?

Сега ще разгледаме изпълнението на SQL заявката към MySQL сървъра.

Ще разгледаме случай в който заявката не е коректна и функцията mysql_query() връща грешка.

Техниката е същата, както в предния пример. Необходимо е да с провери дали заявката е изпълнена успешно и да се реагира според резултата. Отново ще използваме комбинацията от функциите die() и mysql_error().

Ето и кода:

CODE
1
2
3
4
5
6
7
8
9
10
11
<?php
$top5_q = "SELECT id, title, MAX(rating) FROM rating ORDER BY articles DESC LIMIT 5";

$top5_r = mysql_query($top5_q);
if (!$top5_r)
{
   
// Грешка при отваряне на курсора!
   
die('Error in query: ' . mysql_error());
}
...
?>

Грешката е очевидна. Използването на SQL функцията max() без клауза "Group By". Сега ще получим съобщение за грешка (може да варира в зависимост от версиите): "Mixing of GROUP columns ...."

Проблемът е ясен. Премахването на ненужното поле MAX(rating) решава проблема.

Надяваме се, че с тези примери и коментари помогнахме значително да подобрите опита си в откриването на грешки. Въпреки, че добавянето на допълнителен код и усложняваняване на програмите изглежда неоправдано, помислете си за код от хиляди редове. Откриването на проблем в такъв код може да се окаже непосилна задача. Затова поставянето на коментари и проверки за грешки е добра идея.



  Следваща страница >> 


Ключови думи: PHP debugging error_reporting дебъгване на скрипт


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

@luudman ти сериозно ли? Грешката си е грешка, дебъгването е отстраняване на грешка(бъг).
Давам пример:
Пускаш един РНР скрипт, но докато ти изведе съобщението от него чакаш 30секунди. След малко дебъгване, откриваш че имаш цикъл който прави 100000*10 итерации, или SQL заявката ти е написана грешко и от там идва проблема.

Тук можеш да прочетеш какво точно е дебъгване.

  PureEvil на 07.03.2008 17:20

Точно така е! Дебъгването е грешка при кода напримен на апострофа, не затваряне на {..} т.н.ако искаш мога да отворя книгата и да ти го препиша в скайп!!!

  zipopro на 07.03.2008 05:02

Заради това @ съм страдал вече 
@luudman мисли преди да говориш.

  iwanov на 06.03.2008 01:05

@luudman просто нямаш равен. Хем не знаеш, хем си вярваш в това което приказваш.
Каква защита те гони? Това са функциите с чиято помощ се извършва точно отстраняването на грешки.
Точно error_reporting ще ти изкара тези неща на екрана за които говориш, ако не си ги видял в IDE-то де.

Пропуснато е да се спомене: не ползвайте @ за подтискане на грешки, само ще ви навреди!

  PureEvil на 05.03.2008 09:53

Аз мисля че заглавието не е подходящо! Дебъгването е недооглеждане на кода и съответно изпускане на ",", кавички, апострофи и т.н. По-добре е да сложиш едно друго заглавие например:
Малка защита в сайта или нещо такова, но не и Дебъгване моля ти се! Дебъгването се открива с Различните показани от PHP грешки когато влезнеш в скрипта, това не са бъгове а наистина нещо като защита, която като гледам е в най-основни форми.

  zipopro на 05.03.2008 05:32

Аха ясно. Мерси за отговора.

Поздрави!

  iwanov на 04.03.2008 23:32

Защото при грешка ще подаде към браузъра данни, преди другите хедъри. Примерно ако след това има session_start() бам ... грешка и ще има да се чуди човека какво става.
А ob_start() прави точно това, решава проблема с хедърите подадени към браузъра. За по точно обяснение: php.net/ob_start
Първото нещо в един РНР файла трябва да е session_start() ако има, ако пък не може да е error_reporting ;)

  PureEvil на 04.03.2008 21:56

Като цяло урока ми хареса само дето не разбрах какво точно прави error_reporting(E_ALL); и @PureEvil по каква причина да не се поставя ако не използваме ob_start(); в началото ?

  iwanov на 04.03.2008 21:03

1. Debug има точен превод:
- отстранявам дефектите на (изчислителен апарат и пр.)
- отстранявам подслушвателните устройства от ...
2. isset(), empty() ... а не просто if ($_GET[var]);
3. var_dump($var, $other, $xxxxx);
4. print_r() без комбинация от <pre> ще даде резултат: Array ( [firstname] => Alan [surname] => Wagstaff [email] => alan@example.com [phone] => 12345-678901 ), а не както си дал на отделни редове.
5. Не поставяйте в началото error_reporting() освен ако не ползвате ob_start() или друг начин на работа с хедърите.

  PureEvil на 04.03.2008 18:06

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008