Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czy taka klasa jest dobrze skonstruowana
Forum PHP.pl > Forum > PHP
damianooo
Witam,

Chciałem prosić o opinię na temat takiej klasy. Klasa zapisuje dane o kursach walut NBP z pliku xml i odczytuje je z bazy danych. Nie wiem czy samo połącznie do bazy powinno być tak jak to zrobiłem czy może w osobnej klasie? Poza tym czy tej klasie coś brakuje lub jest w niej coś nie potrzebne?


  1. <?php
  2.  
  3. class kursy_walut
  4. {
  5. private $host;
  6. private $user;
  7. private $password;
  8. private $db;
  9. private $statement;
  10. private $count;
  11.  
  12. function __construct($host,$user,$password,$db){
  13. $this->host = $host;
  14. $this->user = $user;
  15. $this->password = $password;
  16. $this->db = $db;
  17.  
  18. $this->db = new PDO('mysql:host='.$host.';dbname='.$db.';',$user,$password);
  19. }
  20.  
  21. function saveXMLToTheDatabase(){
  22.  
  23. $walutyKursy = simplexml_load_file('http://rss.nbp.pl/kursy/xml2/2012/a/12a127.xml');
  24.  
  25. $nrTabeli = $walutyKursy->numer_tabeli;
  26.  
  27. foreach($walutyKursy->pozycja as $poz){
  28. $naz_wal = $poz->nazwa_waluty;
  29. $przel = $poz->przelicznik;
  30. $kod_wal = $poz->kod_waluty;
  31. $kurs_sr = $poz->kurs_sredni;
  32.  
  33. $this->db->exec('INSERT INTO kursy_walut_nbp (numer,nazwa_wal,przel,kod_w,kurs_s) VALUES (\''.$nrTabeli.'\',\''.$naz_wal.'\',\''.$przel.'\',\''.$kod_wal.'\',\''.$kurs_sr.'\')');
  34.  
  35. }
  36.  
  37.  
  38. }
  39.  
  40. function readDataFromTheDatabase($val,$dat,$number){
  41.  
  42. $statement = $this->db->query('SELECT nazwa_wal,przel,kod_w,kurs_s FROM kursy_walut_nbp');
  43.  
  44. echo '<ul>';
  45. foreach($statement as $row){
  46. $count = $row['kurs_s'] * $val;
  47. echo '<li>'.$row['nazwa_wal'].' - '.$row['przel'].' - '.$row['kod_w'].' - '.$row['kurs_s'].' - '.$count.'</li>';
  48. }
  49. echo '</ul>';
  50. }
  51.  
  52. }
  53.  
  54.  
  55. $db_con = new kursy_walut('localhost','root','ddd','baza1');
  56. $db_con -> saveXMLToTheDatabase();
  57. $db_con -> readDataFromTheDatabase(10.5,'2012-06-04','HNG/DMSD/436');
  58.  
  59.  
  60.  
  61. ?>
  62.  




proszę o podpowiedź.
dzięki
tehaha
1. powienieneś przekazywać obiekt PDO w konstruktorze, a nie tworzyć go wewnątrz klasy
2. Bez sensu jest INSERT w foreach() to możesz dodać jednym zapytaniem podając zestawy danych po przecinku -> manual mysql
3. wewnątrz klasy nie powinno być echo, print itd, lepiej zwracaj to sobie w postaci tablicy i potem wyświetlaj
4. I najlepiej to używać prepared statements
damianooo
co masz na myśli pisząc:

"1. powienieneś przekazywać obiekt PDO w konstruktorze, a nie tworzyć go wewnątrz klasy"

możesz napisać przykład jak to powinienem zrobić ?

dzięki
tehaha
Po prostu przekazujesz do klasy zmienną $db, która jest już obiektem PDO, tym sposobem musiał byś w każdej klasie jaką użyjesz tworzyć oddzielną instancję klasy, a to jest mało wydajne i nie elastyczne
  1. class kursy_walut
  2. {
  3. private $db;
  4.  
  5. function __construct(PDO $db)
  6. {
  7. $this->db = $db;
  8. }
  9. }


nie widzę też potrzeby, żeby zmienna $statement była prywatną zmienną klasy, przeciesz nie potrzebujesz mieć do niej dostępu z innych metod funkcji
damianooo
ok, dzięki ...

rozumiem, że takie wywołanie zostaje i jest dobrze :

  1. $db_con = new kursy_walut('localhost','root','ddd','baza1');
tehaha
Nie.. po co klasie kursy_walut Twoje hasła do bazy danych? Przecież ona zajmuje się walutami, a nie łączeniem z bazą, Instancje PDO masz stworzyć poza klasą i tylko przekazać obiekt, żeby można było wykonwać na bazie potrzebne operację.

  1. $db = new PDO('mysql:host='.$host.';dbname='.$db.';',$user,$password);
  2.  
  3. $kursy = new kursy_walut($db);
  4.  
toffiak
Przyjęło się że nazwy klas piszemy z dużej litery w notacji CamelCase
Sephirus
@toffiak - z dużej - ok ale z tym camel-casem to przesadziłeś - gdzie się tak przyjęło? smile.gif Jest wiele frameworków, bibliotek gdzie używa się "podłogi" a nie wielbłądka smile.gif

Od siebie dodam, że jedyna własność klasy, która jest potrzebna to $db. Resztę można spokojnie wywalić.

Pętla while i masa zapytań po sobie też jest zbędna. Najlepiej zastąp to konstrukcją:

  1. INSERT INTO ....... VALUES (...), (...), (...) ....... (...)


Metoda saveXMLToTheDatabase() powinna przyjmować w argumencie jaki plik XML ma pójść do bazy (jego adres) w razie nie podania można użyć domyślnego - staje się to bardziej uniwersalne.
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.