вывод родителя и потомков из бд

привожу код построения дерева названий родителей и потомков из бд + накопительные ссылки, т.е. ссылка на родителя, потом на первое поколение, затем на второе и т.д.

<?
$host        = 'localhost';
$db_user     = 'db_user';
$db_name     = 'db_name';
$db_pass     = 'db_pass';
$db_table    = 'db_table';
$parent_key  = 'parent_id'; // or part_parent_id
$field_key_1 = 'name';
$field_key_2 = 'id'; // or part_id
$field_key_3 = 'url';
$link        = mysql_connect($host, $db_user, $db_pass);
if (!$link) {
  die(mysql_error());
} else {
  mysql_select_db($db_name, $link) or die(mysql_error());
}
function parent_childs_tree($parent_id = 0) {
  global $db_table, $parent_key, $field_key_1, $field_key_2;
  $sql    = 'select * from ' . $db_table . ' where ' . $parent_key . ' = ' . $parent_id;
  $result = mysql_query($sql);
  if (mysql_num_rows($result) > 0) {
    echo '<ul>';
    while ($row = mysql_fetch_array($result)) {
      // к сожалению, не удалось вывести накопительные ссылки без доп. запросов
      $url = array();
      $id_ = $row[$field_key_2];
      while ($id_ != 0) {
        $sql2    = 'select ' . $parent_key . ', ' . $field_key_1 . ' from ' . $db_table . ' where ' . $field_key_2 . ' = ' . $id_;
        $result2 = mysql_query($sql2);
        if (mysql_num_rows($result2) > 0) {
          while ($row2 = mysql_fetch_array($result2)) {
            $id_   = $row2[$parent_key];
            $url[] = $row2[$field_key_1];
          }
        }
      }
      $url        = array_reverse($url);
      $url_string = '';
      foreach ($url as $url_part) {
        $url_string .= '/' . $url_part; // /parent/child1/child2/..
      }
      //
      echo '<li><a href="' . $url_string . '">' . $row[$field_key_1] . ' (id=' . $row[$field_key_2] . ', parent_id=' . $row[$parent_key] . ')</a></li>';
      parent_childs_tree($row[$field_key_2]);
    }
    echo '</ul>';
  }
}
parent_childs_tree(); // or parent_childs_tree(10) for show childs of id = 10
mysql_close($link);



Enter your email address:

Delivered by FeedBurner

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *