Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Abstrakty, klasy, Creole... itp
Forum PHP.pl > Forum > PHP
Aztech
Wcześniej pisałem swoje stronki zupełnie bez ładu i składu, przyszedł jednak czas potężnego projektu (prac dyplomowa biggrin.gif) i czas zrobić to porządnie. Mam zatem pytanie:
1) czy pisać właśną klasę obsługi bazy danych czy skorzystać z gotówców, jeśli tak to z jakich?
2) do czego tak na prawdę służa CREOLE, ADODB, PEAR i czy warto je stosować w momencie kiedy tylko bedą obsługiwać mysql?
3) czy może, ktoś z forumowiczów ma własną klasę obsługującą połączenia z bazą danych i chce, może ją udostępnić, tudzież, czy może dać wskazówki, rady czego się wystrzegać podczas pisania własnej klady?

Wiem, że pytania są naiwne i część z nich porozsiewana jest po forum php5, ale mimo przeczytania sporej ilości postów w dniu dzisiejszych nie jestem w stanie ogarnąć tego wszystkiego i w jakiś sensowny sposób poukładać sobie w głowie. Więć stąd moje pytania
mike
Cytat(Aztech @ 2005-11-23 00:19:15)
1) czy pisać właśną klasę obsługi bazy danych czy skorzystać z gotówców, jeśli tak to z jakich?
Taki abstrakt, żeby był dobry potrzebuje sporego nakładu pracy co za tym idzie czasu pracy. A jest klika dobrych, więc po co wynajdywać koło po raz n-ty :?: No chyba że to bedzie pzredmiotem Twojej pracy.

Cytat(Aztech @ 2005-11-23 00:19:15)
2) do czego tak na prawdę służa CREOLE, ADODB, PEAR i czy warto je stosować w momencie kiedy tylko bedą obsługiwać mysql?
Abstrakt bazodanowy powinien w tej chwili oferować dwie podstawowe rzeczy:
1. Możliwość pisania pod dowolna bazę danych. Zawsze możesz emigrować na inną baze bez modyfikacji swojego kodu.
2. Ułatwienie korzystania z bazy, przy pomocy serii przydatnych funkcji oraz metod. Zwracanie wyników jako obiekty, statystyki, debugery, ..., co tylko zechesz. Uważam że warto, nawet jeśli nastawiasz się tylko na MySQL'a.
P.S. Creole, AdoDB owszem. Ale PEAR tutaj nie pasuje. Owszme jedną z bibliotek PEAR'a jest jakiś abstrakt, ale wywołanie go tu w całości to pomyłka.

Cytat(Aztech @ 2005-11-23 00:19:15)
3) czy może, ktoś z forumowiczów ma własną klasę obsługującą połączenia z bazą danych i chce, może ją udostępnić, tudzież, czy może dać wskazówki, rady czego się wystrzegać podczas pisania własnej klady?
Poszukaj, na pewno cos się znajdzie.
Ja osobiście polecam bardzo Creole'a oraz AdoDB. Obie są fajne, Creole podoba mi się bardziej, ale AdoDB ma więcej możliwości.



Temat wędruje na php, na php5 miejsca dla niego nie ma tongue.gif
Aztech
@mike_mech: dzieki za szybką odpowiedź
Pisanie samego abstraktu nie jest przedmiotem mojej pracy, ma on być tylko częścią całego systemu wspomagającego nauczanie na moim kierunku - taki właśnie system tworzę. Sam także wychodzę z założenia, że nie powinno się pisać coś co zostało już kiedyś przez kogoś stworzone, ale wolę popytać ludzi, którzy na codzień mają z tym styczność o opinie.

A tak przy okazji czy jest gdzieś jakiś polski kurs, manual Creola bo nie znalazłem (angielski mi nie przeszkadza, ale dłużej trwa jego przetwarzanie - czyt. zrozumienie)

@all: czekam na dalsze uwagi
ikioloak
Ad 1. zdecydowanie polecam ADODB. Z CREOLE kontaktu nie mialem wiec nie moge sie wypowiedziec

Ad 2. ADODB bardzo ulatwia pisanie skryptow z wykorzystaniem bazy, dlatego warto wg mnie go uzyc nawet jesli korzystasz tylko z mysql. i tak jak mowi mike_mech - a nuz sie okaze ze konieczna jest przesiadka na inny serwer bazodanowy.

