Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szablony + obiekty
Forum PHP.pl > Forum > PHP
misieq
Mam taki kod:

  1. <?php
  2. $post_tpl = new template(); //tworzenie obiektu szablonu
  3. $post_tpl -> load('forum_post'); //ladowanie szablonu
  4.  
  5. $db -> query("SELECT * FROM `tabela`"); //query pobierajace jakas ilosc wierszy wieksza niz 1
  6.  
  7. while ($post = $db -> fetch_row()) {
  8. $post_tpl -> blocks = array (
  9. "postcontent" => $post['content']
  10. );
  11. $post_tpl -> parse();
  12. echo $post_tpl -> parsed;
  13. }
  14. ?>


Coś takiego działa jak należy - czyli wypisuje treści postów z forum po kolei zgodnie z szablonem. Ale jeśli dodam w pętli while:

  1. <?php
  2. $userdata = new user($post['author']); // tworzymy obiekt autora postu
  3. ?>

to wyświetla się tylko jeden post - pierwszy z danego zapytania. Reszty nie ma :|
marast78
cały czas deklarujesz ten sam obiekt?
zrób coś takiego..naprzykład twórz tablice obiektów, wg mnie najprostsze rozwiązanie..
  1. <?php
  2. $userdata[$i++] = new user($post['author']); // tworzymy obiekt autora postu
  3. ?>


Poza tym nie deklaruj zmiennych o nazwach zbliżonych do zmiennych globalnych jak $post czy $get..tak dla ładnego kodu..
misieq
Rozwiązanie, które proponujesz już sprawdzałem.. i nie działa. Połowicznie działa coś podobnego: deklarujemy tablicę obiektów, tylko licznik zwiększamy poza deklaracją tablicy

  1. <?php
  2. $i = 0;
  3. while (....) {
  4. $userdata[$i] = new user($post['author']); // tworzymy obiekt autora postu
  5. ...
  6. ...
  7. $i++;
  8. }
  9. ?>

Ale niestety wyświetla się nadal tylko pierwszy post (pola są wypełniane odpowiednio).

Nie można w php usuwać obiektów?

EDIT: Ok, po bojach z php domyśliłem się o co chodzi. Zmienna połączenia jest globalna w funkcjach klasu user, a wykonuję tam zaytania więc zmieniam pole wyniku zapytania w klasie bazy. Powstaje więc pytanie: w jaki sposób sobie z tym najefektywniej poradzić? Tworzenie nowego połączenia w klasie chyba odpada bo to nieefektywne.
marast78
no tak masz rację php ma problem z iteracją w ten sposób zapomniałem o tym smile.gif co do twojego pytania to wykorzystaj singleton..myślalem o tym juz wcześniej smile.gif oczywiście ponieważ widzę tylko fragment kodu to nie do końca wiem właściwie czy moje podpowiedzi są dobre przecież z fragmentu listu nie mogę wywnioskować całości jego treści..
misieq
Hm, nie wiem czy dobrze rozumiem. Singleton to klasa, za pomocą której można wytworzyć tylko jeden obiekt z tego co się orientuję. W jaki sposób miałoby to pomóc w problemie? Być może jakoś za mało to opisałem, wygląda to tak, że mam
  1. <?php
  2. while ($array = $db -> query(zapytanie)) {
  3. ...
  4. ...
  5. $user -> setData($array['author']);
  6. }
  7. ?>


I metoda setData też wykorzystuje bazę w związku z czym "zamazywane" jest zapytanie w while, więc pętla nie robi już tego, co powinna.


EDIT: Ok, po głębszym... zastanowieniu smile.gif doszedłem do tego, że możnaby tworzyć tablicę zapytań w klasie (w tej chwili jest to pole var $executed_query a proponowałbym var $executed_query = array()). Problem jest z implementacją, spotkał się już ktoś z czymś takim? Miał podobny problem i wie jak to rozwiązać? Ogólnie chodzi o pamiętanie zapytania w unikalnym wierszu tablicy i usuwanie wiersza po wykonaniu zapytania (chyba smile.gif )

EDIT2: Ok, po prostu query($q) powinna zwracać zapytanie. Potem przypisywanie $a = $db -> query("zapytanie");
To było takie proste biggrin.gif
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.