Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] drzewo kategorii
Forum PHP.pl > Forum > Przedszkole
fantaff
witam

przejde do rzeczy odrazu.

mam tabele o nazwie category w bazie która wygląda nast. :

id_category || parent_id || name

i wiadomo odpowiednio
1 || 0 || cos
2 || 0 || cos2
3 || 1 || cos3
4 || 2 || cos4

znalazlem 2 sposoby aby wyswietlic drzewo na stronie.

sposob 1:
  1. <?php
  2.  
  3. mysql_connect('localhost','test','test');
  4. mysql_select_db('anonsedb');
  5.  
  6. function show($res)
  7. {
  8.  
  9. $q="SELECT * FROM category WHERE parent_id = $res";
  10.  
  11. $result = mysql_query($q) or die(mysql_error());
  12. echo '<ul>';
  13. while($row = mysql_fetch_array($result))
  14. if($row['parent_id'] > 0)
  15. {
  16.  
  17. echo '<li><a href="index.php?name='.$row['name'].'">'.$row['name'].'</a></li>';
  18. show($row['id_category']);
  19. }
  20.  
  21. else
  22. echo '<li>'.$row['name'].'</li>';
  23.  
  24.  
  25. echo '</ul>';
  26. }
  27.  
  28. $q="SELECT * FROM category WHERE parent_id = 0";
  29. $result = mysql_query($q);
  30. echo '<ul>';
  31. while($row = mysql_fetch_array($result))
  32. {
  33. echo '<li><b><a href="index.php?name='.$row['name'].'">'.$row['name'].'</a></b></li>';
  34. echo show($row['id_category']);
  35. }
  36. echo '</ul>';
  37.  
  38.  
  39. ?>


sposob 2:
  1. <?php
  2.  
  3. mysql_connect('localhost','test','test');
  4. mysql_select_db('anonsedb');
  5.  
  6. function getAll ($query) {
  7. $res = mysql_query($query);
  8. $ret = array();
  9. if (!$res)
  10. return $ret;
  11. while ($r = mysql_fetch_assoc($res))
  12. $ret[] = $r;
  13. return $ret;
  14. }
  15.  
  16. function drzewoKategorii ($kategorie = null, $rodzicId = 0, $zaglebienie = 0, $wynik = null)
  17. {
  18. if ($wynik == null)
  19. $wynik = array();
  20. if ($kategorie == null) {
  21. $query = "select * from category order by parent_id, name";
  22. $kategorie = getAll($query);
  23. }
  24. foreach ($kategorie as $kat) {
  25. if ($r["parent_id"] == $rodzicId) {
  26. $r["zaglebienie"] = $zaglebienie;
  27. $wynik[] = $kat;
  28. $wynik = drzewoKategorii ($kategorie, $kat["id_category"], ($zaglebienie+1), $wynik);
  29. }
  30. }
  31. return $wynik;
  32. }
  33.  
  34. $drzewo = drzewoKategorii();
  35. foreach ($drzewo as $galaz) {
  36. for ($i=0; $i<=$galaz["zaglebienie"]; $i++) {
  37. echo '-';
  38. }
  39. echo $galaz["name"].'<br/>';
  40. }
  41.  
  42.  
  43. ?>


kody obu przykładów rozumiem w około 90%.

w sposobie 1 wyświetla mi drzewo bardzo ladnie ale nietety po wyswietleniu wszystkiego wywala mi blad i reszta strony nie laduje sie.

sposob 2 nie wyswietla mi drzewa (nie wiem czemu...) jednak jesli w index-ie dam include cat.php <-- plik z 1 sposobem, a do innej stronki powiedzmy ogloszenia.php wrzuce skrypt 2 dzieje sie bardzo dziwna rzecz. po zaladowaniu index.php wyswietla mi kategorie z bledem a po klikniecu odnosnika do ogloszenia.php wyswietla mi kategorie z 2 skryptu bardzo ladnie i bez bledu.

moje pytanie, ktory skrypt jest lepszy, i dlaczego 2 skrypt samodzielnie nie dziala a z 1 skryptem "z-includowanym" do indexu dziala?
sadistic_son
Cytat(fantaff @ 26.11.2010, 13:43:10 ) *
(...) wywala mi blad (...)
JAKI?!Wyobraź sobie, że istnieje więcej niż jeden rodzaj błędu, więc dość trudno jest zgadnąć który Tobie akurat się pojawia...
fantaff
sorki faktycznie nie pomyslalem...

w kodzie źródłowym już po przejściu przez parser pokazuje sie cos takiego:

  1. <b>Fatal error</b>: Cannot redeclare show() (previously declared in C:\xampp\xampp\htdocs\www\glowna.php:6) in <b>C:\xampp\xampp\htdocs\www\glowna.php</b> on line <b>26</b><br />


caly plik glowna.php to przyklad 1. do tego momentu wszystko jest ok.
sadistic_son
Skoro wewnątrz funkcji show masz echo to nie możesz dać
  1. echo show($row['id_category']);
i to jeszcze w pętli. Daj to bez echo.
fantaff
okej ciekawostka przyrodnicza...

dalem w index.php

include "glowna.php";

jesli wejde na localost/index.php to wszystko jest wyswietlane bardzo ladnie zadnych bledow. w indexie mam zrobione menu:
  1. <?php
  2. include("glowna.php");
  3. if($_GET["menu"]=="glowna"){
  4. include("glowna.php");
  5. }else if ($_GET["menu"]=="dodaj"){
  6. include("dodaj.php");
  7. }else if ($_GET["menu"]=="rejestracja"){
  8. include("rejestracja.php");
  9. }else if ($_GET["menu"]=="logowanie"){
  10. include("logowanie.php");
  11. }else{
  12. echo "";
  13. }
  14. ?>


jesli klikne na Strona glowna -> glowna.php to nadal jest ten blad... jak moze ten sam kod na jednej stronie wywolywac blad a na innej nie? zawsze spotykalem sie z przypadkami ze albo cos dziala albo nie... i sorki za problem.

edit

ekhm... usunalem include "glowna.php" z indexu i teraz kiedy klikne na link do glowna.php to wszystko jest ok. dlaczego tak sie dzieje?
sadistic_son
Odpowiedz jest prosta - jesli klikniesz w Strone Glowna to znow deklarujesz funkcje show() dwa razy. W powyzszym kodzie includujesz glowna.php bez wzgledu na to co sie wybralo. Funkcja show jest deklarowana pierwszy raz. Jesli wybierzesz cokolwiek innego niz Strona Glowna wszystko jst ok bo nie includujesz drugi raz glowna.php. Natomiast jesli GET['menu'] jest rowne "glowna", czyli kliknales w Strona Glowna to znow includujesz glowna.php i deklarujesz funkcje show jeszcze raz. Wywal include("glowna.php"); z linijki 2 i wszystko bedzie ok.
Pomoglem? winksmiley.jpg
marcio
Jesli importujesz sobie jakies potrzebne funkcje uzyj include_once/require_once zamiast include/require i po problemie winksmiley.jpg
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.