Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Metoda zwracająca tablicę? Jak?
Forum PHP.pl > Forum > PHP > Object-oriented programming
l05i3k
Witam,
dopiero raczkuje w dziedzinie projketowania obiektowego, wiec prosilbym o w miare przystępne wyjaśnienie rozwiązania.

Otóż, często operując na elementach z bazdy danych, trzeba wyświetlić ich kilka, jeden pod drugim. W programowaniu proceduralnym robiłem to tak (uzywajac mysqli):
  1. <?php
  2. $baza = new mysqli ('localhost', 'login', 'haslo', 'baza');
  3.  
  4. $odczytaj = "SELECT * FROM `wiadomosci` ORDER BY `id` DESC LIMIT 10 ";
  5. $news = $baza->query($odczytaj);
  6.  
  7. $liczba_newsow = $news->num_rows;
  8.  
  9. for ($i=0; $liczba_newsow > $i; $i++)
  10. {
  11.  $rekord = $news->fetch_assoc();
  12.  echo $rekord['id'].'<br>';
  13. }
  14. ?>
Pytanie moje jest następujące. Jak osiągnąć podobny efekt operując na klasach?

Załóżmy że mam coś takiego:
  1. <?php
  2. class News {
  3.  private $db; // uchwyt bazy
  4.  private $cfg; // konfiguracja
  5.  private $id;
  6. // [..] dalsze zmienne
  7.  private $kategoria;
  8.  
  9.  public function __construct() {
  10. $this->db = new DB();
  11. $this->cfg = new Config();
  12.  }
  13.  
  14.  public function pobierzDane($id) {
  15. $sql = "SELECT * FROM `".$this->cfg->prefix."_news` WHERE `id` = '".$id."' LIMIT 1;";
  16. $zapytanie = $this->db->query($sql);
  17.  
  18. $dane = $this->db->fetch($zapytanie);
  19.  
  20. $this->id = $dane['id'];
  21. $this->tytul = $dane['tytul'];
  22. $this->tresc = $dane['tresc'];
  23. $this->tagi = $dane['tagi'];
  24. $this->notatki = $dane['notatki'];
  25. $this->data = $dane['data'];
  26. $this->odslony = $dane['odslony'];
  27. $this->obrazek = $dane['obrazek'];
  28. $this->kategoria = $dane['kategoria'];
  29.  }
  30.  
  31.  public function pobierzOstatnie($ilosc, $poczatek=0, $kategoria=0) {
  32. $sql = "SELECT id FROM `".$this->cfg->prefix."_news` WHERE `kategoria` = '".$kategoria."' ORDER BY `id` DESC LIMIT ".($poczatek*$ilosc).", ".$ilosc.";";
  33. $zapytanie = $this->db->query($sql);
  34. $dane = $this->db->fetch($zapytanie);
  35.  
  36. return $dane;
  37.  }
  38.  
  39.  public function getId() {
  40. return $this->id;
  41.  }
  42.  
  43.  // [..] kolejne analogiczne metody
  44.  
  45.  public function getObrazek() {
  46. return $this->obrazek;
  47.  }
  48. }
  49. ?>
Jak można wyciągnąć z tego wszystkie dane? Bo metoda pobierzOstatnie() zwraca mi jdynie ostatnie id ostatniego rekordu... (możliwe, że gdzieś zrobiłem błąd).
W moim zamierzeniu było, aby metoda pobierzOstatnie() zwracała mi id kolenych newsów, które później wykorzystywał bym do wywołania metody pobierzDane() z $id otrzymanym z metody pobierzOstatnie().

Tak na marginesie, mozemy zalozyc ze mam sterownik w tym stylu:
  1. <?php
  2. class DB {
  3.  public function __construct() {
  4. mysql_connect('localhost', 'login', 'haslo');
  5. mysql_select_db('baza');
  6.  }
  7.  
  8.  public function query($sql) {
  9. return mysql_query($sql);
  10.  }
  11.  
  12.  public function num_rows($sql) {
  13. return mysql_num_rows($sql);
  14.  }
  15.  
  16.  public function fetch($sql) {
  17. return mysql_fetch_assoc($sql);
  18.  }
  19. }
  20. ?>
Na PDO, jeszcze przyjdzie czas, zreszta z tej postaci to nie będzie problem...

Mam nadzieje, że nie napisałem tego przesadnie chaotycznie i da sie cos z tego zrozumiec...
Z gory dziekuje za pomoc winksmiley.jpg
splatch
Wyróżnij elementy, które zajmują się różnymi dziedzinami. W chwili obecnej Twoja klasa robi wszystko, jest swoistym "bogiem", tworzy połączenie do bazy, odczytuje sobie z niej dane, następnie tworzy obiekty reprezentujące dane i tak dalej.

Moja propozycja
- stworzenie klasy News tylko z danymi (id, title, image)
- stworzenie DAO (był temat odnośnie tego na forum)
- powołanie prostego szkieletu, który będzie uruchamiał akcje (poszperaj o MVC)
l05i3k
Cytat(splatch @ 28.12.2007, 19:32:21 ) *
Wyróżnij elementy, które zajmują się różnymi dziedzinami. W chwili obecnej Twoja klasa robi wszystko, jest swoistym "bogiem", tworzy połączenie do bazy, odczytuje sobie z niej dane, następnie tworzy obiekty reprezentujące dane i tak dalej.

Moja propozycja
- stworzenie klasy News tylko z danymi (id, title, image)
- stworzenie DAO (był temat odnośnie tego na forum)
- powołanie prostego szkieletu, który będzie uruchamiał akcje (poszperaj o MVC)


Ja wiem, ale wlasnie mi narazie chodzilo o to, aby ta klasa mogła samoczynnie (prawie) funkcjonować, chciałbym poporstu zrobić coś od początku, a dopiero potem to edytować, przerabiać i rozdrabniać...
prond
Moim zdaniem zacznij od początku korzystać z interfejsu Iterator:
  1. <?php
  2. class News implements Iterator
  3. {
  4. protected $data = array();
  5.  
  6. public function findAll() {
  7. $this->data = array();
  8. /*
  9. tutaj dobierasz sie do interfejsu z baza danych i pobiersz wszystkie newsy
  10. ladujesz do $this->data poszczegolne rekordy z zapytania np.:
  11. while ($row = $db->fetch($query)) {
  12. $this->data[] = $row;
  13. }
  14. */
  15. }
  16.  
  17. public function key()
  18. {
  19. return key($this->data);
  20. }
  21.  
  22. public function current()
  23. {
  24. return current($this->data);
  25. }
  26.  
  27. public function next()
  28. {
  29. return next($this->data);
  30. }
  31.  
  32. public function rewind()
  33. {
  34. return reset($this->data);
  35. }
  36.  
  37. public function valid()
  38. {
  39. return (bool) $this->current();
  40. }
  41. }
  42. ?>


Wtedy masz z górki przy operowaniu na liscie newsów:
  1. <?php
  2. $news = new News();
  3. $news->findAll();
  4. foreach ($news as $newsItem) {
  5. print($news['title']);
  6. }
  7. ?>
splatch
News jest obiektem biznesowym, a to co pokazał prond to DAO a raczej Active Record.
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.