PEAR jest to zestaw klas wspomagajacych pisanie. Korzystam z Mail_mime przy wysylaniu maili i poza jednym mankamentem (niedawno pytalem sie o ten mankament na forum) bardzo jestem z niej zadowolony. Z innych paczek poki co nie mialem potrzeby ani okazji korzystac, choc prezentuja sie na tyle ciekawie ze uwazam ze warto poznac ich mozliwosci (np. klasa Image_Graph).

Ad 3. Wydaje mi sie ze w momencie kiedy istnieja ww systemy jak dla mnie jest to wywazanie otwartych drzwi
ActivePlayer
Cytat
Ad 2. ADODB bardzo ulatwia pisanie skryptow z wykorzystaniem bazy


No, to pochwal sie jakich featursów uzywasz... bo mi np. wystarcza GetArray();, GetRow();, GetOne(); i _ewentualnie_ EscapeArray();. Jak mozna sie domyslic, implementacja tych funkcji we wlasnym zakresie to okolo 50 linii kodu php. A adodb wazy nieporownywalnie wiecej.
ennics
możesz zamiast istniejących już klas abstrakcji spróbować PDO jako nowe rozwiązanie
technologincze dla php, ewentualnie zdefiniować dla niego dodatkową
abstrakcję.
Aztech
Zdecydowałem się na ADODB, z kilku powodów
1) ponieważ posiada polską dokumentację, przystępnie napisaną - być może ktoś będzię później modyfikował mój projekt, więc polska dokumentacja przyda się jak znalazł
2) jest w miarę przystępne, przykłady można łatwo znaleźć i istnieje już na rynku od dłuższego czasu, więc znane są jego wady/zalety/kłopoty i rozwiązania na różne bolączki
3) PDO moze się zmieniać, co jest wyraźnie zaznaczone w dokumentacji php i używać go można na własne ryzyko - a wiec nie jest w tym momencie rozwiązaniem przyszłościowym dla mnie, nie mogę bowiem pozwolić sobie na to, że w momencie, gdy na serwerze będzie inna wersja php 5.x.x niż ta pod, którą ja piszę, całość nie będzie działała (aczkolwiek sugestia co do PDO jest słuszna, zawsze można spróbować)
bela
Abstrakt? Obrzydliwe słowo, jakoś wolę angielski odpowiednik ;]

Nie prawdą jest, że jeśli będziesz używać db layera to nie ma problemów w przeniesieniem na inne bazy aplikacji. Wspólne jest tylko API db layera a same zapytanie mogą się bardzo różnić.

Ja używam praktycznie wyłącznie PDO, bo w przyszłości (czytaj. php > 5.1) będzie domyślnie zainstalowe razem z obsługą bazy.
Aztech
Ale piszesz własny abstrakt dla PDO, czy też zostawiasz tak jak jest?
Co do zapytań to masz rację, ale wtedy i tak masz dużo mniej roboty niż gdyby trzeba było zmieniać wszystko (na marginesie prawdopodobieństwo, że kedykolwiek moja praca zostanie przeniesiona na Oracle jest jak 1:10000)

Mam jeszcze jedno pytanko: czy AdoDB + Smarty nie będą za bardzo razem zamulały?questionmark.gif
bela
Do PDO dopisywałem tylko klasę MyPDO, która pobierała z konfiguracji dane: user, hasło, host i tworzyło obiekt, i z metodą getPDO(), która zwracała obiekt PDO, bo przecież konstruktor tego nie zwróci.

Smarty + AdoDB nie będzie zamulać ;]
SongoQ
@mike_mech
Cytat
Abstrakt bazodanowy powinien w tej chwili oferować dwie podstawowe rzeczy:
1. Możliwość pisania pod dowolna bazę danych. Zawsze możesz emigrować na inną baze bez modyfikacji swojego kodu.

I tu sie bardzo myslisz. Jesli nastawiamy sie na aplikacje dzialajace pod roznymi bazami danymi i zakladamy ze ten kod moze dzialac pod wszystkim to tak, wtedy od bazy oczekujemy tylko prostych zapytan, bez wykorzystania ich mozliwosci. Jesli stoworze sobie aplikacje np korzystajaca z funkcji plsql to powiedz mi jakim cudem uda mi sie ja przeniesc np ma mssqla czy mysqla? Bo ja jakos sobie nie wyobrazam. Dla mnie i tak najwazniejsza jest baza danych, bo tak naprawde dane sa przetwazane przez nia, a php tylko je prezentuje.

