Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> obiekt klasy X powinien wywolac metode z klasy Y bez dziedziczenia
wiewiorek
post
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


Jeśli mam klasę o nazwie Polaczenie z prywatnym konstruktorem do połączenia z bazą danych, a chciałbym używać PDO (PDO umożliwia komunikację z wieloma bazami danych) to przez to, że mam prywatny konstruktor to nie mogę dziedziczyć po klasie PDO, bo inaczej dostaję błąd:
Access level to Polaczenie::__construct() must be public (as in class PDO)

A ja chcialbym moc wysylac zapytania do bazy danych przy uzyciu funkcji prepare() pochodzacej z klasy PDO w ten sposob:
  1. $polaczenie = Polaczenie::getInstance();
  2. $zapytanie = $polaczenie->prepare("INSERT INTO ksiazki(tytul, cena) VALUES(:tytul, :cena)");
  3. $zapytanie->bindValue(':tytul', $_POST['tytul'], PDO::PARAM_STR);
  4. $zapytanie->bindValue(':cena', $_POST['cena'], PDO::PARAM_STR);
  5. $zapytanie->execute();


Ale dostaje blad:
Call to undefined method Polaczenie::prepare()

Bo ta metoda jest w klasie PDO. Co mam zrobic ? Moglbym caly powyzszy kod wstawic do specjalnie utworzonej w tym celu metody w klasie Polaczenie i wtedy byloby ok, ale co ja mam tworzyc dla kazdego inserta oddzielna metode w klasie Polaczenie ? To jak mialbym inserty wykonywane na tabelach np. ksiazki, autorzy itd. ladowac je wszystkie do klasy Polaczenie ? Bez sensu. Co powinienem zrobic ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wiewiorek
post
Post #2





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


No fakt - miałeś rację - zapomniałem, że w php konstruktor klasy nadrzednej trzeba samemu wywolac. Ale to i tak niewiele daje, bo musze pisac w klasie Ksiazki w kazdej metodzie zawierajacej zapytanie caly kod wlacznie z fetchowaniem i zamykaniem kursora oraz blokiem try/catch:

  1. abstract class Polaczenie extends PDO{
  2.  
  3. static protected $pdo = null;
  4.  
  5. private $dsn = 'mysql:host=localhost;dbname=koszyk';
  6. private $uzytkownik = 'root';
  7. private $haslo = '';
  8.  
  9.  
  10. public function __construct() {
  11. if(self::$pdo===null){
  12. try {
  13. self::$pdo = new PDO($this->dsn, $this->uzytkownik, $this->haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
  14. self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  15. }
  16. catch(PDOException $e) {
  17. echo '<p>Polaczenie nie moglo zostac utworzone: '.$e->getMessage().'</p>';
  18. }
  19. }
  20. }
  21.  
  22.  
  23. public function __destruct() {
  24. }
  25.  
  26.  
  27. public function pobieranieDanych($z) {
  28. try{
  29. $wynik = self::$pdo->query($z);
  30. $wynik_tablica = $wynik->fetchAll();
  31. $wynik -> closeCursor();
  32. return $wynik_tablica;
  33. }
  34. catch(PDOException $e) {
  35. echo '<p>blad w metodzie pobieranieDanych(): '.$e->getMessage().'</p>';
  36. }
  37. }
  38.  
  39. }
  40.  
  41. -------------------------------------------------
  42.  
  43. class Ksiazki extends Polaczenie
  44. {
  45.  
  46.  
  47. public function __construct()
  48. {
  49. parent::__construct();
  50. }
  51.  
  52. public function __destruct()
  53. {
  54. }
  55.  
  56. public function pobierzKsiazki()
  57. {
  58. try
  59. {
  60. $wynik = parent::$pdo->query("SELECT * FROM ksiazki");
  61. $wynik_tablica = $wynik->fetchAll();
  62. $wynik -> closeCursor();
  63. return $wynik_tablica;
  64. }
  65. catch(PDOException $e)
  66. {
  67. echo '<p>blad w zapytaniu: '.$e->getMessage().'</p>';
  68. }
  69. }
  70. }
  71. --------------------------------------------------------
  72. $ksiazki = new Ksiazki();
  73. $rezultat = $ksiazki->pobierzKsiazki();



Moze wiec wrocic do tego sposobu z przekazywaniem do konstruktora klasy Ksiazki obiektu klasy Polaczenie - jak nizej ?

  1. class Polaczenie extends PDO{
  2.  
  3. private $pdo;
  4.  
  5. private $dsn = 'mysql:host=localhost;dbname=koszyk';
  6. private $uzytkownik = 'root';
  7. private $haslo = '';
  8.  
  9.  
  10. public function __construct() {
  11. try {
  12. $this->pdo = new PDO($this->dsn, $this->uzytkownik, $this->haslo, array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8"));
  13. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  14. }
  15. catch(PDOException $e) {
  16. echo '<p>Polaczenie nie moglo zostac utworzone: '.$e->getMessage().'</p>';
  17. }
  18. }
  19.  
  20. public function __destruct() {
  21. }
  22.  
  23.  
  24. public function pobieranieDanych($z) {
  25. try{
  26. $wynik = $this->pdo->query($z);
  27. $wynik_tablica = $wynik->fetchAll();
  28. $wynik -> closeCursor();
  29. return $wynik_tablica;
  30. }
  31. catch(PDOException $e) {
  32. echo '<p>blad w metodzie pobieranieDanych(): '.$e->getMessage().'</p>';
  33. }
  34. }
  35.  
  36. }
  37.  
  38. ----------------------------------------------
  39.  
  40. class Ksiazki
  41. {
  42. private $polaczenie;
  43.  
  44. public function __construct($db)
  45. {
  46. $this->polaczenie = $db;
  47. }
  48.  
  49. public function __destruct()
  50. {
  51. }
  52.  
  53. public function pobierzKsiazki()
  54. {
  55. return $this->polaczenie->pobieranieDanych("SELECT * FROM ksiazki");
  56. }
  57. }
  58.  
  59. -----------------------------------------------------------------
  60.  
  61. $polaczenie = new klasaPolaczenie();
  62.  
  63. $ksiazki = new klasaKsiazki($polaczenie);
  64. $rezultat = $ksiazki->pobierzKsiazki();

Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 11:17