Debugowanie kodu PHP (bez debuggera)
konrados
1. Raportowanie błędów
Żeby w ogóle móc zacząć debugować musimy mieć włączone raportowanie błędów. Według mnie najlepiej debugować na localhost.
Po pierwsze musimy włączyć raportowanie błędów, jeśli jest wyłączone. Możemy to zrobić na trzy sposoby:
- Ustawić raportowanie błędu w piku konfiguracyjnym - otwieramy
php.ininotatnikiem, naciskamy Ctrl+F i wpisujemy"display_errors=", jeśli wartość jest"off"to zmieniamy na"on". - Ustawić raportowanie błędów w runtime'ie - na początku pliku php piszemy :
<?php
ini_set('display_errors', 1);
- jeszcze jedna możliwość, najgorsza, nie działa w przypadku błędów parsowania; Ustawienie niestandardowego error handlera - Na początku kodu dodajemy:
<?php function error($type, $message, $file, $line) { echo "$message in $file on line $line"; } set_error_handler('error');
Po drugie, musimy ustawić to, które z błędów będą raportowane:
- Albo ustawić to w runtime'ie:
- Musimy więc na początku kodu umieścić:
<?php error_reporting(E_ALL | E_NOTICE | E_STRICT);
- Musimy więc na początku kodu umieścić:
- Albo w pliku konfiguracyjnym:
- tym razem szukamy w pliku
php.inisłówka"error_reporting="i zmieniamy wartość na"E_ALL | E_NOTICE | E_STRICT".
- tym razem szukamy w pliku
Dlaczego taką? W starczych wersjach PHP stała E_ALL zawierała w sobie tylko errory i warningi (trzeba było też dodać notice'y i błędy strict). W nowszych wersjach PHP (od PHP 5.4) można już pisać samo E_ALL.
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;
oraz 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.
- co jakiś czas dajemy echo, np.
$a = 1;
$b = 1;
echo 1;
$c = 1;
$d = 1;
echo 2;
3. Debugowanie zapytań do baz danych.
Jeśli do zapytania dodajesz jakieś wartości ze zmiennych to najpierw sprawdź jakie zapytanie idzie do bazy:
<?php
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.
Treść błędu SQL
Dalej, treść błędu: `mysql_query()` w przypadku nie powodzenia zwraca false, więc możemy zrobić tak:<?php
mysql_query('UPDATE s SET d = '.$a.' WHERE c = '.$e) or die(mysq_error());
Zobaczymy wtedy dokładnie jaki jest problem z zapytaniem (a nie tylko z jego składnią).
4. Treści błędów
Tutaj będę wypisywał najpopularniejsze treści błędów i ich rozwiązanie.-
Parse error: syntax error, unexpected T_* in *<?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;w 7 linijce.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 *- Kod skończył się w niespodziewanym momencie (nie zamknięty string, nie zamknięta funkcja, nie zamknięta klasa, etc.)
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:
}.
- zapomnieliśmy klamry zamykającej:
-
Fatal error: Call to undefined function *() *Próbujemy wywołać nie zdefiniowaną funkcje
np.
<?php error_reporting(E_ALL | E_NOTICE | E_STRICT); $a = 1; $b = 1; function s() { echo 1; } ss();Kod powyżej wywali
Fatal error: Call to undefined function ss() in on line 12, podczas gdy powinniśmy napisać kod tak:<?php error_reporting(E_ALL | E_NOTICE | E_STRICT); $a = 1; $b = 1; function s() { echo 1; } s(); -
Notice: Undefined variable: X in *:- oznacza, że nie zdefiniowaliśmy zmiennej o nazwie
Xprzed jej użyciem.
- oznacza, że nie zdefiniowaliśmy zmiennej o nazwie
-
Strict Standards: Creating default object from empty value in *<?php error_reporting(E_ALL | E_NOTICE | E_STRICT); $a->b = 1; // źle, odniesienie się do niezainicjalizowanej zmiennej $a = new stdClass(); // utworzenie obiektu $a->b = 1; // dobrze, odniesienie się do już zainicjalizowanej zmiennej -
Notice: Undefined index: X in *- oznacza, że w tabeli nie istnieje indeks o nazwie X
Nice one google
Należałoby jeszcze napisać w jaki sposób można uruchomić debugger w IDE oraz przenieść podpunkt 4 do jakiegoś innego tematu, bo nie ma zbyt wiele wspólnego z debugownaniem.