Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP i mysql vadem. - problem z przykładem w książce
GreeN_DG
post 27.01.2011, 00:08:35
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 1
Dołączył: 3.12.2009

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


Witam serdecznie. Jak czytałem na kilku forach książka (php i mysql. tworzenie stron www. vademecum profesjonalisty. wydanie czwarte) posiada trochę błędów i nie należy ponoć do wybitnych. Chodzi mi o pewien przykład z rozdziału 31 - "tworzenie forum www". Wydaje mi się, iż pomóc mogą mi osoby, które posiadają tą książkę. Jest tam klasa, która ma służyć do budowy drzewa artykułów tegoż forum. To nie cały listing tej klasy, ale wystarczy do objaśnienia problemu :

  1. // funkcje służące do pobierania, tworzenia i wyświetlania drzewa
  2. // znajdują się w tym pliku
  3.  
  4. class wezel_drzewa
  5. {
  6. // każdy węzeł drzewa posiada zmienne składowe zawierające wszystkie dane
  7. // artykułu poza jego właściwym tekstem
  8. public $c_id_artykulu;
  9. public $c_tytul;
  10. public $c_umieszczajacy;
  11. public $c_umieszczony;
  12. public $c_potomek;
  13. public $c_lista_pot;
  14. public $c_glebokosc;
  15.  
  16. public function __construct($id_artykulu, $tytul, $umieszczajacy, $umieszczony, $potomek,
  17. $rozwin, $glebokosc, $rozwiniety, $podlista)
  18. {
  19. // konstruktor konfiguruje zmienne członkowskie, oraz, co ważniejsze,
  20. // rekurencyjnie tworzy niższe części drzewa
  21. $this->c_id_artykulu = $id_artykulu;
  22. $this->c_tytul = $tytul;
  23. $this->c_umieszczajacy = $umieszczajacy;
  24. $this->c_umieszczony = $umieszczony;
  25. $this->c_potomek =$potomek;
  26. $this->c_lista_pot = array();
  27. $this->c_glebokosc = $glebokosc;
  28.  
  29. // co jest pod tym węzłem ważne jest tylko jeżeli posiada potomków i jest
  30. // zaznaczony do rozwinięcia
  31. // podlisty są zawsze rozwinięte
  32. if(($podlista||$rozwin) && $potomek)
  33. {
  34. $lacz = lacz_bd();
  35.  
  36. $zapytanie = "select * from naglowek where przodek = $id_artykulu order by umieszczony";
  37. $wynik = $lacz->query($zapytanie);
  38.  
  39. for ($licznik=0; $rzad = @$wynik->fetch_assoc(); $licznik++)
  40. {
  41. if($podlista||$rozwiniety[ $rzad['id_artykulu'] ] == true)
  42. $rozwin = true;
  43. else
  44. $rozwin = false;
  45. $this->c_lista_pot[$licznik]= new wezel_drzewa($rzad['id_artykulu'],$rzad['tytul'],
  46. $rzad['umieszczajacy'],$rzad['umieszczony'],
  47. $rzad['potomek'], $rozwin,
  48. $glebokosc+1, $rozwiniety, $podlista);
  49. }
  50. }
  51. }


A to listing gdzie tworzony jest egzemplarz tej klasy :

  1. function wyswietl_drzewo($rozwiniety, $wiersz = 0, $start = 0)
  2. {
  3. // wyświetlenie widoku drzewka konwersacji
  4.  
  5. global $szerokosc_tabeli;
  6. echo "<table width = '$szerokosc_tabeli'>";
  7.  
  8. // sprawdzenie, czy wyświetlana jest pełna lista czy podlista
  9. if($start>0)
  10. $podlista = true;
  11. else
  12. $podlista = false;
  13.  
  14. // konstrukcja struktury drzewa przedstawiającej podsumowanie konwersacji
  15. $drzewo = new wezel_drzewa($start, '', '', '', 1, true, -1, $rozwiniety, $podlista);
  16.  
  17. // powiedz drzewu żeby samo się wyświetliło
  18. $drzewo->wyswietl($wiersz, $podlista);
  19.  
  20. echo '</table>';
  21. }


Więc od początku. Gdy tworzony jest egzemplarz tej klasy,funkcja konstrukcyjna sprawdza czy dany artykuł posiada dzieci, następnie tworzony jest nowy egzemplarz tej klasy przez co funkcja konstrukcyjna znów.... i tak dalej i tak dalej...

Chodzi mi głownie o tą część :

  1. $this->c_lista_pot[$licznik]= new wezel_drzewa($rzad['id_artykulu'],$rzad['tytul'],
  2. $rzad['umieszczajacy'],$rzad['umieszczony'],
  3. $rzad['potomek'], $rozwin,
  4. $glebokosc+1, $rozwiniety, $podlista);


Dajmy na to że mamy dwa artykuły A i B na poziomie "0". Następnie dwa artykuły C i D gdzie C jest dzieckiem A i D jest dzieckiem C. Czyli A->C->D i B obok A. Gdy tworzony jest pierwszy egzemplarz klasy konstruktor sprawdza w badzie że są dwa artykuły na "0" poziomie ( A i B ) . Pobiera ich dane. Następnie w bloku iteracyjnym tworzony jest nowy egzemplarz (który jest tablicą) omawianej klasy : c_lista_pot[0] i tam następuje znów wywołanie konstruktora, potem iteracja i znów tworzony jest egzemplarz omawianej klasy: c_lista_pot[0]. Więc co mamy dwa egzemplarze c_lista_pot[0] ? Chyba że ja czegoś nie rozumiem. Przecież jak będzie kilka gałęzi to każdy pierwszy element będzie c_lista_pot[0] bo indeks pochodzi od funkcji iteracyjnej.. To samo tyczy się zmiennej $glebokosc+1. Przecież gdy kończy analizowanie danej gałęzi i wraca do góry drzewa aby analizować kolejną gałąź to musi ta zmienna się zerować aby głębokość pierwszego elementu tej gałezi była 0. Mam nadzieję, że nie zamieszałem zbytnio, i faktem jest jak już pisałem wcześniej, że najlepiej jeśli ktoś posiada tą książkę aby mi pomóc. W razie czego mogę więcej napisać informacji z książki.

Pozdrawiam
GreeN


--------------------
- WWW.GETICA.PL - strony WWW, logotypy, ilustracje - ZAPRASZAMY!
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.08.2025 - 04:00