Tak naprawde nie da sie stworzyc wydajnej aplikacji z tym samym kodem pod kazda bazke. DB layer ma przedewszystkim sluzyc w latwosci wyciagania danych i zapominania o funkcjach typu pg_query, itd. Zakladanie ze jeden kod moze obsluzyc wiele baz jest bledym podejsciem, no chyba ze nie patrzysz na wydajnosc baz danych.
mike
@SongoQ, @bela_666 macie rację. Oczywiście.

Wiadomo, że specyfikacja SQL w różnych systemach bazodanowych jest różna i nie da się napisać uniwersjalnej aplikacji.

Można natomiast osiągnąć to dopóki używamy "uniwersalnych" możliwości bz danych i nie skupiamy się na specyficznych "bajerach".

Przy abstraktach IMO ważniejsze od przenośności (bo tak jak mówicie nie jest to tak naprawdę w 100% osiągalne), jest wygoda pracy i daoatkowe bajerki. Zliczanie zapytań, czasów zapytań, debugger, "plucie" wyjątkami, ...
SongoQ
Odnosnie PDO, jestem pod wrazeniem, przyznam sie nigdy nie korzystalem z tego ale z tego co http://www.oracle.com/technology/pub/artic...do_oracle5.html widze to jak dla ORACLE to bardzo polecam.
ikioloak
@ActivePlayer
Cytat
No, to pochwal sie jakich featursów uzywasz... bo mi np. wystarcza GetArray();, GetRow();, GetOne(); i _ewentualnie_ EscapeArray();. Jak mozna sie domyslic, implementacja tych funkcji we wlasnym zakresie to okolo 50 linii kodu php. A adodb wazy nieporownywalnie wiecej.

nie zamierzam ci tutaj nic wymieniac, ale AdoDB oferuje jeszcze inne ciekawe metody o ktorych nie wspomniales.
Pewnie ze mozna sobie samemu napisac. Wszystko mozna samemu napisac. Ale po co? nie twierdze ze trzeba leciec na samych gotowcach bo to tez jest bzdura, ale generalnie nalezy sobie ulatwiac zycie.
Nie twierdze tez ze AdoDB jest najlepszym wyjsciem - innych klas nie mialem potrzeby testowac.
I podsumowujac, to ze AdoDB wazy zdecydowanie wiecej niz 50 linijek kodu nie neguje tego ze ulatwia pisanie
Aztech
Przyznam się szczerze, że zapytałem właśnie o AdoDB, Creole właśnie z paru powodów, które tu zostały wymienione, a w zasadzie z jednego głównego:
po co tworzyć coś, co już ktoś kiedyś napisał, co jest dobre, sprawdzone. Powiem szczerze, że bardzo ułatwi mi to pracę, bo teraz mogę się skncentrować na najważniejszej czesci mojej pracy dyplomowej nie przejmując się obsługą bazy danych i zapytaniami (a konkretnie ich prawidłową implementacją).

Mam jednak jeszcze jedno dodatkowe pytanie: mam rozumieć, że wszelkie problemy związane z bezpieczeństwem są w ADODB oraz Creole rozwiązane wzorowo?questionmark.gif?
NoiseMc
I właśnie tu nie jestem pewien co do ADODB jak mam wyłączone magic_quotes_gpc to nie slashuje mi automatycznie danych (nie wiem jak z PreparedStatement) z formularza muszę je ręcznie przygotowywać.
Z tego co wiem to twórcy Creole inspirowali się JDBC a tam podobno poziom zabezpieczenia przed SQL Injection jest dość wysoki.
NuLL
Ja powiem tylko jedno. Widziałem w firmie projekt - jakiś programista forsował Creole - tyleże dla 82 tabel w ktorych niektore mialy po 25 kolumn. Ilosc wygenerowanego kodu krotko mowiac przerazala.

EDIT:

Uppps - Bela_666 - ma racje pomylilem Creole z Propelem.
SongoQ
Cytat
Ilosc wygenerowanego kodu krotko mowiac przerazala.

