Programowanie w języku PHP

Debugowanie kodu php

Na wstępie, programowaniem zainteresowałem się jakieś 2 lata temu, więc mistrzem nie jestem i w tym artykule będę się opierać tylko na własnych doświadczeniach jakie udało mi się zdobyć przez ten okres. Ponieważ w dziale php nie ma nic o debugowaniu kodu, to postanowiłem go zrobić, po co? Nie wiem, pewnie większość newbie będzie wolało postępować tak jak ja kiedyś, czyli "nie umiem, pomóżcie", ale może komuś się przyda.

1. Raportowanie błędów


Żeby w ogóle móc sprawnie debugować musimy mieć włączone raportowanie błędów. Według mnie najlepiej debugować na localhoście, ponieważ jak będziemy chcieli debugować na jakichś serwerach na których nie można włączyć raportowania błędów, bo administrator był nieudolny, to będzie trudniej, o wiele trudniej.

Po pierwsze musimy włączyć raportowanie błędów, jeśli jest wyłączone. Możemy to zrobić na trzy sposoby:

- otwieramy php.ini notatnikiem, naciskamy ctrl+F i wpisujemy "display_errors =", jeśli wartość jest "off" to zmieniamy na "on".
- na początku dokumenty php piszemy
ini_set('display_errors', 1);

- jeszcze jedna możliwość, najgorsza, nie działa w przypadku błędów parsowania. Na początku kodu dodajemy :
function error($type, $message, $file, $line)
{
        echo $message.' in '.$file.' on line '.$line;
}
set_error_handler('error');


W każdym z powyższych sposobów musimy na początku kodu umieścić:
error_reporting(E_ALL | E_NOTICE | E_STRICT);

lub tym razem szukamy w pliku php.ini "error_reporting =" i zmieniamy wartość na "E_ALL | E_NOTICE | E_STRICT". Dlaczego taką? Tak mi się po prostu przyjęło.

2. Brak raportowania błędów


Gdy nie mamy możliwości włączenia raportowania błędów możemy:
       
- na końcu kodu dodać
echo 1;
, zakomentować cały pozostały kod  /* */, i jeśli na ekranie pojawi się 1 to komentujemy coraz mniejsze fragmenty kodu, aż 1 się nie pojawi i będziemy wiedzieli mniej więcej w których okolicach kodu jest błąd. (sposób bardziej przydaje się w javascrip'cie)
- co jakiś czas dajemy echo, np.
$a = 1;
$b = 1;
echo 1;
$c = 1;
$d = 1;
echo 2;
 
(nie mam pojęcia czy sposób jest przydatny w php, ale w javascrip'cie się sprawdza, trochę może odbiegam od tematu debugowania kodu php)

3. Debugowanie zapytań do baz danych.


Najpierw trochę odbiegnę od tematu. Nie wiem skąd się wzięła głupia moda na pisanie zapytań w cudzysłowie. Kiedyś sam przez tą głupią modę tak pisałem.

//źle
mysql_query("UPDATE s SET d = $a WHERE c = $e"); //mysql, bo większość newbie go używa, jak ja kiedyś        
//dobrze
mysql_query('UPDATE s SET d = '.$a.' WHERE c = '.$e);


Ale do rzeczy.

"Nie działa zapytanie, ratunku!!!!!!!!!!!"


Jeśli do zapytania dodajesz jakieś wartości ze zmiennych to najpierw sprawdź jakie zapytanie idzie do bazy:

mysql_query($q='UPDATE s SET d = '.$a.' WHERE c = '.$e);
echo $q;


Jeśli wyjdzie "UPDATE s SET d =  WHERE c = 1" to wiesz, że zmienna $a jest pusta

Dalej, treść błędu:(mysql_query w przypadku nie powodzenia zwraca false, więc możemy zrobić tak)

mysql_query('UPDATE s SET d = '.$a.' WHERE c = '.$e) or die(mysq_error());
//ewentualnie
mysql_query($q='UPDATE s SET d = '.$a.' WHERE c = '.$e) or die(mysq_error().' '.$q);


4. Treści błędów


Tutaj będę wypisywał najpopularniejsze treści błędów i ich rozwiązanie.

  • - wszytko (<- jak napisać gwiazdkę?)

- "Parse error: syntax error, unexpected T_* in *"


np.
<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1
function s()
{
echo 1;
}


wywala "Parse error: syntax error, unexpected T_FUNCTION in ŚCIEŻKA DO PLIKU on line 7 "

błąd oznacza, że zapomnieliśmy średnika ";"

poprawnie:

<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1;
function s()
{
echo 1;


- "Parse error: syntax error, unexpected $end in *"


np.
<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1;
function s()
{
echo 1;


błąd oznacza, że zapomnieliśmy klamry zamykającej "}"

poprawnie:

<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1;
function s()
{
echo 1;
}


- "Parse error: syntax error, unexpected T_*, expecting '{' *"


zapomnieliśmy klamry zamykającej

- "Fatal error: Call to undefined function *() *"


np.
<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1;
function s()
{
echo 1;
}
 
ss();


wywali "Fatal error: Call to undefined function ss() in  on line 12"

oznacza to, że próbujemy wywołać nie zdefiniowaną funkcje

poprawnie

<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
 
$a = 1;
$b = 1;
function s()
{
echo 1;
}
 
s();


W przypadku, gdy błąd dotyczy funkcji wbudowanej albo nie włączone jest rozszerzenie w php.ini, albo wersja php jest stara np. mysql_query
szukamy w php.ini "extension=php_mysql.dll" i usuwamy średnik z początku linii

- "Notice: Undefined variable: X in *"


oznacza, że nie zdefiniowaliśmy zmiennej o nazwie X przed jej użyciem

- "Strict Standards: Creating default object from empty value in *"


np.
<?php
 
error_reporting(E_ALL | E_NOTICE | E_STRICT);
//źle
$a->b = 1;
//dobrze
$a = new stdClass;
$a->b = 1;


- "Notice: Undefined index: X in *"


oznacza, że w tabeli nie istnieje indeks o nazwie X

Jeśli chcesz coś dodać albo powiedzieć mi, że jestem debilem i się nie znam pisz w komentarzach :)

Zezwalam na rozpowszechnianie artykułu wraz z informacją o autorze.

Autor: Konrad Mederowski (konrados na 4p)