Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie na tabeli a obiektowość
gburus
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.06.2010

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


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.

Ten post edytował gburus 8.07.2010, 22:38:45
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
kilas88
post
Post #2





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

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


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).
Go to the top of the page
+Quote Post
gcdreak
post
Post #3





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


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.
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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.
Go to the top of the page
+Quote Post
gburus
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.06.2010

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


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 (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
gcdreak
post
Post #6





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


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
Go to the top of the page
+Quote Post
gburus
post
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.06.2010

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


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?



Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Polecam jednak wykorzystać gotowy kontener w postaci splObjectStorage. Od php 5.3.0 biblioteka spl jest domyślnie częścią core php.
Go to the top of the page
+Quote Post
gcdreak
post
Post #9





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


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ć
Go to the top of the page
+Quote Post

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: 20.12.2025 - 23:49