0

我一直在努力解决这个问题,所以我最终决定寻求帮助。我正在尝试编写一个由 mysql 数据库中的信息填充的 html 列表。我正在尝试编写一个 php 循环(或多个循环)来完成此操作。它开始变得复杂,因为列表中有多个节点。我尝试了许多不同的方法,但无法获得预期的结果。任何帮助将不胜感激!

该列表由具有各种“类别”和“子类别”的项目填充。该列表应按 ASC 顺序按客户名称、类别、子类别和零件编号排列。有些项目只有一个类别,没有子类别。有些项目没有类别,应该只是列在客户的名字下。所以列表应该是这样的......

客户
    1 - 类别
        1 - 子类别
                1 - 第 1 部分(包含类别和子类别的项目)
                - 第 2 部分
        - 子类别
                2 -第 3 部分
    - 类别2
        - 第 4 部分(只有一个类别的项目) - 第 5 部分
        -第 6 部分(
    没有类别或子类别的项目
    - 第 7 部分
客户
    2 - 类别
        1 - 子类别 1
                - 第 1 部分(包含类别和子类别的项目)
                - 第 2 部分
        - 子类别2
                -第 3 部分

ETC......

希望这足够清楚。

这是我第一次尝试解决这个问题,它接近了。它只是将物品放在错误的地方(不知道为什么)。

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

    mysql_select_db("pcu_ops", $con);

    $sql_customer="SELECT DISTINCT customer FROM common_parts ORDER BY customer ASC";

    $result_customer=mysql_query($sql_customer,$con);

    if (!mysql_query($sql_customer,$con))
    {
        die('Error: ' . mysql_error());
    }
?>
<table border="0">
    <colgroup>
        <col width="300px" valign="top">
        <col width="90%">
    </colgroup>
    <tr>
        <td valign="top">
            <!-- Add a <div> element where the tree should appear: -->
            <div id="common_parts_tree">
                <ul>
                    <?php
                        while ($row_customer = mysql_fetch_array($result_customer)) {
                            echo '<li class="expanded folder">'.$row_customer['customer'];
                                echo '<ul>';
                                    $customer=$row_customer['customer'];
                                    $sql_category="SELECT DISTINCT category FROM common_parts WHERE customer='$customer' ORDER BY customer ASC";
                                    $result_category=mysql_query($sql_category,$con);
                                    if (!mysql_query($sql_category,$con)) {
                                        die('Error: ' . mysql_error());
                                    }
                                    while ($row_category = mysql_fetch_array($result_category)) {
                                        if ($row_category['category'] != '') {
                                            echo'<li class="expanded folder">'.$row_category['category'];
                                                echo '<ul>';
                                                    $category=$row_category['category'];
                                                    $sql_subcategory="SELECT DISTINCT subcategory FROM common_parts WHERE (customer='$customer' AND category='$category') ORDER BY subcategory ASC";
                                                    $result_subcategory=mysql_query($sql_subcategory,$con);
                                                    if (!mysql_query($sql_subcategory,$con)) {
                                                        die('Error: ' . mysql_error());
                                                    }
                                                    while ($row_subcategory = mysql_fetch_array($result_subcategory)) {
                                                        if ($row_subcategory['subcategory'] != '') {
                                                            echo'<li class="expanded folder">'.$row_subcategory['subcategory'];
                                                                echo '<ul>';
                                                                    $subcategory=$row_subcategory['subcategory'];
                                                                    $sql_pn="SELECT DISTINCT pn FROM common_parts WHERE (customer='$customer' AND category='$category' AND subcategory='$subcategory') ORDER BY pn ASC";
                                                                    $result_pn=mysql_query($sql_pn,$con);
                                                                    if (!mysql_query($sql_pn,$con)) {
                                                                        die('Error: ' . mysql_error());
                                                                    }
                                                                    while ($row_pn = mysql_fetch_array($result_pn)) {
                                                                        $pn=$row_pn['pn'];
                                                                        echo '<li><a href="includes/phpscripts/part_quick_view.php?pn='.$pn.'&customer='.$customer.'" target="contentFrame">'.$pn.'</a>';
                                                                    }
                                                                echo '</ul>';
                                                        }
                                                        else {
                                                            if ($row['subcategory'] == '') {
                                                                $sql_pn="SELECT DISTINCT pn FROM common_parts WHERE (customer='$customer' AND category='$category') ORDER BY pn ASC";
                                                                $result_pn=mysql_query($sql_pn,$con);
                                                                if (!mysql_query($sql_pn,$con)) {
                                                                    die('Error: ' . mysql_error());
                                                                }
                                                                while ($row_pn = mysql_fetch_array($result_pn)) {
                                                                    $pn=$row_pn['pn'];
                                                                echo '<li><a href="includes/phpscripts/part_quick_view.php?pn='.$pn.'&customer='.$customer.'" target="contentFrame">'.$pn.'</a>';
                                                                }
                                                            }
                                                        }
                                                    }
                                                echo '</ul>';
                                        }
                                        else {
                                            echo '<li><a href="includes/phpscripts/part_quick_view.php?pn='.$pn.'&customer='.$customer.'" target="contentFrame">'.$pn.'</a>';
                                        }
                                    }
                                echo '</ul>';
                        }
                    ?>
            </div>
        </td>
        <td>
            <iframe src="" name="contentFrame" width="100%" height="500" scrolling="yes" marginheight="0" marginwidth="0" frameborder="0">
                <p>Your browser does not support iframes</p>
            </iframe>
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <center>
                <form id="rcv_common_parts">
                <input type="hidden" id="pn" name="pn"/>
                <input type="hidden" id="customer" name="customer"/>
                <table class="table">
                    <tr>
                        <td>Quantity to Receive:</td>
                        <td><input type="text" name="qty" /></td>
                    </tr>
                </table>
                </form>
            </center>
        </td>
    </tr>
</table>

这是我最近的尝试。我放弃了第一种方法并开始尝试使用此文件。仍然没有任何运气。

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

    mysql_select_db("pcu_ops", $con);

    $sql="SELECT * FROM common_parts ORDER BY customer ASC, category ASC, subcategory ASC, pn ASC";

    $result=mysql_query($sql,$con);

    if (!mysql_query($sql,$con))
    {
        die('Error: ' . mysql_error());
    }
?>
<table border="0">
    <colgroup>
        <col width="300px" valign="top">
        <col width="90%">
    </colgroup>
    <tr>
        <td valign="top">
            <!-- Add a <div> element where the tree should appear: -->
            <div id="common_parts_tree">
                <ul>
                    <?php
                        $row = mysql_fetch_array($result);
                            echo '<li class="expanded folder">'.$row['customer'];
                                echo '<ul>';
                                    while (($row['category'] != NULL) && ($row['subcategory'] != NULL)) {
                                        echo '<li class="expanded folder">'.$row['category'];
                                            echo '<ul>';
                                                echo '<li class="expanded folder">'.$row['subcategory'];
                                                    echo '<ul>';
                                                        echo '<li><a href="includes/phpscripts/part_quick_view.php?pn='.$row['pn'].'&customer='.$row['customer'].'" target="contentFrame">'.$row['pn'].'</a>';
                                                    echo '</ul>';
                                            echo '</ul>';
                                    }
                                echo '</ul>';
                    ?>
            </div>
        </td>
        <td>
            <iframe src="" name="contentFrame" width="100%" height="500" scrolling="yes" marginheight="0" marginwidth="0" frameborder="0">
                <p>Your browser does not support iframes</p>
            </iframe>
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <center>
                <form id="rcv_common_parts">
                <input type="hidden" id="pn" name="pn"/>
                <input type="hidden" id="customer" name="customer"/>
                <table class="table">
                    <tr>
                        <td>Quantity to Receive:</td>
                        <td><input type="text" name="qty" /></td>
                    </tr>
                </table>
                </form>
            </center>
        </td>
    </tr>
</table>

当然希望有人能帮忙!

谢谢!

4

3 回答 3

0

您应该实现递归算法。

数据库提示...仅包含类别和部分的简单示例:

- 类别1
        - 子类别 1
                - 第1部分
                - 第2部分
        - 子类 2
                - 第 3 部分
    - 类别2
        - 子类别 3
                - 第 4 部分
        - 第 5 部分
        - 第 6 部分
    - 第 7 部分
    - 第 8 部分
分类表
id 名称 父 user_id
1 类 1 0 1
2 类 2 0 1
3 子类别 1 1 1
4 子类别 2 1 1
5 子类别 3 2 1
零件表
名称类别
第 1 部分 3
第 2 部分 3
第 3 部分 4
第 4 部分 5
第 5 部分 2
第 6 部分 2
第 7 部分 0
第 8 部分 0

你明白了...

然后进行表演:

 $query_user = mysql_query("select * from users",$con);
while($row_user = mysql_fetch_array($query_user)) {
    echo "<ul>".$row_user['id'];
    show_category($row_user['id'],0);
    echo "</ul>";
}
function show_category($user,$parent){
    global $con;
    echo "<ul>";
    $query_cat = mysql_query("select * from categories where user_id=".$user." and parent=".$parent,$con);
    while($row_cat = mysql_fetch_array($query_cat)) {
        echo "<li>".$row_cat['name'];
        show_category($user,$row_cat['id']);
        echo "</li>";       
    }
    $query_parts = mysql_query("select * from parts where category=".$parent,$con);
    while($row_parts = mysql_fetch_array($query_parts)) {
        echo "<li>".$row_parts['name']."</li>";
    }
    echo "</ul>";
}
于 2012-05-13T06:06:37.430 回答
0

This is going to be a long answer but I think I can help you. First let's get a couple of things straight about how you will need to setup your database. I know your example says 'customers' but for my example below I will call them 'users':

1) You have a users table. That table should have an 'id' field that is an int 11, primary key, auto-increment. You will have more fields but the 'id' is all I am concerned with.
2) You need a 'categories' table to determine if the category is a "parent" category or "child" category. The structure should basically be something like 'id' (int 11, primary key, auto-increment), 'name' (varchar), 'user_id' (int 11), 'parent_id' (int 11). In your requirements above, Category 1, Category 2, etc... are "parent" categories so the parent_id should be 0 meaning they have no parent. For subcategories, you should use the id of the category that is it a subcategory of. For example if Category 1 has an id of 1, a sub-category of that category would have a parent_id of 1.
3) Finally you have a parts table. Again have an 'id' (int 11, primary key, auto-increment), 'user_id' (int 11), and a 'category_id' (int 11). You can obviously put other fields here but those are the three I am concerned with. If the part is not in a category, category_id is 0, otherwise use the id of the category or subcategory.

