Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne] Wybór PDO - kilka pytań
Forum PHP.pl > Forum > Przedszkole
adam882
Witam

Mam kilka pytań do osób, które używają biblioteki PDO:

1. Czy PDO posiada system cachowania zapytań? Czy też trzeba samodzielnie napisać sobie taką klasę cachującą (np. zrzucającą wynik zapytania do pliku, pamięci itp)
2. Jak PDO prezentuje się pod względem wydajności i szybkości?
3. Czy PDO będzie się dobrze nadawać pod kątem szybkości do średnio-zaawansowanego serwisu jak np. serwis z ogłoszeniami?

Pozdrawiam
by_ikar
Cytat
1. Czy PDO posiada system cachowania zapytań? Czy też trzeba samodzielnie napisać sobie taką klasę cachującą (np. zrzucającą wynik zapytania do pliku, pamięci itp)


Nie posiada systemu cache, trzeba samemu sobie go napisać.

Cytat
2. Jak PDO prezentuje się pod względem wydajności i szybkości?


Dość sporny temat wink.gif jak dla mnie jest szybsze, a bindowanie zapytań to jest największy jego atut.

Cytat
3. Czy PDO będzie się dobrze nadawać pod kątem szybkości do średnio-zaawansowanego serwisu jak np. serwis z ogłoszeniami?


Według niektórych nie używanie PDO to grzech śmiertelny wink.gif nie mniej, nadaje się do każdego rozwiązania, obsługuje sporo typów baz danych, nie trzeba pisać nowych klas, nowych sterowników, wszystko masz gotowe i na tacy, wpisujesz jedynie odpowiednie parametry połączenia z bazą i resztą się nie martwisz. Napisanie jakiejś swojej nakładki, lub skorzystanie z już istniejących które wykorzystują podpinanie zapytań (zend_db chociażby) gwarantuje ci brak problemu ze sqlinjection.

Czego chcieć więcej? wink.gif Od czasu jak pierwszy raz spróbowałem PDO, od tamtego czasu w inny sposób nie łącze się z bazą i raczej nie wyobrażam sobie pisania swojej klasy do obsługi bazy danych, dla każdej bazy danych z osobna..
wNogachSpisz
Osobiście jestem zwolennikiem biblioteki ActiveRecords z CodeIgnitera.
Osługuje ona cachowanie oraz takie silniki baz danych jak sqlite, mysql, mssql i inne.
Jeśli chcesz mogę podesłać moją wersję "wyciągniętą", działającą bez frameworka CI.

Manual jest tutaj: http://codeigniter.com/user_guide/database...ive_record.html
adam882
Dzięki smile.gif PDO wygląda obiecująco, jednak brakuje mi cache :/ Może zna ktoś jakąś ciekawą klasę cache z użyciem PDO?
Inscure
Cytat(adam882 @ 30.10.2011, 14:59:30 ) *
Może zna ktoś jakąś ciekawą klasę cache z użyciem PDO?


Zależy czy chcesz cache'ować do pliku czy trzymać w zmiennej, z której kilka razy możesz dane pobierać.

Przy realizacji drugiego założenia wystarczy że na pobrane dane podziałasz przez fetchAll() i przypiszesz to do swojej zmiennej.
Przez tak utworzoną tablicę przejdziesz pętlą foreach przepisując ją na zwykłą tablicę. Chodzi o to, żeby móc się do pobranych danych odwoływać wielokrotnie bez ponownego wykonywania zapytania.

Cache do pliku:

Najłatwiej serializując tablicę danych pobranych z bazy przez PDO i przefetchowanych.
Do serializacji służy funkcja serialize(), do deserializacji: unserialize().

Czas żywotności pliku sprawdza się funkcją filemtime()
wNogachSpisz
Cytat(Inscure @ 30.10.2011, 15:21:32 ) *
wystarczy że na pobrane dane podziałasz przez fetchAll() i przypiszesz to do swojej zmiennej.
Przez tak utworzoną tablicę przejdziesz pętlą foreach przepisując ją na zwykłą tablicę. Chodzi o to, żeby móc się do pobranych danych odwoływać wielokrotnie bez ponownego wykonywania zapytania.



Techonolgia kosmiczna.
Inscure
Zamiast wstawiać wizerunek Jezusa i obrażać religię większości Polaków, nie wspominając o wypowiedzi nie wnoszącej zupełnie niczego do tematu, napisałbyś co jest nie tak w mojej wypowiedzi.
Nieomylny nie jestem, jak każdy.

Jeśli wywołasz dane z PDOStatement object, to drugi raz się do nich odwołać nie możesz.

Czyli

Kod
$query = $_pdo->query('zapytanie');
while($d = $_pdo->fetch($query))
{
echo $d['row']; // wyswietli dane
}

while($d = $_pdo->fetch($query))
{
echo $d['row']; // drugi while pod spodem już danych nie wyswietli dla tego samego $query
}


Sposób który podałem powoduje, że możesz robić to kilkakrotnie w danym pliku. Coś w tym nie tak?
by_ikar
Cytat
Jeśli wywołasz dane z PDOStatement object, to drugi raz się do nich odwołać nie możesz.


Możesz, tyle że nie w taki sposób w jaki ty to zrobiłeś. Ty użyłeś fetch jako argument pętli, efektem czego jest utworzenie zmiennej która ma zasięg ograniczony pętlą. Oduczyłem się korzystać z while jakiś czas temu, w sensie, oduczyłem się nadużywać wink.gif dostajesz tablicę, tak więc najszybsza i najlepszą pętlą do operacji na tablicy jest foreach:

Kod
$data = $_pdo->query('zapytanie')->fetchAll(PDO::FETCH_ASSOC);

foreach($data as $row)
{
   //...
}

foreach($data as $rows)
{
    //...
}


foreach jest znacznie szybsze od while, a kiedy używamy go w taki sposób:

Kod
foreach($arr as $row)
{
    //...
}


to z tego co czytałem benchmarki, jest najszybszą pętlą, nawet szybszą od for: http://juliusbeckmann.de/blog/php-foreach-...oop-battle.html
Inscure
No właśnie o tym pisałem: foreach + fetchAll() ale SpiącemuwNogach coś się nie spodobało wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.