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.

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

0 nowych
alucosoftware   7 #1 15.03.2012 09:56

@slepciu
Fajnie przygotowałeś wpis, gratuluję. Ale popraw zdanie:

"Klasa rozpowszechniana jest na licencji GNU General Public License, więc możemy z niej korzystać również w komercyjnych projektach."

Ze zdania wynika, że wykorzystanie w/w klasy objętej licencją GNU GPL w komercyjnym projekcie nie niesie ze sobą żadnych zauważalnych konsekwencji. A prawda jest taka, że Twoje komercyjne oprogramowanie będziesz musiał udostępniać wraz z kodem źródłowym i będziesz miał także wiele innych problemów na głowie. Jeśli chcesz programowaniem zarabiać na chleb, wykorzystywanie kawałków kodu objętych licencją GNU GPL nie jest optymalną drogą...

slepciu   11 #2 15.03.2012 10:06

@alucosoftware - dzięki za zwrócenie uwagi, poprawiłem wpis. Pozdrawiam

command-dos   18 #3 15.03.2012 12:43

@slepcu, jeszcze przez Ciebie powrócę do programowania i coś "popełnię" w phpie... ;) jak zwykle rzeczowo w przyjaznej oprawie - dzięki (przypominają mi się dawne czasy, kiedy to moją ulubioną książką był Turbo Pascal 5.5 A. Marciniaka)

WODZU   17 #4 15.03.2012 13:07

Dziękuję za ten wpis - bardzo przydatny :)

slepciu   11 #5 15.03.2012 13:19

@command-dos - ponownie dziękuje za pochwałę :). Co się będziesz dłużej zastanawiał, siadaj i programuj :)

@WODZU - dzięki, fajnie że na coś się przydają moje "wypociny".

slepciu   11 #6 15.03.2012 13:49

@an.szop - masz rację, o tym nie pomyślałem, to rzeczywiście poprawia czytelność drugiej metody, choć nie tak jak metoda trzecia :) no i wymaga domieszania kodu HTML. Niemniej warto mieć to na uwadze.

  #7 15.03.2012 16:29

A ja rzucę tylko jednym słowem, o którym być może warto wspomnieć: xdebug :)

pawelllek   6 #8 15.03.2012 18:51

@alucosoftware, @slepciu
Co wg Was znaczy w komercyjnych projektach? Bo tym zdaniem wprowadzacie zamieszanie!

Ogólnie nie lubię słowa komercyjnego bo to znaczy wiele zastosowań więc tak naprawdę nic nam nie mówi.


Jeśli piszesz kod który będzie użyty w oprogramowaniu np. twojej firmowej strony WWW lub aplikacji używanej w twojej firmie to masz pełne prawo dołączyć do niego kod na licencji GPL2.
Ale przez takie działanie nie masz żadnego obowiązku obejmować twojego kodu licencją gpl i komukolwiek udostępniać. Bo program który napisałeś nie będzie dalej rozprowadzany.

Inaczje jest kiedy piszesz programy na sprzedaż.
Jeśli do swojego kodu dołączasz kod na gplu który jest jego integralną częścią i ten cały kod sprzedajesz komuś to cały twój kod powinien być objęty licencją gpl2. Co oznacza, że kupujący zgodnie z licencją może dalej rozpowszechniać twój kod nawet za darmo przy zachowaniu obowiązków związanych z licencją!

Można to ominąć, Jeśli dołączany kod gpl nie będzie integralną częścią twojego własnego kodu. Twój własny kod może być sprzedawany osobno na twojej licencji a do niego dołączasz jako oddzielny program kod na licencji gpl, który może uzupełnić twój program o dodatkowe funkcjie.
Tak np działą dużo programów. Np popularny system zarządzania treścią Joomla. Sam system jest na gpl2 do niego dochodzą osobne komponenty które piszą niezależnie programiści i to oni decydują na jakiej licencji będzie ich kod.

Link do wikipedii dot. licencji gpl
http://pl.wikipedia.org/wiki/GNU_General_Public_License

slepciu   11 #9 15.03.2012 19:31

@pawelllek - wiem, że wprowadziłem zamieszanie i dlatego od razu po uwadze alucosoftware wykasowałem tą część o komercyjnych projektach i już jej nie ma

alucosoftware   7 #10 15.03.2012 20:40

@pawelllek
We wpisie nie ma już mowy o "komercyjnych projektach", bo mogłoby to zapoczątkować burzliwą dyskusję. Analizę tematu licencji GPL i pochodnych pozostawiam prawnikom i tym samym podtrzymuję swoje słowa.

Druedain   14 #11 15.03.2012 22:56

@pawelllek Nie jestem prawnikiem, ale niedawno słuchałem jak koleś tłumaczył, że w polskim prawie GPL działa praktycznie tak samo jak AGPL.

  #12 16.03.2012 11:41

Jest jeszcze projekt krumo, który imho produkuje czytelniejsze wyniki.

slepciu   11 #13 16.03.2012 13:59

@sklab - dzięki za informacje o tym projekcie, wcześniej go nie znalem. Ciekawy głównie ze względu na większe możliwości. Dla mnie jednak bardziej czytelne są wyniki z dBug'a - no ale to kwestia gustu.

  #14 19.03.2012 12:37

Używałem kiedyś tego typu wynalazków, ale później przerzuciłem się na dodatek do Firefox o nazwie FirePHP. Nie rozwala layoutu strony, a dane są prezentowane w czytelny sposób.

Strona projektu: http://www.firephp.org

  #15 20.03.2012 12:23

Witam,
myślę, że na potrzeby wyświetlenia zmiennych to szkoda kombinowania z dodatkowymi bibliotekami, trzy sposoby które używam na co dzień to:
1. znacznik echo var_dump($zmienna) zrobione w eclipse jak template,
2. xdebug,
3. FirePHP i wyrzucanie zmiennych do konsoli

Pozdrawiam
Marcin