Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][OOP] Klasa do łączenia się z bazą danych - czy dobrze jest skonstruowana?
Dominator
post 8.05.2013, 17:45:15
Post #1





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


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. ?>
Go to the top of the page
+Quote Post
ssstrz
post 8.05.2013, 18:08:34
Post #2





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
!*!
post 8.05.2013, 18:09:16
Post #3





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


- 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


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Szymciosek
post 8.05.2013, 18:16:23
Post #4





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Sam używam podkreślenia do oznaczenia zmiennych, które przekazuje do metody. To zła praktyka?
Go to the top of the page
+Quote Post
!*!
post 8.05.2013, 18:20:34
Post #5





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Dominator
post 8.05.2013, 18:41:27
Post #6





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


  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?
Go to the top of the page
+Quote Post
!*!
post 8.05.2013, 19:32:00
Post #7





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Nie możesz się odwołać do metody która jest prywatna lub chroniona. http://pl.wikibooks.org/wiki/PHP


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Dominator
post 8.05.2013, 19:41:22
Post #8





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


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ć?

Ten post edytował Dominator 8.05.2013, 20:11:49
Go to the top of the page
+Quote Post
ssstrz
post 8.05.2013, 21:50:25
Post #9





Grupa: Zarejestrowani
Postów: 103
Pomógł: 17
Dołączył: 15.12.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował ssstrz 8.05.2013, 21:55:58
Go to the top of the page
+Quote Post
Dominator
post 9.05.2013, 13:05:29
Post #10





Grupa: Zarejestrowani
Postów: 565
Pomógł: 15
Dołączył: 11.10.2010

Ostrzeżenie: (20%)
X----


Dostałem jakieś błędy, ale już je naprawiłem, dziękuję za pomoc!

Ten post edytował Dominator 9.05.2013, 13:11:38
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 03:52