Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]PHP OPP i PDO
adrianozo
post 4.07.2013, 12:31:01
Post #1





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


Witam wszystkich smile.gif

Wreszcie zabrałem się za PHP OOP i bibliotekę PDO i mam pewien problem.
Chodzi o to, że napisałem sobie dwie klasy i w nich odpowiednie metody. Mam pewien problem z racji tego, że nie wiem jak dostać się do zmiennej $pdo z poprzedniej metody która odpowiada za połączenie z bazą. Zresztą poniżej pokaże jak to napisałem. Dodatkowo chciałbym prosić o mały komentarz na temat tego czy dobrze rozumiem OOP i PDO smile.gif

Z góry dziękuje:

  1. <?php
  2. class base
  3. {
  4. private $host;
  5. private $dbname;
  6. private $user;
  7. private $password;
  8. protected function connection()
  9. {
  10. $host='localhost';
  11. $dbname='oop';
  12. $user='root';
  13. $password='Nanysek93';
  14. try
  15. {
  16. $pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.'', ''.$this->user.'', ''.$this->password.'');
  17. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  18. echo 'Polaczenie zostalo nawiazane!';
  19. }
  20. catch(PDOException $ex)
  21. {
  22. echo 'Polaczenie nie zostalo nawiazane: '.$ex->getMessage();
  23. }
  24. }
  25. protected function answer()
  26. {
  27. try
  28. {
  29. $stmt=$pdo->query('SELECT * FROM pdo');
  30. while($row=$stmt->fetch())
  31. {
  32. echo ''.$row['id'].': '.$row['nazwa'].'<br />';
  33. }
  34. $stmt->closeCursor();
  35. }
  36. catch(PDOException $ex)
  37. {
  38. echo 'Dane nie zostaly pobrane: '.$ex->getMessage();
  39. }
  40. }
  41. }
  42. class action extends base
  43. {
  44. public function callConnection()
  45. {
  46. return $this->connection();
  47. }
  48. public function callAnswer()
  49. {
  50. return $this->answer();
  51. }
  52. }
  53. $action = new action();
  54. $action->callConnection();
  55. $action->callAnswer();
  56. ?>


Problem widnieje w linii 29 ponieważ nie mam dostępu do zmiennej $pdo z poprzedniej metody i nie bardzo wiem jak się do niej dostać.


--------------------
Go to the top of the page
+Quote Post
b4rt3kk
post 4.07.2013, 12:40:19
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Od góry do dołu źle. Przydałby się konstruktor (przyjmujący jako argumenty dane połącznia). Kolejna sprawa, używasz wewnątrz metod zmiennych lokalnych, a nie właściwości klasy. Więc nie ma prawa działać, nie przekazuje uchwytu do połączenia itd. Musisz się odwoływać poprzez $this -> zmienna. Przykład prawidłowego użycia:

  1. function __construct($host, $dbname, $user, $password) {
  2. $this -> host = $host;
  3. $this -> dbname = $dbname;
  4. $this -> user = $user;
  5. $this -> password = $password;
  6. }
  7.  
  8. protected function connection()
  9. {
  10. try
  11. {
  12. $this -> pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.'', ''.$this->user.'', ''.$this->password.'');
  13. $this -> pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. echo 'Polaczenie zostalo nawiazane!';
  15. }
  16. catch(PDOException $ex)
  17. {
  18. echo 'Polaczenie nie zostalo nawiazane: '.$ex->getMessage();
  19. }
  20. }


Ten post edytował b4rt3kk 4.07.2013, 12:43:40


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
adrianozo
post 4.07.2013, 13:01:10
Post #3





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


Akurat jak stworzyć konstruktor to wiem smile.gif


--------------------
Go to the top of the page
+Quote Post
b4rt3kk
post 4.07.2013, 13:03:28
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Cytat(adrianozo @ 4.07.2013, 14:01:10 ) *
Akurat jak stworzyć konstruktor to wiem smile.gif


To zastosuj to w praktyce i będzie działać. smile.gif


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
ber32
post 4.07.2013, 13:05:34
Post #5





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Kolega wyżej podał ci rozwiązanie

  1. [b]$this -> pdo[/b] = new PDO(


--------------------
Go to the top of the page
+Quote Post
adrianozo
post 4.07.2013, 13:10:26
Post #6





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


Doprowadziłem do czegoś takiego, lecz dalej źle.

  1. <?php
  2. class base
  3. {
  4. private $host=null;
  5. private $dbname=null;
  6. private $user=null;
  7. private $password=null;
  8. public function __construct($host, $dbname, $user, $password)
  9. {
  10. $this->host=$host;
  11. $this->dbname=$dbname;
  12. $this->user=$user;
  13. $this->password=$password;
  14. }
  15. protected function connection()
  16. {
  17. try
  18. {
  19. $this->pdo=new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.'', ''.$this->user.'', ''.$this->password.'');
  20. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  21. echo 'Polaczenie zostalo nawiazane!';
  22. }
  23. catch(PDOException $ex)
  24. {
  25. echo 'Polaczenie nie zostalo nawiazane: '.$ex->getMessage();
  26. }
  27. }
  28. protected function answer()
  29. {
  30. try
  31. {
  32. $this->pdo->query('SELECT * FROM pdo');
  33. while($row=$stmt->fetch())
  34. {
  35. echo ''.$row['id'].': '.$row['nazwa'].'<br />';
  36. }
  37. $stmt->closeCursor();
  38. }
  39. catch(PDOException $ex)
  40. {
  41. echo 'Dane nie zostaly pobrane: '.$ex->getMessage();
  42. }
  43. }
  44. }
  45. class action extends base
  46. {
  47. public function __construct()
  48. {
  49. parent::__construct('localhost', 'oop', 'root', 'Nanysek93');
  50. }
  51. public function callConnection()
  52. {
  53. return $this->connection();
  54. }
  55. public function callAnswer()
  56. {
  57. return $this->answer();
  58. }
  59. }
  60. $action = new action();
  61. $action->callConnection();
  62. $action->callAnswer();
  63. ?>


