Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie na tabeli a obiektowość
Forum PHP.pl > Forum > PHP > Object-oriented programming
gburus
Witam,

Chciałbym napisać dla odświeżenia pamięci i nauczenia się OOP prostą aplikację. Mam następujący problem, w jaki sposób najszybciej i najłatwiej można _obiektowo_ pobierać i wyświetlać cale zestawy wyników zapytania. Np. w postaci tabeli HTML chcialbym przedstawić zawartość tabeli SQL, korzystając z obiektowego programowania. czy metoda typu:

foreach (n;n++) {
utwórz obiekt n-ty
wykonaj kod prezentacji
zniszcz obiekt
}

ma sens? wiem ze mozna to zrobic w postaci arraya, ale czy mozna arraya z obiektami łatwo mieszać?

Dziekuję z góry,
Greg.
kilas88
Poczytaj o różnego rodzaju ORM-ach, tj. Doctrine, Propel. Tam jest stricte obiektowe podejście do relacyjnych baz danych.

Btw. jako ciekawostkę możesz także zainteresować się ruchem NoSQL, tam też jest zastosowane obiektowe podejście (np. MongoDB).
gcdreak
Jeśli chcesz pobawić się obiektami to zasinteresuj sie ArrayIteratorem i ArrayObjectem. Jeśli chcesz wykorzystać MySQL-a to może mój kod Ci się sprzyda do operowania na rezultacie zapytania do bazy:
  1. class MysqlIterator implements Iterator
  2. {
  3.  
  4. private $results;
  5. private $key;
  6. private $row;
  7. public $fetchMode = 'assoc';
  8.  
  9. function __construct($results){
  10. $this->results = $results;
  11. $this->position = 0;
  12. }
  13.  
  14. public function current(){
  15. return $this->row;
  16. }
  17.  
  18. public function valid(){
  19. return (boolean) $this->row;
  20. }
  21.  
  22. public function next(){
  23. $this->position++;
  24. $this->row = $this->fetch();
  25. }
  26.  
  27. public function rewind(){
  28. $this->position = 0;
  29. $this->results->data_seek(0);
  30. $this->next();
  31. }
  32.  
  33. public function key(){
  34. return $this->position;
  35. }
  36.  
  37. private function fetch(){
  38. switch(strtolower($this->fetchMode)){
  39. case 'array':
  40. return $this->results->fetch_array(MYSQLI_NUM);
  41. case 'assoc':
  42. return $this->results->fetch_assoc();
  43. case 'object':
  44. return $this->results->fetch_object();
  45. }
  46. }
  47. }


Jeśli chciałbyś używać np PDO to kilka poprawek i powino działać. Jeśli byś coś przerobił to na PDO to podziel się kodem - może się kiedyś sprzydać i będzie gotowe.
darko
Nic nie stoi na przeszkodzie, żeby użyć tablicy obiektów. W pętli, której przykład podałeś troszkę nie zgadzają się wykonywane czynności, to znaczy jeszcze przed pętlą powinieneś już dysponować tablicą obiektów, a nie tworzyć je przy każdej iteracji.
gburus
Cytat(darko @ 9.07.2010, 22:06:08 ) *
Nic nie stoi na przeszkodzie, żeby użyć tablicy obiektów. W pętli, której przykład podałeś troszkę nie zgadzają się wykonywane czynności, to znaczy jeszcze przed pętlą powinieneś już dysponować tablicą obiektów, a nie tworzyć je przy każdej iteracji.



Właśnie o tym myślałem, próbowałem znaleźć jakieś informacje czy tak się da ale bezskutecznie. W jaki sposób sie deklaruje taka tablicę obiektów?

co do kolejności to zdaję sobie sprawę, że jest ułomna, ale nie wiem zupełnie jak te tablice obiektów sie uzywa - nie ma jak być PHPnubem winksmiley.jpg

Dzięki za podpowiedzi, ORM (zwłaszcza propel) wyglądają ciekawie, zwłaszcza ze propel z tego co wiem jest uzywany w Symphony?
gcdreak
Cytat(gburus @ 10.07.2010, 22:29:59 ) *
W jaki sposób sie deklaruje taka tablicę obiektów?


