Dziś jest piątek, 5 grudnia 2008 roku (z kalendarza...)

Rozważania o pobieraniu danych w PHP

Icon

30.12.2006, 18:30

PHP

Komentarze (6)

Powrót

Wielu programistów przeżywa obecnie okres fascynacji różnymi projektami w rodzaju ezComponents czy Zend Framework. Choć sam bardzo szybko przy nich skapitulowałem, śledzę sobie od czasu do czasu ich blogi, czytam o tym i owym. Wśród adeptów frameworkologii jest też mój nieoceniony eXtreme, który już zdobył trochę doświadczenia w posługiwaniu się dwoma wymienionymi w pierwszym zdaniu projektami i postanowiłem sobie porównać z nimi moje autorskie rozwiązania. Głównie skupiłem się na sprawach reprezentowania modelu oraz DAO, ponieważ okazuje się, że kwestię kontrolera rozwiązuję niemal identycznie, z jedyną większą różnicą w nazewnictwie. Przejdźmy zatem do

Główna zaleta PersistentObject z ezComponents to czas. Obsługa nowej tabelki powstaje poprzez zdefiniowanie zestawu reguł, podczas gdy całą mechanikę odwala już odpowiednia klasa. W moich projektach wszystkie obiekty DAO w całości piszę ręcznie, od początku do końca. Wiele z tabel nie jest połączonych z innymi jakimiś skomplikowanymi zależnościami i tam taka unifikacja bardzo by się przydała, zwłaszcza że już kilka razy zdarzyło mi się, że dodałem nowe pole, dopisałem je do metody insert(), a do update() już nie :). Nowe wersje eZ-a posiadają dodatkowo obsługę relacji.

Co mnie wkurza w takim podejściu, to wszelkiej maści kreatory zapytań. W teorii mogą mieć one sens przy przenośności projektu między bazami danych, ale różnice bywają tak duże, że siłą rzeczy trzeba całe fragmenty kodu pisać całkowicie od nowa, by wykorzystać oferowane możliwości. Reszta sytuacji - czym się niby ma różnić taki kod:

$query = new selectQuery;
$query -> addField('id');
$query -> addField('title');
$query -> addTable('table1', 't1');
$query -> setLessThanStatement('price', 6.70);
$query -> setLimit(56);

od takiego kodu:

$stmt = $pdo -> prepare('SELECT `id`, `title` FROM `table1` WHERE `price` < :price LIMIT 56');
$stmt -> bindValue(':price', 6.70, PDO::PARAM_FLOAT);

Czysta sztuka dla sztuki - na mój gust po to pisze się takie warstwy abstrakcji, by odseparować jedno od drugiego. Akurat w tym wypadku moje ręczne tworzenie ma jedną przewagę: gdybym zechciał np. nazwy wszystkich pól i tabel mieć po rumuńsku, poprawkom uległaby tylko grupa plików - kod akcji oraz formularze pozostałyby bez zmian. A takie rzeczy się zdarzają. Jest nowy projekt, szkoda wyrzucać połowy kodu, bo się przyda, tylko tytuły trzeba pozmieniać. Taki autorski system nadaje się też w sytuacjach, gdy system ma pracować na mocno niestandardowych danych (np. drzewka - czysty kod wygląda koszmarnie, ale na jakimś frameworku bez dedykowanej biblioteki do drzew pewnie wcale nie byłoby lepiej, a już na pewno nie szybciej :)).

Co zatem z PersistentObject może mieć taki samotny wolny strzelec? Kilka ciekawych pomysłów - nie ukrywam, że moje aktualne rozwiązania w kwestii DAO to czysta prowizorka i prędzej czy później będę musiał wypracować jakiś lepszy oraz bardziej ustandaryzowany mechanizm. Pole do popisu mam spore: doświadczenia z C-Z-W, komercyjne projekty służące za poligon doświadczalny - w końcu właśnie tak m.in. OPF i nowy OPD sprawdzam, a cały pakiet działającego kodu i sprawdzonych pomysłów leci później do OpenPB.

Czy pozostałe elementy frameworka mogą się przydać? Owszem, mogą. Po bliższym przyjrzeniu w sumie nieco klas z takiego czy innego ZF można by bez trudu zaadaptować do własnych potrzeb. Podejrzewam jednak, że dla własnej satysfakcji i tak zrobię wszystko po swojemu, bowiem po prawdzie programowanie niskopoziomowe części składowych sprawia mi naprawdę dużą frajdę, a robota, oprócz namacalnych korzyści, powinna być też przyjemna.

Powrót

Komentarze

Napisał eXtreme w sobotę, 30 grudnia 2006 o 19:27

Ad. generatorów zapytań

Tak się składa, że nikt nie każe tego używać. I nie we wszystkich sytuacjach jest to dobre rozwiązanie. Ale np. w ezComponents możesz jeśli łaska zrobić sobie zwyczajne zapytania query, układać je na modłę PDO-ową: prepare statement (bo zresztą ich komponent obsługi bazy oparty jest na PDO).

