Sprawdzamy co kryją zmienne w PHP
Piszemy sobie różne rzeczy w PHP i czasem coś nie działa jak tego byśmy oczekiwali. Co robimy? Szukamy błędu. Często najtrudniejszymi błędami do znalezienia są błędy w algorytmach i logice programu, a nie te w składni. Błędy w nazwach funkcji, brak przecinka czy średnika wyrzuci nam samo PHP - może nie dokładnie, ale wiemy mniej więcej czego szukać. Gorzej, jeśli program działa, tylko wyniki są błędne.
W tym wpisie podam trzy proste i szybkie w zastosowaniu metody szukania błędów w tym co przechowują nasze zmienne w czasie działania skryptu.
Najprościej
Czasami najprostsze rozwiązania są najskuteczniejsze. Wielu programistów PHP zapomina, że zwykła funkcja (a w zasadzie konstrukcja języka) echo() może świetnie się sprawdzić przy kontroli tego co przechowują zmienne. Wystarczy w kilku kolejnych miejscach wystąpienia danej zmiennej ją wydrukować na ekranie i już wiemy co się dzieje. Oczywiście takie rozwiązanie sprawdzi się tylko w sytuacjach najprostszych, kiedy w zmiennych zapisany jest tekst, albo cyfry.
Więcej informacji, ale mało czytelnie
Ciekawą funkcją dostępna w PHP jest funkcja [code=php]void var_dump(mixed zmienna[, mixed zmienna2[,...mixed zmiennaN]])[/code]
Wysyła ona na wyjście (ekran) informacje o podanych zmiennych. Wyświetla ich typy i wartości. Funkcja daje większe możliwości niż echo(), ponieważ potrafi wyświetlić nie tylko tekst i cyfry, ale również inne typy zmiennych np tablice, obiekty.
Zobaczmy to na przykładzie. Stwórzmy sobie jeden obiekt z jakimiś danymi, jedną tablicę asocjacyjną i drugą tablicę, która przechowuje kilka danych, w tym wcześniejszą tablicę i stworzony obiekt. Oczywiście zakładam, że w rzeczywistości ta tablica jest tworzona dynamicznie przez skrypt, bo tylko wtedy ma sens sprawdzanie co przechowuje.
$towary=array("kapelusz","parasolka","buty"); $praca= new stdClass(); $praca->stanowisko="programista"; $praca->zarobki=25000; $praca->godzin="40 tygodniowo"; $tab=array( "imie"=>"Jan", "nazwisko"=>"Kowalski", "wiek"=>49, "towary"=>$towary, "praca"=>$praca);
Sprawdźmy zatem co przechowuje tablica $tab:
var_dump($tab);
Oto co zobaczymy na ekranie:
array(5) { ["imie"]=> string(3) "Jan" ["nazwisko"]=> string(8) "Kowalski" ["wiek"]=> int(49) ["towary"]=> array(3) { [0]=> string(8) "kapelusz" [1]=> string(9) "parasolka" [2]=> string(4) "buty" } ["praca"]=> object(stdClass)#1 (3) { ["stanowisko"]=> string(11) "programista" ["zarobki"]=> int(25000) ["godzin"]=> string(13) "40 tygodniowo" } }
Mamy tu wszystkie informacje o tablicy, na początku, że składa się z 5 elementów (array(5)). Zawartość tablicy ujmowana jest w klamry (obiektów też). W nawiasach kwadratowych mamy nazwy kluczy a po "=>" widzimy określony typ zmiennej i jej wartość (["imie"]=> string(3) "Jan"). W przypadku obiektów w nawiasie podana jest klasa, a za nawiasem po haszu numer mówiący o tym, który z kolei jest to obiekt tej klasy.
Mamy tu zatem praktycznie wszystkie informacje o zmiennej jakie mogą nam się przydać do analizy kodu w kwestii zawartości zmiennych. Zaletą tego rozwiązania jest przede wszystkim to, że daje nam pełen obraz i jest dostępne bezpośrednio w PHP. Wadą jest mała czytelność.
Dużo informacji i czytelna forma
Czasem warto sięgnąć po bardziej rozbudowane rozwiązania. W kwestii analizy zawartości zmiennych polecam klasę dBug() autorstwa Kwaku Otchere. Klasa rozpowszechniana jest na licencji GNU General Public License. Możecie ją pobrać z tej strony: http://dbug.ospinto.com/dl/dBug.zip
Dzięki tej klasie możemy zobaczyć co kryją w sobie zmienne w czytelnych (kolorowych) tabelkach. Tak wygląda nasza wcześniejsza tablica:
Przyznacie, że taki sposób przedstawienia zmiennej (czy raczej jej zawartości) jest dużo czytelniejszy, a w miarę rozrastania się zawartości ta czytelność zyskuje na wadze. Żeby jeszcze bardziej ułatwić czytanie dużych zbirów danych klasa przy wyświetlaniu dodaje kod JS, który umożliwia nam zwijanie i rozwijanie wierszy poprzez klikanie w ich nazwy:
Poza podstawowymi typami danych klasa potrafi również wyświetlić zawartość zwróconą przez zapytanie do bazy danych oraz zawartość plików XML.
Sposób użycia
Użycie klasy jest banalne. Musimy dodać plik klasy i wywołać ją podając jako argument naszą zmienną:
include_once("sciezka/do/pliku/dBug.php"); new dBug($tab);
Jeszcze przykład użycia z bazą danych:
$db = mysql_connect('localhost', 'root', 'haslo'); mysql_select_db('nazwabazy'); mysql_query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'"); $wynik = mysql_query('select * from slownik_kategoria'); include_once("sciezka/do/pliku/dBug.php"); new ADbug($wynik);
Wynik działania kodu:
To wystarczy, żeby zobaczyć wynik zapytania. Żeby wczytać plik xml, jako pierwszy argument musimy podać ścieżkę do pliku, a jako drugi text "xml" - bez tego ścieżka zostanie potraktowana jako string
include_once("sciezka/do/pliku/dBug.php"); $ciezka = "sciezka/do/pliku/xml/plik.xml"; new dBug($ciezka , "xml");
Jest też trzeci argument, przydatny przy dużych zmiennych, który ustawiony na true powoduje, że na wstępie wszystkie wiersze są zwinięte. Drugi argument, gdy jest niepotrzebny, a chcemy podać trzeci, możemy ustawić na pusty ciąg znaków:
new dBug($tab,'',true);
Jeśli używać Firebuga w Firefox'ie, to przy korzystaniu z AJAX'a również w wielu sytuacjach możecie skorzystać z tej klasy, jeśli serwer odeśle w odpowiedzi tabelką z dBug(), to nawet jeśli js wygeneruje błąd, to Firebug'u można obejrzeć w odpowiedzi wygenerowaną tabelkę - choć oczywiście nie zawsze.
Na koniec jeszcze link do dokumentacji, czy bardziej przykładów: http://dbug.ospinto.com/examples.php