Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP OPP i PDO
Forum PHP.pl > Forum > Przedszkole
adrianozo
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ć.
b4rt3kk
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. }
adrianozo
Akurat jak stworzyć konstruktor to wiem smile.gif
b4rt3kk
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
ber32
Kolega wyżej podał ci rozwiązanie

  1. [b]$this -> pdo[/b] = new PDO(
adrianozo
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. ?>
nospor
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
adrianozo
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
b4rt3kk
Wykorzystujesz obiekt $stmt, który nie istnieje.

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

nospor
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
adrianozo
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ść?
b4rt3kk
Jeśli funkcjonalnością tej klasy jest pobrać wszystkie rekordy z tabeli pdo to ją spełnia.
adrianozo
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
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.