Ale idąc twoim sposobem powiedz co jest wygodniejsze i łatwiejsze:

 
$stmt = $db->prepare("INSERT INTO foo (pole1, pole2, pole3, pole4, pole5, pole6, pole7, pole8, pole9) VALUES (:pole1, :pole2, :pole3, :pole4, :pole5, :pole6, :pole7, :pole8, :pole9)");
$stmt->bindValue(':pole1', $pole1);
$stmt->bindValue(':pole2', $pole2);
$stmt->bindValue(':pole3', $pole3);
$stmt->bindValue(':pole4', $pole4);
$stmt->bindValue(':pole5', $pole5);
$stmt->bindValue(':pole6', $pole6);
$stmt->bindValue(':pole7', $pole7);
$stmt->bindValue(':pole8', $pole8);
$stmt->bindValue(':pole9', $pole9);
$stmt->execute();


czy

 
$q = $db->createInsertQuery();
$q->insertInto('foo')
	->set('pole1', $q->bindValue($pole1))
	->set('pole2', $q->bindValue($pole2))
	->set('pole3', $q->bindValue($pole3))
	->set('pole4', $q->bindValue($pole4))
	->set('pole5', $q->bindValue($pole5))
	->set('pole6', $q->bindValue($pole6))
	->set('pole7', $q->bindValue($pole7))
	->set('pole8', $q->bindValue($pole8))
	->set('pole9', $q->bindValue($pole9));
$stmt = $q->prepare();
$stmt->execute();


(Oraz analogiczny przykład zapytania UPDATE, również z dużą ilością pól do wypełniania itd, gdzie trzeba dbać o SET pole1 = :pole1 a potem daną definicję "wypełnić").

Akurat nie jest to wcale takie bezsensowne rozwiązanie, choćby nawet gdy ktoś jest znużony pisaniem "na czysto", to może użyć takich ułatwień.

Owszem, w przypadku PersistentObject jest narzucone użycie tej metody przy konstruowaniu większych zapytań. Ale teraz mi odpowiedz: znajdź jakieś inne rozwiązanie. Bo układanie $stmt = $db->prepare('SELECT '.$model->getFields().' FROM '.$model->getTable().' WHERE .......'); jest bezsensem - w przeciwieństwie do "generatora zapytań" który po prostu nie dopuszcza do błędów.

PS. z łaski swojej uprzedzając odpowiedź: nie statraj się mi wytrącać argumentów z ręki i doszukiwać się ukrytych sensów w tym komentarzu bo to też jest bez sensu.

Peace.

Napisał Zyx w sobotę, 30 grudnia 2006 o 21:07

Hej, a co ty się tak bojowniczo od razu nastawiłeś? Żywcem palę tylko tych, co piszą głupoty, a nie dyskutują i przedstawiają swoje opinie. :)

Ad. generatorów zapytań - właśnie to, co podałeś, jest sztuką dla sztuki :). Zapytanie układasz przecież raz na długi czas. Mnie tam zaoszczędzone dwie minuty nie zbawiają, a PHP - i owszem :). Co innego, gdy skrypt ma podaną strukturę tabeli i potrafi z tym różne fajne rzeczy zrobić samodzielnie - w tym kierunku sprawa mi się podoba i zamierzam jakoś dodać tę funkcjonalność do mojego kodu.

A że nikt nie każe używać - przecież nie używam :).

Napisał NuLL w sobotę, 30 grudnia 2006 o 22:23

Zyx - ezComponents to framework wg Ciebie ?

Napisał Zyx w niedzielę, 31 grudnia 2006 o 09:56

NuLL -> Nie i nigdzie tak nie napisałem (od tego w ogóle wypada zacząć).

Napisał php blog w wtorek, 16 stycznia 2007 o 19:01

Generator zapytań to nie sztuka dla sztuki ;)
DAO sprawia, że kod jest bardziej czytelny oraz zmniejsza ilość pracy, umożliwia wprowadzenie bardzo przenośnego kodu. Dla mnie tworzenie ręcznie kodu PHP to już tak jakby jedzenie rękami, a nie sztućcami.. ile się przy tym człowiek nababra.

 
// pobierz listę dokumentów
$oList = new DAODocumentsHelper($oDB);
$oList->setWhere('status', '(1, 2)', 'IN', array(aHDAO::PARAM_NO_BIND_VALUE));
$oList->setOrderBy('weight');
$oList->setOrderBy('addDate', 'DESC');
// ustaw parametry wyszukiwania 
$oSearch = new SearchDocuments($oList, $oRequest, 'documents');
$oSearch->execute();
// pobieramy od .. do .. ;)
$aList = $oList->select($this->iOnPage, $oRequest->start);
$oResponse->documents = $aList;

Napisał Zyx w sobotę, 27 stycznia 2007 o 10:59

Przeciwko DAO nic nie mam - sam je stosuję w takiej formie, jaką podajesz. Jedyna różnica jest taka, że plik DAO przygotowuję samodzielnie, bo mnie dwie minuty z kreatorami zapytań nie zbawiają.

Strona 1 z 1 :: 1

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 2 | Serwer wirtualny zapewnia