«

»

Sprawdzanie zmiennych w PHP

O czym będzie

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

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, więc możemy z niej korzystać również w komercyjnych projektach. 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:

dBug()

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

Podziel się na:
  • Drukuj
  • Facebook
  • Wykop
  • Google Bookmarks
  • Blogger.com
  • Blip
  • Digg
  • Dodaj do ulubionych
  • Gadu-Gadu Live
  • Grono.net
  • LinkedIn
  • Live
  • MySpace
  • Mój biznes
  • PDF
  • Poleć
  • RSS
  • Twitter
  • Śledzik

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć tych znaczników i atrybutów HTMLa: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>