Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

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.

r   e   k   l   a   m   a

Więcej informacji, ale mało czytelnie

Ciekawą funkcją dostępna w PHP jest funkcja

void var_dump(mixed zmienna[, mixed zmienna2[,...mixed zmiennaN]])

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  

programowanie

Komentarze