Kodu SQL?
bregovic
Creole to szajs, równie koszmarny co jakakolwiek konfiguracja w xml'u. ADODB jest uzyteczne dla dużych projektów, które potrzebują dużej ilości niestandardowych możliwości.

Dla prostej aplikacji znacznie łatwiej i szybciej (IMO) napisać własną małą klasę.
mike
Cytat(bregovic @ 2005-11-23 17:53:05)
Creole to szajs, (...)

Twoją opinię już znamy, a mógłbyś ją uzasadnić :?:

Ja uważam że Creole jest bardzo fajny. Bardzo lekka i przejrzysta klasa, nadająca się do małych oraz średnich projektów.
Ma bardzo przejrzysty kod napisany pod php5.

Jedyne wady/braki jakie w niej znalazłem, to:
1. Brak debugera (takiego jak w AdoDB), choć przy zastosowaniach małych i średnich nie jest to takie straszne.
2. Zły kod błędu w SQLException (...), ale można to bardzo łatwo poprawić (zaleta dobrego kodu);

Ale już niedługo IMO Creole zostanie wyparte prze PDO
Aztech
Co rozumiecie poprzez mały, średni, duży projekt.
Poniżej link do schematu bazy danej (projekt bardzo wstępny) wraz z relacjami SCHEMAT (uwaga plik waży około 130kb)
Waszym zdaniem projekt ten jest mały, średni, duży? Lepiej będzie do tego użyć Creole, ADODB?questionmark.gif

Mój ma następującą specyfikację (bardzo ogólną tutaj) - najważniejsze zaczyna się od podpunktu 2.1
Kod
Internetowy system zarzadzania trescia cwiczen i wspomagania samodzielnego ksztalcenia w dziedzinie automatyki i robotyki.

1) Sformulowanie problemu

W dzisiejszych czasach material dydaktyczny
oferowany studentom jest bardzo czesto kompromisem pomiedzy potrzebami
studentow a tym co moze przygotowac zespol prowadzacych w czasie,
ktorym dysponuja. Wynika to z rozmaitych przyczyn, m.in. ze stosunkowo
duzej liczby studentow przypadajacych na pracownika. Jak na razie ten
trend ma charakter trwaly. Najczesciej rezygnuje sie z zadan do
samodzielnego wykonania przez studenta poza regularnymi zajeciami,
ktore daly by mu mozliwosc ugruntowania i rozwiniecia swojej wiedzy
nabytej podczas kursu.

Wydaje sie, ze jedna z mozliwych drog rozwiazania powzej nakreslonego
problemu jest stworzenie internetowego systemu, w ktorym w jednolitej
formie i miejscu prowadzacy beda mogli redagowac, testowac, opiniowac,
publikowac i wykorzystywac zadania do swoich kursow. Wielu
uzytkownikow nawet przy niewielkiej liczbie zgloszonych zadan bedzie
mialo do dyspozycji bogata oferte cwiczen. Niewiele pracy i wiele
korzysci.

System powinien uwzgledniac specyfike dydaktyki na kierunku Automatyka
i Robotyka ze szczegolnym wskazaniem na specjalnosci
Robotyka. Powinien umozliwiac quizy (na wzor ekranowek ale bez
autoryzacji) oraz ograniczone cwiczenia numeryczno symulacyjne z
wykorzystaniem MATLAB Web Serwer (na bazie wersji probnych). Powinien
miec rowniez cechy klasycznego zbioru zadan, w ktorym istnieje
rozdzial ze wskazowkami i odpowiedziami.

2) Wybrane zagadnienia

Wzorem dla systemu sa Wikipedia oraz Moodle. Pierwszy serwis doskonale
sie sprawdza jako publikacja tworzona w trybie rozproszonym, przez
nieograniczona liczbe autorow. Drugi z systemow jest dobrym przykladem
technik samo-testowania, w szczegolnosci quizow.

2.1) Uzytkownicy i poziomy jawnosci.

Uzytkownicy w systemie powinni dzielic sie na nauczycieli (redaktorow)
i studentow. Kazdy z nauczycieli moglby zalozyc swoj watek tematyczny
(za zgoda administratora systemu) i redagowac zbior zadan w ramach
tego watku. Inni nauczyciele mieliby mozliwosc publikowania na trzech
poziomach: testowym, ograniczonym i pelnym (za zgoda redaktora
watku).

