Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][OOP] Klasa do łączenia się z bazą danych - czy dobrze jest skonstruowana?
Forum PHP.pl > Forum > Przedszkole
Dominator
Witajcie
Dawno nic w php nie robiłem, więc tak dla przypomnienia zrobiłem sobie klasę, która łączy się z bazą danych. Mam takie pytanie - czy ja dobrze to zrobiłem? Co ewentualnie proponujecie zmienić?
Ogólnie to jestem w trakcie przesiadki na OOP, więc nie krzyczcie biggrin.gif

  1. <?php
  2.  
  3. Class UserInterface
  4. {
  5. public function SetDBData($_server, $_port, $_username, $_password, $_database);
  6. {
  7. $this->server = $_server;
  8. $this->port = $_port;
  9. $this->user = $_username;
  10. $this->password = $_password;
  11. $this->database = $_database;
  12. }
  13. public function DBConnect()
  14. {
  15. Try
  16. {
  17. $pdo = new PDO('mysql:host='.$this->server.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );
  18. }
  19. catch(PDOException $e)
  20. {
  21. return "Error! Code ->".$e;
  22. }
  23. }
  24. }
  25.  
  26. $_UI = new UserInterface();
  27. $this->SetDBData("","","","");
  28. $this->DBConnect();
  29.  
  30. ?>
ssstrz
metode SetDBData zmien na protected i wywoluj ja z konstruktora ktory przyjmue potrzebne parametry. DbConnect tworzy instancje obiektu PDO ale gdzie zapisuujesz ta zmiena? zrob pole do ktorego przypisujesz zmienna typu PDO jako protected i moja ostatnia 3 uwaga to nie lap tak szybko wyjatkow lepiej obsluzyc je jak najwyzej
!*!
- nazwa UserInterface niewiele mówi i ma mało wspólnego z DB.
- w DBConnect powinieneś chyba zwracać ten obiekt PDO, aby móc na nim operować.
- jak chcesz poza klasa używać $this? To nie zadziała.
- wywal podkreślenia z nazw zmiennych, to nie czasy PHP4
Szymciosek
Sam używam podkreślenia do oznaczenia zmiennych, które przekazuje do metody. To zła praktyka?
!*!
Cytat(Szymciosek @ 8.05.2013, 19:16:23 ) *
Sam używam podkreślenia do oznaczenia zmiennych, które przekazuje do metody. To zła praktyka?


http://forum.php.pl/index.php?s=&showt...t&p=1041800 kilka postów o tym dlaczego.
Dominator
  1. <?php
  2.  
  3. Class DB
  4. {
  5. protected function Set($server, $port, $username, $password, $database)
  6. {
  7. $this->server = $server;
  8. $this->port = $port;
  9. $this->user = $username;
  10. $this->password = $password;
  11. $this->database = $database;
  12. }
  13. public function Connect()
  14. {
  15. Try
  16. {
  17. $pdo = new PDO('mysql:host='.$this->server.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );
  18. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19. }
  20. catch(PDOException $e)
  21. {
  22. return "Error! Code ->".$e;
  23. }
  24. }
  25. }
  26.  
  27. $db = new DB();
  28. $db->Set("","","","","");
  29. $db->Connect();
  30. ?>


Dostaję: Fatal error: Call to protected method DB::Set() from context '' in...

Wyjaśni ktoś dlaczego?
!*!
Nie możesz się odwołać do metody która jest prywatna lub chroniona. http://pl.wikibooks.org/wiki/PHP
Dominator
Okej, pomajstrowałem i wygląda to tak:

  1. <?php
  2.  
  3. Class DB
  4. {
  5. public function Set($server, $port, $username, $password, $database)
  6. {
  7. $this->server = $server;
  8. $this->port = $port;
  9. $this->user = $username;
  10. $this->password = $password;
  11. $this->database = $database;
  12. }
  13. public function Connect()
  14. {
  15. try
  16. {
  17. $pdo = new PDO('mysql:host='.$this->server.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );
  18. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19. if($pdo)
  20. {
  21. return "connected";
  22. }
  23. }
  24. catch(PDOException $e)
  25. {
  26. return "Error! Code ->".$e->getMessage();
  27. }
  28. }
  29. }
  30.  
  31. $db = new DB();
  32. $db->Set("","","","","");
  33. echo $db->Connect();
  34.  
  35.  
  36.  
  37. ?>


Tylko dostaję błąd: Notice: Undefined property: DB::$username in ... (17 linia)
Dlaczego?

EDIT: Poradziłem sobie, łączy się z bazą biggrin.gif

Tylko pytanie: czy dobrze to jest napisane? co zmienić?
ssstrz
Największy błąd to: połączyłeś się i co z tego skoro utraciłeś obiekt PDO, możesz to rozwiązać poprzez przypisanie do bazy pola protected lub wyrzucić obiekt BD na zewnątrz, na szybko:
  1. <?php
  2.  
  3. Class DB{
  4. public function __construct($server, $port, $username, $password, $database)
  5. {
  6. $this->Set($server, $port, $username, $password, $database);
  7. $this->$db=$this->Connect();
  8. }
  9. protected function Set($server, $port, $username, $password, $database)
  10. {
  11. $this->server = $server;
  12. $this->port = $port;
  13. $this->user = $username;
  14. $this->password = $password;
  15. $this->database = $database;
  16. }
  17. protected function Connect()
  18. {
  19. $pdo = new PDO('mysql:host='.$this->server.';dbname='.$this->database.';port='.$this->port, $this->username, $this->password );
  20. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  21. }
  22. protected $server;
  23. protected $port ;
  24. protected $user;
  25. protected $password;
  26. protected $database;
  27. protected $db;
  28. }
  29. try
  30. {
  31. $db = new DB("","","","","");
  32. }
  33. catch(PDOException $e)
  34. {
  35. echo "Error! Code ->".$e->getMessage();
  36. }
  37.  
  38. ?>

Pomijam tutaj takie rzeczy jak PSR bo dopiero się uczysz, chociaż warto poczytać już za wczasu żeby wyrobić sobie nawyk wink.gif
//edit sorki za formatowanie
Dominator
Dostałem jakieś błędy, ale już je naprawiłem, dziękuję za pomoc!
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.