Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Szablony + obiekty
misieq
post 5.11.2006, 15:14:01
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 1.11.2006

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


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 :|
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
marast78
post 5.11.2006, 17:24:15
Post #2





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 30.11.2004

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


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..

Ten post edytował marast78 5.11.2006, 17:30:17


--------------------
Go to the top of the page
+Quote Post
misieq
post 5.11.2006, 20:48:51
Post #3





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 1.11.2006

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


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.
Go to the top of the page
+Quote Post
marast78
post 6.11.2006, 08:23:09
Post #4





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 30.11.2004

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


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..


--------------------
Go to the top of the page
+Quote Post
misieq
post 6.11.2006, 14:53:12
Post #5





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 1.11.2006

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


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

Ten post edytował misieq 6.11.2006, 15:04:39
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:59