Na poziomie testowym inni nauczyciele (ale nie wszyscy) i wybrani
studenci powinni miec mozliwosc recenzowania zadania i wyrazania
opinii na jego temat. Na tym poziomie nauczyciel powinien miec
mozliwosc realizacji zadania w ograniczonych grupach studenckich.

Na poziomie ograniczonym z zadania moga korzystac zarowno studenci jak
i nauczyciele z okreslonej grupy.

Na poziomie pelnym zadanie moze byc dostepne na zewnatrz.

Z kazdym zadaniem powinne byc stowarzyszone podpowiedzi i
odpowiedzi. W przypadku odpowiedzi wskazana jest nie tylko tradycyjna
forma (tekst rozwiazania) ale rowniez forma interaktywa oparta np. na
MATLAB Web Serwer. Byc moze warto zastanowic sie nad wywolywaniem
innych programow obslugujacych odpowiedzi na pytania/zadania (cos na
wzor skryptow cgi ?)

2.2) Testy

Testy wyboru. Na ekranie powinien pojawic sie formularz z pytaniami i
guzikami "prawda", "falsz", "nie wiem" oraz z informacja o czasie
realizacji testu. Wskazane rowniez stronicowanie: po odpowiedzi na
grupe pytan na jednym formularzu pojawia sie kolejna grupa pytan na
nastepnym formularzu

Quizy. To testy wyboru sekwencyjne (podobnie jak ekranowki), najlepiej
jeszcze kiedy sa one ograniczone w czasie. Wzor to quizy systemu Moodle.

2.3) Uzytkownicy II

Uzytkownicy systemu powinni sie dzielic na tych co maja konta i tych
co nie maja. Ci co maja konta powinni miec mozliwosc dobierania sie w
grupy. Nauczyciel powinien miec mozliwosc tworzenia grup studenckich
realizujacych dane zadanie oraz grup prowadzacych opiekujacych sie
dana grupa studencka. Studenci rowniez powinni miec mozliwosc
dobierania sie w grupy w systemie w celu wspolnej realizacji
okreslonego zadania (zarowno bez nadzoru nauczyciela jak i pod
nadzorem). Forum dyskusyjne z mozliwoscia umieszczania zalacznikow w
dowolnych formatach powinno umozliwic im zdalna wspolprace. (Tu nalezy
zbadac mozliwosc wspolpracy z gg i byc moze z jakims systemem
konferencyjnym)


3) Inne Poczatkowo wydawalo mi sie, ze ze nowy system powinien byc
samodzielna caloscia. Obecnie coraz bardziej sklaniam sie ku koncepcji
integracji nowego systemu z SOLem. Trzeba bedzie zbadac na ile jest to
mozliwe.
bela
LUDZIE!!! Czy wy umiecie czytać i myśleć? Mylicie Creole z Propelem.

A co do XML-a. Hibernate też ma konfiguracje w XML-u i wszyscy się nim zachwycają, bo na prawdę jest czym.
ActivePlayer
Cytat
@ActivePlayer
QUOTE

No, to pochwal sie jakich featursów uzywasz... bo mi np. wystarcza GetArray();, GetRow();, GetOne(); i _ewentualnie_ EscapeArray();. Jak mozna sie domyslic, implementacja tych funkcji we wlasnym zakresie to okolo 50 linii kodu php. A adodb wazy nieporownywalnie wiecej.

nie zamierzam ci tutaj nic wymieniac, ale AdoDB oferuje jeszcze inne ciekawe metody o ktorych nie wspomniales.

Mysle ze nie wymieniles, bo nie uzywasz nic poza tym co wymienilem
sf
Cytat(bela_666 @ 2005-11-23 13:51:20)
Do PDO dopisywałem tylko klasę MyPDO, która pobierała z konfiguracji dane: user, hasło, host i tworzyło obiekt, i z metodą getPDO(), która zwracała obiekt PDO, bo przecież konstruktor tego nie zwróci.