--------------------
Go to the top of the page
+Quote Post
nospor
post 4.07.2013, 13:12:23
Post #7





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




while($row=$stmt->fetch())

A te $stmt to ci sie z powietrza bierze??

Wlacz wyswietlanie bledow i je analizuj a jak nie potrafisz to chociaz je nam przytaczaj


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
adrianozo
post 4.07.2013, 13:13:39
Post #8





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


W sumie można powiedzieć, że trochę z powietrza:
Kod
Notice: Undefined variable: stmt in C:\xampp\htdocs\OOP\index.php on line 33
ale to tylko notice.

Kod
Fatal error: Call to a member function fetch() on a non-object in C:\xampp\htdocs\OOP\index.php on line 33


--------------------
Go to the top of the page
+Quote Post
b4rt3kk
post 4.07.2013, 13:14:20
Post #9





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Wykorzystujesz obiekt $stmt, który nie istnieje.

  1. $stmt = $this->pdo->query('SELECT * FROM pdo');



Ten post edytował b4rt3kk 4.07.2013, 13:15:17


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
nospor
post 4.07.2013, 13:15:13
Post #10





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




facepalmxd.gif

Cytat
ale to tylko notice.
Ale ten notice informuje cie ze zmiennej nie ma... kurcze, mysl troche... spojrz na swoj pierwszy kod i zobacz skad brales te $stmt. Potrafisz tylko bezmyslnie kopiuowac? No nie na tym polega programowanie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
adrianozo
post 4.07.2013, 13:19:08
Post #11





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


Dzięki wielkie za pomoc smile.gif
Masz racje nospor smile.gif

Kod wygląda teraz tak:

  1. <?php
  2. class base
  3. {
  4. private $host=null;
  5. private $dbname=null;
  6. private $user=null;
  7. private $password=null;
  8. public function __construct($host, $dbname, $user, $password)
  9. {
  10. $this->host=$host;
  11. $this->dbname=$dbname;
  12. $this->user=$user;
  13. $this->password=$password;
  14. }
  15. protected function connection()
  16. {
  17. try
  18. {
  19. $this->pdo=new PDO('mysql:host='.$this->host.';dbname='.$this->dbname.'', ''.$this->user.'', ''.$this->password.'');
  20. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  21. echo 'Polaczenie zostalo nawiazane!';
  22. }
  23. catch(PDOException $ex)
  24. {
  25. echo 'Polaczenie nie zostalo nawiazane: '.$ex->getMessage();
  26. }
  27. }
  28. protected function answer()
  29. {
  30. try
  31. {
  32. $stmt=$this->pdo->query('SELECT * FROM pdo');
  33. while($row=$stmt->fetch())
  34. {
  35. echo ''.$row['id'].': '.$row['nazwa'].'<br />';
  36. }
  37. $stmt->closeCursor();
  38. }
  39. catch(PDOException $ex)
  40. {
  41. echo 'Dane nie zostaly pobrane: '.$ex->getMessage();
  42. }
  43. }
  44. }
  45. class action extends base
  46. {
  47. public function callConnection()
  48. {
  49. return $this->connection();
  50. }
  51. public function callAnswer()
  52. {
  53. return $this->answer();
  54. }
  55. }
  56. $action = new action('localhost', 'oop', 'root', 'Nanysek93');
  57. $action->callConnection();
  58. $action->callAnswer();
  59. ?>


Powiedzcie co jeszcze do poprawy. Działać już działa jak trzeba, ale może da się coś jeszcze poprawić, żeby lepiej spełniało swoją funkcjonalność?


--------------------
Go to the top of the page
+Quote Post
b4rt3kk
post 4.07.2013, 13:48:33
Post #12





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


Jeśli funkcjonalnością tej klasy jest pobrać wszystkie rekordy z tabeli pdo to ją spełnia.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
adrianozo
post 4.07.2013, 14:01:18
Post #13





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

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


Dzięki wielkie wszystkim za pomoc smile.gif
Myślę, że temat wyczerpany. Przynajmniej wiem na co zwracać uwagę.
Zabieram się za dalsze pisanie smile.gif


--------------------
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: 27.04.2024 - 11:34