Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: moja klasa z zapytaniami SQL
Forum PHP.pl > Forum > PHP
damianooo
Witam,

Proszę o sprawdzenie czy zapis mojej klasy z zapytaniami SQL jest poprawny pod względem OOP, co można by zmienić, uproscić itd. Potrzebuję takiej klasy aby zrobić sobie podstawowe zapytania CRUD dla obsługi jednej tabeli bazy danych. Dobrze się do tego zabralem ?

  1. class MyQueries extends PDO
  2. {
  3.  
  4. public function __construct()
  5. {
  6. parent::__construct('mysql:host=localhost;dbname=mydatabase', 'login', 'password');
  7. }
  8.  
  9. public static function getCities()
  10. {
  11. try {
  12. $conn = new MyQueries();
  13. $stmt = $conn->prepare('SELECT * FROM city');
  14. $stmt->execute();
  15. } catch (PDOException $e) {
  16. echo 'ERROR: ' . $e->getMessage();
  17. }
  18.  
  19. return $stmt;
  20. }
  21.  
  22. public static function create(){
  23. // code
  24. }
  25.  
  26. public static function delete($id){
  27. // code
  28. }
  29.  
  30. }



dzięki
Spawnm
Źle. Wydziel model odpowiedzialny za łączenie z bazą. Wywal static. Obecnie jest to zbiór funkcji zamkniętych w klasie. Nie ma to nic wspólnego z oop.

damianooo
Czy tak będzie lepiej ? ... nie wiem jak z tym rozdzieleniem połączenia z bazą danych. Można prosić o podpowiedź. Bo teraz w tej postaci to mi nie działa.

Teraz mam tak:

  1. class DBObject extends PDO
  2. {
  3.  
  4. public function __construct()
  5. {
  6. parent::__construct('mysql:host=localhost;dbname=database', 'login', 'password');
  7. }
  8.  
  9. }



  1. class City extends DBObject
  2. {
  3. public $name;
  4. protected $country;
  5.  
  6. public function __construct($name, $country)
  7. {
  8. $this->setName($name);
  9. $this->setCountry($country);
  10. }
  11.  
  12. public function setName($name)
  13. {
  14. $this->name = $name;
  15. return $this;
  16. }
  17.  
  18. public function getName()
  19. {
  20. return $this->name;
  21. }
  22.  
  23. public function setCountry(Country $country)
  24. {
  25. $this->country = $country;
  26. return $this;
  27. }
  28.  
  29. public function getCountry()
  30. {
  31. return $this->country;
  32. }
  33.  
  34. public function save()
  35. {
  36. $stmt = $this->prepare('INSERT INTO city VALUES(:name,:country_id)');
  37. $stmt->execute(array(':name' => $this->name, ':country_id' => $this->country_id));
  38. }
  39.  
  40. public function load()
  41. {
  42. $stmt = $this->prepare('SELECT c.city_id,c.name,cn.name as country FROM city c INNER JOIN country cn ON c.country_id = cn.country_id');
  43. $stmt->execute();
  44. }
  45.  
  46. }




Bardzo proszę o znaleznienie błędów i poprawienie mnie.
Dzięki
sajegib
zrób nową klasę od łączenia z bazą danych i przekaż jej obiekt jako parametr do konstruktora np:

  1. $db = new database(new connection());
damianooo
czy tak? :
  1. class DBObject extends PDO
  2. {
  3. public function __construct()
  4. {
  5. parent::__construct('mysql:host=localhost;dbname=database', 'login', 'password');
  6. }
  7. }




