Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO][OOP] Przekazanie handlera połączenia do drugiej klasy
Forum PHP.pl > Forum > PHP
Raven1122
Witam,

Mam klasę obsługującą PDO:

connection.class.php:

  1. class Connection{
  2.  
  3. public function __construct(){
  4. try {
  5. $db = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
  6. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. } catch(PDOException $e) {
  8. echo 'ERROR: ' . $e->getMessage();
  9. }
  10. }


^ To tylko fragment potrzebny

I klase obsługującą renderowanie planu:

schedule.php

  1. <?php
  2.  
  3. require('../pdo.class.php');
  4.  
  5. //Plik wyciągający dane ramówki
  6.  
  7. class ScheduleRendering extends Connection{
  8.  
  9. public function fetch($db){
  10. $this->day = $_GET['day'];
  11.  
  12. $stmt = $db->prepare('SELECT * FROM schedule WHERE day = ?');
  13. $stmt->bindValue(1, $this->day);
  14. $stmt->execute();
  15. $contents = $stmt->fetchAll();
  16. return $contents;
  17. }
  18.  
  19. public function render($contents){
  20. $this->row = 0;
  21. $this->rows = '';
  22. foreach($contents as $row){
  23. $this->rows .= '<tr><td>'.$row['name'].'</td><td>'.$row['presenter'].'</td><td>'.$row['times'].' - '.$row['timed'].'</td></tr>';
  24. }
  25.  
  26. $rows = $this->rows;
  27. return $rows;
  28. }
  29.  
  30. }
  31. $db = new Connection();
  32. $schedule = new ScheduleRendering();
  33. $schedule->fetch($db);
  34. $schedule->render($contents);
  35.  
  36. echo $rows;
  37.  
  38. ?>


No i mam taki problem, bo z pliku schedule wywala mi Fatal Error:

Fatal error: Call to undefined method Connection::prepare() w linii 12 plik schedule.php

Jak przekazać handler $db do metody fetch klasy Schedule??
sajegib
  1.  
  2. class Connection{
  3.  
  4. protected $db = "";
  5.  
  6. public function __construct(){
  7. try {
  8. $this->db = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
  9. $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. } catch(PDOException $e) {
  11. echo 'ERROR: ' . $e->getMessage();
  12. }
  13. }
  14.  


w schedule odwołujesz się w taki sposób do handlera:

  1. $stmt = $this->db->prepare('SELECT * FROM schedule WHERE day = ?');


Powyżej:

Cytat
Fatal error: Call to undefined method Connection::prepare() w linii 12 plik schedule.php


Kolega próbował się odwolać do metody prepare() klasy Connection, a nie klasy PDO smile.gif
matiit
Jeszcze trzeba pamiętać o wywołaniu konstruktora rodzica w konstruktorze klasy ScheduleRendering.
Raven1122
Jesczze jedno pytanie:

Jak przekazać składową $contents z metody fetch do metody render w klasie Schedule?
sajegib
Cytat
Jeszcze trzeba pamiętać o wywołaniu konstruktora rodzica w konstruktorze klasy ScheduleRendering.


Jak kolega nie ma w klasie pochodnej konstruktora to wywołany zostanie konstruktor klasy-rodzica, nie ma takiej potrzeby

Cytat
Jak przekazać składową $contents z metody fetch do metody render w klasie Schedule?


Zrób pole w klasie - public $contents i odwołuj się przez $this->contents

np.

  1. //deklaracja klasy
  2. public $contents = '';
  3. //metoda fetch
  4. $this->contents = //twoj kod
Raven1122
Ok działa smile.gif I teraz już takie ostatnie ostateczne pytanie:

  1. return $this->rows;


Jak odnieść się do tego już poza klasąquestionmark.gif

sajegib
  1. $obj = new ScheduleRendering; // tworzysz obiekt
  2. // odnosisz się do tej metody tak: $obj -> render();
  3. // example:
  4. var_dump($obj->render());
  5.  


Oczywiście możesz zmienną $obj nazwać inaczej
Raven1122
Zwraca takie coś:
  1. string '<tr><td>Test</td><td>Testowy</td><td>1700 - 1800</td></tr><tr><td>Test</td><td>Testowy</td><td>1700 - 1800</td></tr>' (length=116)


A jeżeli zrobie już tak:

$db = new Connection();
$schedule = new ScheduleRendering();
$schedule->fetch();
$schedule->render();

To nic nie zwraca, dlaczego tak jest?
nospor
bo w render dałeś return a nie echo... ale to już podstawy...

$zm = $schedule->render();
echo $zm; //walisz na ekran to co dostajesz
sajegib
  1. $db = new Connection();
  2. $schedule = new ScheduleRendering();
  3. $schedule->fetch();
  4. $schedule->render();


nie musisz tworzyć obiektu klasy Connection, odwołanie się do metod klasy-dziecka ScheduleRendering(); powoduje uruchomienie konstruktora klasy-rodzica i połączenie z bazą
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.