Możesz użyć nawet zwykłej tablicy, lecz nie będzie to zbyt eleganckie - znacznie lepsze będzie stworzenie klasy Collection. Z tego co czytam to widzę, że chcesz się czegoś nauczyć więc nie daję Ci gotowej klasy której używam lecz jedynie interface do niej:
  1. interface Collection {
  2.  
  3. public function addItem($obj, $key = null);
  4.  
  5. public function removeItem($key);
  6.  
  7. public function getItem($key);
  8.  
  9. public function lenght();
  10.  
  11. public function keys();
  12.  
  13. public function exists($key);
  14.  
  15. }


Jeśli będziesz chciał jakąś pomoc to pisz.

Pozdrawiam
gburus
Cytat(gcdreak @ 10.07.2010, 23:07:40 ) *
Możesz użyć nawet zwykłej tablicy, lecz nie będzie to zbyt eleganckie - znacznie lepsze będzie stworzenie klasy Collection. Z tego co czytam to widzę, że chcesz się czegoś nauczyć więc nie daję Ci gotowej klasy której używam lecz jedynie interface do niej:

(...)

Jeśli będziesz chciał jakąś pomoc to pisz.

Pozdrawiam


Jak rozumiem klasa z takim interfejsem służy do manipulacji rekordami, ale pojedynczymi. W jaki sposob wykorzystać ją, by wykonać następującą czynność: pobrać wszystkie okreslone rekordy z bazy, i wyświetlić je w standardowej formie tabeli. Czy czysto obiektowo da sie to zrobić? Właśnie znalazłem taki kod na php.net:

  1. mysql_connect('localhost','uzytkownik','haslo');
  2. $result = mysql_query('select * from tabela');
  3. while ($row = mysql_fetch_object($result)) {
  4. echo $row->id_uzytkownika;
  5. echo $row->pelna_nazwa;
  6. }


Wydaje mi się, że cały czas chodziło mi właśnie o to, tylko nie potrafiłem nazwać tej funkcji (fetch_object). Teraz pozostaje to oprawić w klasę(y) i chyba jestem w domu.
Jeśli natomiast się mylę, to proszę o poprawienie. Jak rozumiem, powyższy kod powinien iterować po wynikach zapytania, i wyświetlić po kolei wszystkie rekordy?



darko
Polecam jednak wykorzystać gotowy kontener w postaci splObjectStorage. Od php 5.3.0 biblioteka spl jest domyślnie częścią core php.
gcdreak
Cytat(gburus @ 11.07.2010, 00:34:13 ) *
Jak rozumiem klasa z takim interfejsem służy do manipulacji rekordami, ale pojedynczymi. W jaki sposob wykorzystać ją, by wykonać następującą czynność: pobrać wszystkie okreslone rekordy z bazy, i wyświetlić je w standardowej formie tabeli. Czy czysto obiektowo da sie to zrobić? Właśnie znalazłem taki kod na php.net:

  1. mysql_connect('localhost','uzytkownik','haslo');
  2. $result = mysql_query('select * from tabela');
  3. while ($row = mysql_fetch_object($result)) {
  4. echo $row->id_uzytkownika;
  5. echo $row->pelna_nazwa;
  6. }


Ta klasa służy do manipulowania obiektami utworzonymi na podstawie danych wyciągniętych z bazy. Jest to bardzo wygodne jeśli chciałbyś wykonywać dodatkowe operacje - jeśli chcesz to tylko wyświetlić to nie ma potrzeby się bawić w Collectiion.
Jeśli byś chciał coś zrobić to mogło by to wyglądać no tak:
  1. $objCol = new Collection();
  2.  
  3. $i = 1;
  4. while ($row = mysql_fetch_object($result)) {
  5. $objUser = new User($row);
  6. $objCol->addItem($objUser, 'User_'.$i);
  7. }
  8.  
  9.  
  10. // i teraz dodatkowe akcje
  11.  
  12. $objCol->getItem('User_143')->changePassword(...);
  13. //...
  14.  


Propozycja @darko również jest bardzo ciekawa - spjObjectStorage to taka wbudowana klasa Collection - możesz z niej skorzystać
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-2024 Invision Power Services, Inc.