За последние 24 часа нас посетили 55413 программистов и 1793 робота. Сейчас ищут 808 программистов ...

Проблема с кодом

Тема в разделе "PHP и базы данных", создана пользователем lencic, 20 апр 2010.

  1. lencic

    lencic Активный пользователь

    С нами с:
    19 ноя 2009
    Сообщения:
    26
    Симпатии:
    0
    Доброго времени суток уважаемые.
    У меня возникла проблема с кодом с выводом данных из таблицы.
    Вот это моя таблица
    [sql]CREATE TABLE `table_full` (
    `ID` int(3) NOT NULL auto_increment,
    `ParentID` int(11) default '0',
    `Name` varchar(250) NOT NULL default '',
    `cat_li` enum('Yes','No') default 'No',
    `urls` varchar(100) default NULL,
    `actives_url` enum('on','off') NOT NULL default 'off',
    `texts` longtext,
    `lang` int(6) unsigned default NULL,
    `sortID` int(11) NOT NULL default '0',
    PRIMARY KEY (`ID`),
    KEY `ID` (`ID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;[/sql]

    С помощью этой структуре таблицы можно создавать меню с многими подменюшками у которых тоже может быть подменюшки и т.д. Все это показывается в поле ParentID.
    Так вот мне и надо создать такое меню но у меня возникла проблема.

    Вот мой код пхп:
    PHP:
    1.  
    2. <?php
    3. global $out,$mode;
    4. $prefix="";
    5. $query = "select * from table_full where ParentID = '$parent_id'";
    6. $result = mysql_query($query) or die(mysql_error());
    7. while($row = mysql_fetch_array($result))
    8. {
    9. if ($row['ParentID']==$mode )
    10. {
    11. $out.="<li><a href=?lang=1&mode=".$row['ID'].">". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</a></li>";   
    12. }
    13. elseif ($row['actives_url']=='on')
    14. {
    15. $out.="<li><a href=http://".$row['urls'].">". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</a></li>";
    16. }
    17. elseif (trim($row['texts'])=="")
    18. $out.="<li>". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</li>";
    19.  
    20.  
    21. elseif ($row['actives_url']=='on')
    22. {
    23. $out.="<ul>".$prefix."<li><a href=http://".$row['urls'].">". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</a></li></ul>";
    24. }
    25. elseif (trim($row['texts'])=="")
    26. $out.="<ul>".$prefix."<li>". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</li></ul>";
    27. else
    28. $out.="<ul>".$prefix."<li><a href=?lang=1&mode=".$row['ID'].">". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</a></li></ul>";
    29. }
    30.  
    31. echo '<ul>';
    32.  print $out;
    33. echo '</ul>';
    34. ?>
    С этим кодом у меня выходит так:
    HTML:
    1.  
    2. Меню
    3.           o Studii
    4.     * categorie
    5.     * dddddd
    6.  
    А должно как то так:
    HTML:
    1.    
    2. Меню
    3.     * Studii
    4.           o Facultati
    5.           o fffffff
    6.     * categorie
    7.     * dddddd
    8.  
    То есть он мне выводит только те поля у которых в поле ParentID стоит "0", это означает что это корень(то есть это не подменю.) А подменю не хочет выводить.
    А для полной ясности ниже скриншот таблицы с данными.
    [​IMG]

    Помогите девушкe пожалуйста )
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Тут не только девушки))
    (е)
     
  3. lencic

    lencic Активный пользователь

    С нами с:
    19 ноя 2009
    Сообщения:
    26
    Симпатии:
    0
    Сорри просто русский не мой родной язык. Я имела ввиду себя.. я девушка )))
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    lencic
    Какая степень вложенности, девушка?
    2, 3? Произвольная?

    Мой родной язык тоже не русский, но это не оправдывает, увы, моих ошибок.
    Тем более грамматических (если уж на орфографические и пунктуационные закрываем глаза).
     
  5. lencic

    lencic Активный пользователь

    С нами с:
    19 ноя 2009
    Сообщения:
    26
    Симпатии:
    0
    Тут может быть сколько угодно вложенностий. Это должен быть цикл который определяет является ли линия таблицы подменю и поставить его на место где он должен стоять.
    Мне кажется что это можно делать в функции но не знаю как именно.
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Всё гораздо, ГОРАЗДО сложней с произвольной вложенностью.
    Искать в гугле по запросу "BTree PHP" или "Binary Tree Algorithms php"

    Одной функцией не отделаешься, девушка.
     
  7. lencic

    lencic Активный пользователь

    С нами с:
    19 ноя 2009
    Сообщения:
    26
    Симпатии:
    0
    А если допустить что больше 3 вложенностей не будет? Это будет по проще?
     
  8. lencic

    lencic Активный пользователь

    С нами с:
    19 ноя 2009
    Сообщения:
    26
    Симпатии:
    0
    Я нашла в инете код который я уже настроила под себя:
    PHP:
    1. <?php
    2.  
    3. function ShowTree($ParentID, $lvl) {
    4.  
    5. global $link;
    6. global $lvl;
    7. global $mode;
    8. $lvl++;
    9.  
    10. $sSQL="SELECT * FROM table_full WHERE ParentId=".$ParentID." ORDER BY ID";
    11. $result=mysql_query($sSQL, $link);
    12.  
    13. if (mysql_num_rows($result) > 0) {
    14. echo("<UL id='verticalmenu' class='glossymenu'>\n");
    15. //echo("<UL>\n");
    16. while ( $row = mysql_fetch_array($result) ) {
    17.  
    18. $ID1 = $row["ID"];
    19. if ($row['actives_url']=='on')
    20. {
    21. echo "<li><a href=http://".$row['urls'].">". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</a></li>";
    22. }
    23. elseif (trim($row['texts'])=="")
    24. echo "<li>". htmlspecialchars_decode($row['Name'], ENT_QUOTES)."</li>";
    25.  
    26. else
    27. {
    28. echo("<li>\n");
    29. echo("<A HREF=""."?mode=".$ID1."">".$row["Name"]."</A>"."  \n");
    30. ShowTree($ID1, $lvl);
    31. $lvl--;
    32. }}
    33. echo("</UL>\n");
    34. }
    35.  
    36. }
    37.  
    38. ShowTree(0, 0);
    39. mysql_close($link);
    40.  
    41. ?>
    а обычный код выглядит так:
    PHP:
    1. <?php
    2.  
    3. function ShowTree($ParentID, $lvl) {
    4.  
    5. global $link;
    6. global $lvl;
    7. $lvl++;
    8.  
    9. $sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
    10. $result=mysql_query($sSQL, $link);
    11.  
    12. if (mysql_num_rows($result) > 0) {
    13. echo("<UL>\n");
    14. while ( $row = mysql_fetch_array($result) ) {
    15. $ID1 = $row["id"];
    16. echo("<LI>\n");
    17. echo("<A HREF=""."?ID=".$ID1."">".$row["title"]."</A>"."  \n");
    18. ShowTree($ID1, $lvl);
    19. $lvl--;
    20. }
    21. echo("</UL>\n");
    22. }
    23.  
    24. }
    25.  
    26. ShowTree(0, 0);
    27.  
    28. mysql_close($link);
    29.  
    30. ?>
    31.  
    Кому надо берите.
    С этим кодом все очень просто, парень. Всю работу выполняет рекурсивная функция ShowTree()
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Знаешь в чём проблема, девочка?
    Именно в том, что она рекурсивная.
    Профилирование тебе поможет увидеть все прелести её использования, а потом ты нам скажешь, как всё просто и рекурсивно =)