i wtedy tak:


  1. class City extends DBObject
  2. {
  3. public $name;
  4. protected $country;
  5. public $db;
  6.  
  7. public function __construct($name, $country)
  8. {
  9. $this->db = new DBObject();
  10. $this->setName($name);
  11. $this->setCountry($country);
  12. }
  13.  
  14. public function setName($name)
  15. {
  16. $this->name = $name;
  17. return $this;
  18. }
  19.  
  20. public function getName()
  21. {
  22. return $this->name;
  23. }
  24.  
  25. public function setCountry(Country $country)
  26. {
  27. $this->country = $country;
  28. return $this;
  29. }
  30.  
  31. public function getCountry()
  32. {
  33. return $this->country;
  34. }
  35.  
  36. public function save()
  37. {
  38. $stmt = $this->db->prepare('INSERT INTO city VALUES(:name,:country_id)');
  39. $stmt->execute(array(':name' => $this->name, ':country_id' => $this->country_id));
  40. }
  41.  
  42. public function load()
  43. {
  44. $stmt = $this->d->prepare('SELECT c.city_id,c.name,cn.name as country FROM city c INNER JOIN country cn ON c.country_id = cn.country_id');
  45. $stmt->execute();
  46. }
  47.  
  48. public function update()
  49. {
  50. // code here
  51. }
  52.  
  53. public function delete()
  54. {
  55. // code here
  56. }
  57.  
  58. }
Spawnm
W twoim przypadku jeśli klasa dziedzicząca PDO nie robi nic, żadnego query buildera itd. to można by ją sobie darować.
Do konstruktora przekazuj $pdo i tyle. Poczytaj też o dziedziczeniu, kiedy się je stosuje i po co. Bo klasa City nie powinna dziedziczyć klasy do db wink.gif
damianooo
zrobiłem tak ale nie wiem czemu nie zapisuje mi rekordu do bazy danych. Co mogę jeszcze mieć źle ?

  1. class City
  2. {
  3. public $name;
  4. public $db;
  5.  
  6. public function __construct($name)
  7. {
  8. $this->db = new PDO('mysql:host=localhost;dbname=database', 'login', 'password');
  9. $this->setName($name);
  10. }
  11.  
  12. public function setName($name)
  13. {
  14. $this->name = $name;
  15. return $this;
  16. }
  17.  
  18. public function save()
  19. {
  20. $stmt = $this->db->prepare('INSERT INTO city VALUES(:name,:country_id)');
  21. $stmt->execute(array(':name' => $this->name, ':country_id' => 1));
  22. }
  23.  
  24. }



i wywołanie w innym pliku:

  1. require_once 'Model/City.php';
  2. $city = new City('Madrid');
  3. $city->save();
Spawnm
Nie. Czemu city zajmuje się łączeniem z pdo? Inne modele też będą to robić?
  1. $pdo = new PDO(...);
  2. $city = new City($pdo);
  3. $city->setName('lol')
  4. ->setCountry('lol2')
  5. ->add();

I nie używaj nazwy save() do insertowania, w frameworkach ta nazwa oznacza update rekordu jeśli istnieje, lub instert jeśli nie istnieje.
damianooo
Zrobiłem tak , ale nadal coś nie tak z tym moim połączeniem, nadal w bazie po odświeżeniu strony nie ma żadnej zmiany, coś nadal robię źle ... ehh .

  1. class City
  2. {
  3. public $name;
  4. public $db;
  5.  
  6. public function __construct(PDO $pdo)
  7. {
  8. $this->db = $pdo;
  9. }
  10.  
  11. public function setName($name)
  12. {
  13. $this->name = $name;
  14. return $this;
  15. }
  16.  
  17. public function add()
  18. {
  19. $stmt = $this->db->prepare('INSERT INTO city VALUES(:name,:country_id)');
  20. $stmt->execute(array(':name' => $this->name, ':country_id' => 1));
  21. }
  22.  
  23. }


i wywołanie:

  1. require_once 'Model/City.php';
  2.  
  3. $pdo = new PDO('mysql:host=localhost;dbname=database', 'login', 'password');
  4. $city = new City($pdo);
  5. $city->add();
nospor
No to wyswietl blad PDO a bedziesz wiedzial co jest nie tak :/

ps: nie masz juz przypadkiem miasta o ID = 1?
Spawnm
W wywołaniu zapomniałeś o ustawieniu name.

Daj private lub protected:
  1. public $name;
  2. public $db

http://pl.wikipedia.org/wiki/Hermetyzacja_%28informatyka%29
damianooo
ehh faktycznie smile.gif ... jednak nadal nie działa ... postanowiłem wyświetlić co PDO pluje i tak:

Mam tak:

  1. class City
  2. {
  3. private $name;
  4. private $db;
  5.  
  6. public function __construct(PDO $pdo)
  7. {
  8. $this->db = $pdo;
  9. }
  10.  
  11. public function setName($name)
  12. {
  13. $this->name = $name;
  14. return $this;
  15. }
  16.  
  17. public function add()
  18. {
  19. $stmt = $this->db->prepare('INSERT INTO city VALUES(:name,:country_id)');
  20. $stmt->execute(array(':name' => $this->name, ':country_id' => 1));
  21. }
  22.  
  23. }


i wywołanie:

  1. require_once 'Model/City.php';
  2.  
  3. $pdo = new PDO('mysql:host=localhost;dbname=database', 'login', 'password');
  4. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  
  6. try {
  7. $city = new City($pdo);
  8. $city->setName('Katowice');
  9. $city->add();
  10. } catch (PDOException $e) {
  11. print_r($e->getTrace());
  12. }


a PDO krzyczy to:

Array ( [0] => Array ( [file] => /var/www/test/Model/City.php [line] => 43 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [:name] => Katowice [:country_id] => 1 ) ) ) [1] => Array ( [file] => /var/www/test/test.php [line] => 12 [function] => add [class] => City [type] => -> [args] => Array ( ) ) )
nospor
rety..... ty nie wyswietlaj sciezki bledu, tylko wyswietlaj blad....
damianooo
a no tak , sorry smile.gif


  1. SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1
nospor
No to chyba masz juz teraz napisane.... liczba kolumn jakie wstawiasz do tabeli jest mniejsza od wymaganej liczby kolumn jakie ustawiles dla tej tabeli
damianooo
OK, mam , miało być tak:

  1. public function add()
  2. {
  3. $stmt = $this->db->prepare('INSERT INTO city (name,country_id) VALUES(:name,:country_id)');
  4. $stmt->execute(array(':name' => $this->name, ':country_id' => 1));
  5. }









Jeszcze chciałem prosić o podpowiedź jak pobrać ID zapisanego obiektu w bazie i przekazać go jako parametr przy zapisywaniu pola innego obiektu w sytuacji gdy encje połączone są w relacji "jeden do wielu" .

i potrzebuję zapisać to coś w ten deseń (country będzie pobierane na stronie z pola rozwijanego):

W klasie "Country" mam tak:

  1. public function findById($id)
  2. {
  3. $stmt = $this->db->prepare('SELECT * FROM Country WHERE country_id :id');
  4. $stmt->execute(array('id' => $id));
  5. $row = $stmt->fetch();
  6. return $row;
  7. }


i zapisuję to tak:

  1. require_once 'Model/Country.php';
  2. require_once 'Model/City.php';
  3.  
  4. $pdo = new PDO('mysql:host=localhost;dbname=database', 'login', 'password');
  5. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.  
  7. try {
  8. $country = new Country($pdo);
  9. $country->findById(2);
  10. $city = new City($pdo);
  11. $city->setName('Liverpool');
  12. $city->setCountry($country);
  13. $city->add();
  14. } catch (PDOException $e) {
  15. print_r($e->getMessage());
  16. }


PDO krzyczy:

  1. SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'' at line 1
nospor
findById ci zwraca rekord, ale ty go w ogole nie przechwytujesz nigdzie
damianooo
nie przychwytuję tzn. ?

zmieniłem tak:

  1. $country = new Country($pdo);
  2. $countryObject = $country->findById(2);
  3. $city = new City($pdo);
  4. $city->setName('Liverpool');
  5. $city->setCountry($countryObject);
  6. $city->add();


ale nadal źle
nospor
$countryObject = $country->findById(2);
var_dump($countryObject);

No juz tak banalna analize to moglbys robic sam.... :/

poza tym pokaz jak wyglda teraz kod metody ADD

poza tym, skoro city potrzebuje ID. a ty ID przeciez masz, to po grzyba bawisz sie w budowanie obiektu. Chyba ze twoim celem jest sprawdzenie czy ten obiekt istnieje, w co akurat watpie (bez urazy)
damianooo
obiekt nie istnieje masz rację, zrobiłem tak:

  1. $country = new Country($pdo);
  2. $countryObject = $country->findById(2);
  3. var_dump($countryObject);