That gives you a sound database structure for mapping relationships for users, categories, and parts. Now, how do you get all that data into something usable? An array. Build an associative array that helps you display the data like you want it. Without writing a million lines of PHP, here is the gist.

$arr_user = array();
$sql = mysql_query('SELECT * FROM users ORDER BY name ASC', $con);
while($user = mysql_fetch_object($sql))
{
    $arr_user[$user->id]['name'] = $user->name;
    $sql2 = mysql_query('SELECT * FROM parts WHERE user_id='.$user->id.' AND category_id=0 ORDER BY name ASC', $con);
    while($part = mysql_fetch_object($sql2))
    {
        $arr_user[$user->id]['parts'][$part->id] = $part->name;
    }
    $sql3 = mysql_query('SELECT * FROM categories WHERE user_id='.$user->id.' AND parent_id=0 ORDER BY name', $con);
    while($category = mysql_fetch_object($sql3))
    {
        $sql4 = mysql_query('SELECT * FROM parts WHERE user_id='.$user->id.' AND category_id='.$category->id.' ORDER by name', $con);
        while($part = mysql_fetch_object($sql4))
        {
            $arr_user[$user->id]['category'][$category->id]['name'] = $category->name;
            $arr_user[$user->id]['category'][$category->id]['parts'][$part->id] = $part->name;
        }
        $sql5 = mysql_query('SELECT * FROM categories WHERE parent_id='.$category->id.' ORDER BY name', $con);
        while($subcat = mysql_fetch_object($sql5))
        {
            $sql6 = mysql_query('SELECT * FROM parts WHERE category_id='.$subcat->id.' ORDER BY name', $con);
            while($part = mysql_fetch_array($sql6))
            {
                $arr_user[$user->id]['category']['subcat'][$subcat->id]['name'] = $subcat->name;
                $arr_user[$user->id]['category']['subcat'][$subcat->id]['parts'][$part->id] = $part->name;
            }
        }
    }
}

if( sizeof( $arr_user ) )
{
    foreach( $arr_user as $k=>$v )
    {
        echo $v['name']; //echo the user's name
        if( isset( $v['category'] ) && sizeof( $v['category'] ) )
        {
            foreach( $v['category'] as $ck=>$cv )
            {
                echo $cv['name']; //echo category name
                if( isset( $cv['subcat']) && sizeof( $cv['subcat'] ) )
                {
                   foreach( $cv['subcat'] as $sk=>$sv )
                   {
                       echo $sv['name']; //echo subcat name
                       if( isset( $sv['parts'] ) && sizeof( $sv['parts'] ) )
                       {
                           foreach( $sv['parts'] as $spk=>$spv )
                           {
                               echo $spv; //echo part name
                           }
                       }
                   }
                }
                if( isset($cv['parts']) && sizeof($cv['parts']) )
                {
                    foreach( $cv['parts'] as $cpk=>$cpv )
                    {
                        echo $cpv; //echo part name
                    }
                }
            }
        }
        if( isset($v['parts']) && size($v['parts']) )
        {
            foreach( $v['parts'] as $pk=>$pv )
            {
                echo $pv;
            }
        }
    }
}
于 2012-05-13T07:50:24.113 回答
0

您发布的第一个代码似乎还可以,但是太长了,我无法弄清楚。基本上你只需要一个while循环内的while循环,等等所有类别,子类别等......

我不知道您的数据库结构,因此您可能需要更改一些列名称,但除此之外应该可以:

$query1 = "the customer query";
while($customerRow = mysql_fetch_array(mysql_query($query1,$con))) {
    echo '<ul><li>';
    echo $customerRow['customer'];
    $query2 = "the category query";
    while($categoryRow = mysql_fetch_array(mysql_query($query2,$con))) {
        echo '<ul><li>';
        echo $categoryRow['category'];
        $query3 = "the subcategory query";
        while($subcategoryRow = mysql_fetch_array(mysql_query($query3,$con))) {
            echo '<ul><li>';
            echo $subcategoryRow['subcategory'];
            echo '</li></ul>';
        }
        echo '</li></ul>';
    }
    echo '</li></ul>';
}
于 2012-05-13T05:22:19.060 回答