1

私はこのような構造の一般的なテーブルを持っています

----------------------------------
id    |    name       | parent_id
------------------------------------
1     | root_category | Null
2     | Appare        | 1
3     | Accessories   | 1
4     | Shirt         | 2
5     | Pants         | 2
6     | hand Bags     | 3
7     | jewelry       | 3

そして、fromを使用して一般テーブルの値を製品テーブルに格納します

製品に関するすべての情報を含む製品テーブル

製品表


p_id       | 1 
p_name     | bla
p_weight   | 250
g_id       | 5      
g_name     | pants
g_parent   | 2

を使用して完全なツリーを生成したい

-> g_id-> g_name-> g_parent

ツリーは次のようになります

Root Category
 - Apparel 
   -- Shirts
   -- Pants 
 - Accessories
   -- Handbags 
   -- Jewelry

再帰関数を試しましたが、機能しません。

function get_categories($parent = $g_parent)
{
    $html = '<ul>';
    $query = mysql_query("SELECT * FROM `general` WHERE `parent_id` = '$parent'");
    while($row = mysql_fetch_assoc($query))
    {
        $current_id = $row['id'];
        $html .= '<li>' . $row['name'];
        $has_sub = NULL;
        $has_sub = mysql_num_rows(mysql_query("SELECT COUNT(`parent_id`) FROM `general` WHERE    `parent_id` = '$current_id'"));
        if($has_sub)
        {
        $html .= get_categories($current_id);
        }
        $html .= '</li>';
    }
    $html .= '</ul>';
    return $html;
}

print get_categories();

しかし、それは機能していません.... :(

4

3 に答える 3

2

これを試してみてください...その動作コード..出力スクリーンショット(出力画面)も参照してください

<?php

function get_categories(){

    $con = mysql_connect("localhost","root","");
    if (!$con){
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db("stackoverflow", $con);

    $result = mysql_query("SELECT g.`name` AS `category`, GROUP_CONCAT(gj.`name`) AS `name`
    FROM `general` g INNER JOIN `general` gj ON g.`id` = gj.`parent_id` GROUP BY g.`id` ");


    $i=0;
    while($row = mysql_fetch_array($result)){
        $data[$i]['category'] = $row['category'];
        $data[$i]['name'] = $row['name'];
        $i++;
    }

    $html = $data[0]['category']."<br>";
    unset($data[0]);

    foreach($data as $key => $listing){

        $html           .= " - ".$listing['category']."<br>";
        $exp             = explode(",",$listing['name']);
        $count_exp   = count($exp);

        for($j=0; $j<=$count_exp-1;$j++){
            $html      .= "  -- ".$exp[$j]."<br>";
        }
    }

    return $html;
}

print_r(get_categories()); 
?>

出力画面

ここに画像の説明を入力してください

于 2012-05-08T08:37:09.810 に答える
0

これを変える

print get_categories();

print get_categories(1);

空の文字列はMySQLのNULL値と一致しないため、開始IDを指定する必要があります。$ parentがnullかどうかを追加でチェックするように関数を変更したい場合を除いて、

于 2012-05-08T06:59:21.963 に答える
0

いくつか変更してこれを試してください:

function get_categories($parent)
{
    $html = '<ul>';
    $query = mysql_query("SELECT * FROM `general` WHERE `parent_id` = '$parent'");
    while($row = mysql_fetch_assoc($query))
    {
        $current_id = $row['id'];
        $html .= '<li>' . $row['name'];
        $has_sub = NULL;
        $has_sub = mysql_num_rows(mysql_query("SELECT COUNT(`parent_id`) as count FROM `general` WHERE    `parent_id` = '$current_id'")); // change here
        if($has_sub['count'] > 0) // change here
        {
        $html .= get_categories($current_id);
        }
        $html .= '</li>';
    }
    $html .= '</ul>';
    return $html;
}

print get_categories(1); // change here
于 2012-05-08T07:31:44.023 に答える