i mam pusty ekran. Poza tym z obsługą wyjątków krzyczał mi:

  1. SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''2'' at line 1


metoda add City to:

  1. public function add()
  2. {
  3. $stmt = $this->db->prepare('INSERT INTO city (name,country_id)VALUES(:name,:country_id)');
  4. $stmt->execute(array(':name' => $this->name, ':country_id' => $this->country));
  5. }
nospor
WHERE country_id :id
Nie zapomniales tu o np. = ?
damianooo
tak były dwa błędy , oprucz tego jeszcze Country miałem z dużej litery zamiast z małej . Teraz nie krzyczy jednak nie dodaje dalej rekordu sad.gif


  1. require_once 'Model/Country.php';
  2. require_once 'Model/City.php';
  3.  
  4. $pdo = new PDO('mysql:host=localhost;dbname=wheather_dc', 'root', '123qwe');
  5. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6. try {
  7. $country = new Country($pdo);
  8. $countryObject = $country->findById(2);
  9. $city = new City($pdo);
  10. $city->setName('Liverpool');
  11. $city->setCountry($countryObject);
  12. $city->add();
  13. } catch (PDOException $e) {
  14. print_r($e->getMessage());
  15. }


$countryObject zwraca mi obiekt:

array(4) { ["country_id"]=> string(1) "2" [0]=> string(1) "2" ["name"]=> string(5) "Spain" [1]=> string(5) "Spain" }

ale coś w klasie chyba mi będzie w takim razie brakowało:

  1. class Country
  2. {
  3. private $id;
  4. private $name;
  5. private $db;
  6.  
  7. public function __construct(PDO $pdo)
  8. {
  9. $this->db = $pdo;
  10. }
  11.  
  12. public function getId()
  13. {
  14. return $this->id;
  15. }
  16.  
  17. public function setName($name)
  18. {
  19. $this->name = $name;
  20. return $this;
  21. }
  22.  
  23. public function getName()
  24. {
  25. return $this->name;
  26. }
  27.  
  28. public function add()
  29. {
  30. $stmt = $this->db->prepare('INSERT INTO country (name) VALUES(:name)');
  31. $stmt->execute(array(':name' => $this->name));
  32. }
  33.  
  34. public function findById($id)
  35. {
  36. $stmt = $this->db->prepare('SELECT * FROM country WHERE country_id = :id');
  37. $stmt->execute(array('id' => $id));
  38. $row = $stmt->fetch();
  39. return $row;
  40. }
  41.  
  42. }
nospor
rety....
var_dump($countryObject);
nie zwraca ci nic? Zadnego tekstu? Nic a nic? Niemozliwe
damianooo
zwraca sorry , zmodyfikowałem powyższy post i dodałem wygląd klasy Country
nospor
facepalmxd.gif
Czy ty w ogole czytasz co dostajesz? Za chwile zamkne temat bo ty zamiast myslec to z byle niczym lecisz na forum....no nie na tym to polega....

Przeciez jak wol masz napisane, ze zwraca ci tablice a nie obiekt.

Z tej tablicy chyba chcesz pobrac ID i to ID wstawic dopiero dla metody ADDCITY, nieprawdaz??
damianooo
ok , sorry faktycznie tablicę zwraca, jednak zależy mi by zwracało obiekt , poprawiłem więc na tak:

  1. public function findById($id)
  2. {
  3. $stmt = $this->db->prepare('SELECT * FROM country WHERE country_id = :id');
  4. $stmt->execute(array('id' => $id));
  5. return $stmt;
  6. }


teraz zwraca mi obiekt ale w poostaci:
  1. object(PDOStatement)#3 (1) { ["queryString"]=> string(44) "SELECT * FROM country WHERE country_id = :id" }


Chcę to zrobić tak jak jest w Frameworkach a więc ładuję obiekt do funkcji i on mi od razu zapisuje ID w country_id tabeli City
nospor
zwraczasz obiekt PDO to czego sie dziwisz ze dostajesz PDO?

chcesz obiekt Country toć go masz
$country = new Country($pdo);
Jaki inny obiekt chcesz miec? Chcesz miec Coutry z wypelnionym name i id? To wypelnij, ale nadal masz zwracac $this bo to jest twoim obiektem Country

A jak chcesz by PDO zamiast tablicy zwracalo ci obiekt, to zajrzyj do manuala
http://pl1.php.net/manual/en/pdostatement.fetchobject.php
damianooo
nie, to ma działać tak:

Tabela "City" ma mieć "name" i "country_id" . A jak podałem w klasie City, metoda setCountry() ma w parametrze pobierać obiekt Country:


  1. public function setCountry(Country $country)
  2. {
  3. $this->country = $country->getId();
  4. return $this;
  5. }


a więc potrzebuję teraz tego obiektu "Country" aby móc w metodzie "add" klasy "City" zapisać ID tego obiektu Country, bo jak napisałem powyżej tabela City wymaga country_id (ale tak jak pisałem to ma być pobrane z obiektu a nie z tablicy) :

  1. public function add()
  2. {
  3. $stmt = $this->db->prepare('INSERT INTO city (name,country_id)VALUES(:name,:country_id)');
  4. $stmt->execute(array(':name' => $this->name, ':country_id' => $this->country));
  5. }

nospor
No to ci przeciez napisalem, ze masz juz obietk country....toz caly czas na nim operujesz.... a jak sie upierasz by metoda find zwracala ci obiekt to rob
return $this;
Czytaj co sie do ciebie pisze wkoncu.

Tylko ze jak chcesz by ten obiekt byl wypelniony id i name to masz to ustawic przed return.... wkoncu te id i name wlasnie z bazy pobrales :/
damianooo
Cytat
Tylko ze jak chcesz by ten obiekt byl wypelniony id i name to masz to ustawic przed return


możesz powiedzieć w którym miejscu i jak to ustawić ?
nospor
A mozesz przez chwilkę sprobowac pomyslec sam? Tak przynajmniej przez 15 minut? Nie bój sie, nie zaszkodzi
damianooo
no pomyślałem , zrobiłem tak:

  1. public function findById($id)
  2. {
  3. $stmt = $this->db->prepare('SELECT * FROM country WHERE country_id = :id');
  4. $stmt->execute(array('id' => $id));
  5. $this->id = $id;
  6. return $this;
  7. }



ale nadal mi nie dodaje rekordu do bazy

chociaż już teraz jak sprawdzam co mam w obiekcie var_dump'em to mam tak:

object(Country)#2 (3) { ["id":"Country":private]=> int(2) ["name":"Country":private]=> NULL ["db":"Country":private]=> object(PDO)#1 (0) { } }

czyli tym razem ID jest ... pytanie czego jeszcze mu brakuje żeby to zapisać
nospor
Pokaz jak wyglada cala klasa City oraz kod jak ty to wszystko odpalasz aktualnie
damianooo
  1. class City
  2. {
  3. private $id;
  4. private $name;
  5. private $country;
  6. private $db;
  7.  
  8. public function __construct(PDO $pdo)
  9. {
  10. $this->db = $pdo;
  11. }
  12.  
  13. public function getId()
  14. {
  15. return $this->id;
  16. }
  17.  
  18. public function setName($name)
  19. {
  20. $this->name = $name;
  21. return $this;
  22. }
  23.  
  24. public function getName()
  25. {
  26. return $this->name;
  27. }
  28.  
  29. public function setCountry(Country $country)
  30. {
  31. $this->country = $country->getId();
  32. return $this;
  33. }
  34.  
  35. public function getCountry()
  36. {
  37. return $this->country;
  38. }
  39.  
  40. public function add()
  41. {
  42. $stmt = $this->db->prepare('INSERT INTO city (name,country_id)VALUES(:name,:country_id)');
  43. $stmt->execute(array(':name' => $this->name, ':country_id' => $this->country));
  44. }
  45.  
  46. }




  1. class Country
  2. {
  3. private $id;
  4. private $name;
  5. private $db;
  6.  
  7. public function __construct(PDO $pdo)
  8. {
  9. $this->db = $pdo;
  10. }
  11.  
  12. public function getId()
  13. {
  14. return $this->id;
  15. }
  16.  
  17. public function setName($name)
  18. {
  19. $this->name = $name;
  20. return $this;
  21. }
  22.  
  23. public function getName()
  24. {
  25. return $this->name;
  26. }
  27.  
  28. public function findById($id)
  29. {
  30. $stmt = $this->db->prepare('SELECT * FROM country WHERE country_id = :id');
  31. $stmt->execute(array('id' => $id));
  32. $this->id = $id;
  33. return $this;
  34. }
  35.  
  36. }



a tak wywołuję:

  1. require_once 'Model/Country.php';
  2. require_once 'Model/City.php';
  3.  
  4. $pdo = new PDO('mysql:host=localhost;dbname=database', 'login', 'password');
  5.  
  6. $country = new Country($pdo);
  7. $countryObject = $country->findById(2);
  8. $city = new City($pdo);
  9. $city->setName('Liverpool');
  10. $city->setCountry($countryObject);
  11. $city->add();
nospor
I co, nie zapisuje ci do bazy ale i tez nie wali zadnym bledem??
damianooo
dobra działa ... dzięki nospor ... zauważyłem jeden błąd przed wysłaniem tego kodu i szybko poprawiłem . Teraz wszystko już działa super . Rozumiem, że w tej postaci jak mam teraz jest dobrze i jeśli obrałem taką metodę to tak to ma wyglądać ? ...

Dzięki wielkie za wytrwałość bo męczyłem strasznie . Fajnie że pomogłeś bo teraz mogę lecieć dalej ze swoją aplikacją i nauczyłem się dzisiaj wiele. Mam nadzieję, że takich głupich błędów nie będę już robił.

Pozdrawiam
nospor
Cytat
Rozumiem, że w tej postaci jak mam teraz jest dobrze i jeśli obrałem taką metodę to tak to ma wyglądać ? ...
Dobrze? Ledwo mizernie, bardzo daleko od dobrze...

W metodzie findbyid przypisujesz to id w ogole nie sprawdzajac czy sie powiodlo czy nie, czy znalazl czy nie. Na chwile obecna metoda ta jest bez sensu bo nic nie robi.
O przypisaniu name juz nie bede wspominal bo go w ogole nie ma. Skoro chcesz miec obiekt to niech on zawiera co ma zwierac a nie robisz pol srodki

W tej chwili masz tez dwie zmiennej, ktore wskazuja dokladnie na ten sam obiekt
$countryObject = $country
po co?
damianooo
ehh czyli jednak do dupy nadal ... nie wiem właśnie jak przypisać name w tej metodzie
nospor
no toc przeciez miales tablice z danymi w wyniku fetch. I w tej tablicy miales name..... Skoro miales name to jakim problem zrobic $this->name = name z tablicy?

ps: to moj ostatni post w tym temacie chyba dzisiaj, bo moja cierpliwosc jest na niebezpiecznie niskim poziomie.
damianooo
poprawiłem na tak:

  1. public function findById($id)
  2. {
  3. $stmt = $this->db->prepare('SELECT * FROM country WHERE country_id = :id');
  4. $stmt->execute(array('id' => $id));
  5.  
  6. while ($row = $stmt->fetch()) {
  7. $this->id = $row['id'];
  8. $this->name = $row['name'];
  9. }
  10.  
  11. return $this;
  12. }


rozumiem, że Cie to denerwuje, ale chcę wiedzieć na przyszlość, dlatego pytam jak to powinno wyglądać prawidłowo.
Jeszcze raz sorry
nospor
Nie deneruje mnie pytanie, tylko bezmyslnosc i pisanie posta za postem bez zastanowienia, co kilkukrotnie w tym temacie uczyniłes - to jest denerwujące. My tu nie jestesmy zadnym prywatnym helpdeskiem oplacanym przez zarzad. My tu pomagamy za darmo w wolnym czasie ale oczekujemy, ze druga strona tez cos z siebie da.
Juz nawet twoj temat byl raportowany przez kogos innego by zamknac wink.gif

Jakby denerwowalo mnie pytanie, to nie siedzialbym tyle lat na forum smile.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.