Nie lepiej zrobic klase, ktora dziedziczy po PDO? Dodatkowo czy dobrym rozwiazaniem jest pobieranie danych do bazy w srodku klasy? Moze lepiej pozostac przy podawaniu w konstruktorze.. albo jeszcze lepiej, zrobic singleton i przy pobieraniu instacji podawac dane do bazy.. mozemy wtedy utworzyc np. dwa polaczenia.. jedno do postgresa, drugie do mysqla. Dodatkowo dziedziczenie pozwala nam rozszerzyc niektore funkcje... np. przy wywolywaniu zapytan mozna dodac mozliwosc logowania zapytan.

Cytat
A co do XML-a. Hibernate też ma konfiguracje w XML-u i wszyscy się nim zachwycają, bo na prawdę jest czym.


Planowalem tez konfiguracje miec w XML.. ale akurat nigdy mi sie nie chce.. latwiej mi to zrobic na plikach ini badz odrazu w php. Poprostu jest mi tak szybciej. Moze z czasem, jak projekt nabierze juz koncowych krztaltow to czlowiekowi sie zachce napisac skrypt, ktory bedzie generowal taki xml, a potem go zamienial na php.. ale narazie brak mi argumentow by bylo to konieczne. Chyba, ze masz jakies?smile.gif
bela
Cytat(sf @ 2005-11-23 23:32:33)
Nie lepiej zrobic klase, ktora dziedziczy po PDO?

Z tego co pamiętam to były kłopoty z tym, bo PDO (czy konstruktor) było zadeklarowany jako final i w tym miejscu wszystko leży. Więc dlatego miałem w ten sposób rozwiązane. Zresztą chyba też na singletonie oparte.
SongoQ
Troche pytanie bedzie odbiegalo od tematu ale jesli mowa o wielu polaczeniach do baz i to do roznych to chcialbym sie dowiedziec w jaki sposob to robicie. Chodzi mi o cos takiego: jest sobie jakis tam framework i jeden modul (model) korzysta np z MySQLa a 2 z PG przy czym absluga sesji lezy w PG i inforcajce dotyczace userow.
mike
Cytat(SongoQ @ 2005-11-24 09:54:42)
(...) Chodzi mi o cos takiego: jest sobie jakis tam framework i jeden modul (model) korzysta np z MySQLa a 2 z PG przy czym absluga sesji lezy w PG i inforcajce dotyczace userow.

Zainteresuj się Mojavi. W tym frameworku jest zaimplementowana klasa DatabaseManager do równoległych połączeń z różnymi bazami danych.

Działa bardzo fajnie smile.gif
sf
Cytat(bela_666 @ 2005-11-23 23:30:49)
Cytat(sf @ 2005-11-23 23:32:33)
Nie lepiej zrobic klase, ktora dziedziczy po PDO?

Z tego co pamiętam to były kłopoty z tym, bo PDO (czy konstruktor) było zadeklarowany jako final i w tym miejscu wszystko leży. Więc dlatego miałem w ten sposób rozwiązane. Zresztą chyba też na singletonie oparte.

Nom, byl taki wlasnie bug z final. Zostalo to na szczescie poprawione smile.gif
BugTomek
Cytat(mike_mech @ 2005-11-23 00:38:12)
P.S. Creole, AdoDB owszem. Ale PEAR tutaj nie pasuje. Owszme jedną z bibliotek PEAR'a jest jakiś abstrakt, ale wywołanie go tu w całości to pomyłka.

wywoływanie w całości PEAR? O so chodzi?
PEAR ma po prostu kilka sytsemów do obsługi baz danych, PEAR::DB, PEAR::MDB i PEAR::MDB2. Wszystkie są bardzo dobre, jeżeli chodzi o możliwości, a najlepsze jest MDB2, bo oprócz tego, że ma możliwości to ma jeszcze szybkość. Nie ma jeszcze wersji finalnej, choć w zasadzie nie wiadomo dlaczego - wg. mnie można już spokojnie tego używać.
Poza tym polecam AdoDB_Lite - odchudzoną wersję AdoDB.
Można spróbować też z Solarem (link), który jest czymś w rodzaju PEARa tylko dla php5. Jest tam klasa do obsługi SQL, oparta na PDO nastawiona na przenośność - ma np. wbudowaną obsługę LIMIT dla różnych baz danych. Problem w tym, że jest to jeszcze w powijakach.

I jeszcze jedno: może spróbować z ORM - Propel, albo ezPDO.
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.