1

我有一个名为 menu 的表,其中包含列(sequence, page_seq, name, parent_id)

sequence并且page_seq无关紧要

parent_id空白的行是顶部菜单项,然后parent_id没有空白的行是子菜单项

因此,假设有一行名称Top Itemparent_id空白,序列为 1,另一行名称Sub 1parent_id1,因此当您将鼠标悬停在上方时,Top Item您将Sub 1作为子菜单项。

我正在尝试在我的后端管理面板上分组显示这些。因此,将有顶部菜单项及其下方的子链接,例如...

Top Item 1
- Sub 1
- Sub 2

Top Item 2
- Sub 3
- Sub 4

等等...

这是我到目前为止的PHP:

<table border="0" cellpadding="5" cellspacing="5">
    <tr>
        <td><strong>Name</strong></td>
    </tr>
    <?php
    $sql=" SELECT * FROM menu where parent_id = '' ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
    while($result=mysql_fetch_array($rs))
    {
        echo '<tr>
        <td>'.$result["name"].'</td>
        </tr>';
        $sql2="SELECT * from menu where parent_id != '' ";
        $rs2=mysql_query($sql2,$conn) or die(mysql_error());
        while($result2=mysql_fetch_array($rs2))
        {
            echo '<tr>
            <td><dir>'.$result2["name"].'</dir></td>
            </tr>';
        }
}
?>
</table>

但它显示顶部菜单项,每个子菜单项都在每个子菜单项下方。

有什么想法我能做到这一点吗?

4

2 回答 2

1

确保在 $sql2 期间,您选择了父项是您当前所在的顶部菜单项的序列 (=id) 的所有子项?:

$sql2= 'SELECT * from menu where parent_id = "'.$result['sequence'].'"';
于 2013-08-29T18:36:10.347 回答
0

好的,看来您使用同一张表来存储父母和孩子。
父母由 parent_id 定义为空白。
孩子由 parent_id 定义,不为空。
我不知道孩子和父母是如何联系起来的。

您的第一个查询设置了一个循环并获得了一个父级。对于每个循环,您希望另一个循环显示该父级的所有子级。
您需要在第二个循环中定义,从第一个循环中当前正在播放哪个父级以知道要显示哪些子级:

$sql2="SELECT * from menu where parent_id != '' AND name = $result['XX']"

第一个循环中的当前父级在哪里$result['XX'],以及是否将父级与子级联系起来,但是我不知道您使用什么来确定哪些父级与哪些子级相关联 - 名称?

建议/信息 你没有检查(也许你做了,而不是在这里简单的例子)。如果任一查询都没有发现会发生什么?或者,如果第一个循环找到了父母,而第二个循环没有找到孩子?
你需要检查一下,确保你有数据、结果等,否则你可能会得到空白的菜单项,或者更糟。

看起来你可以用两张表来改进这一点,一张给所有父母,一张给所有孩子。使用 childs 表中使用的 parent 表中的一些唯一引用作为父母和孩子之间的链接。
因此,您可以为给定的父母更新和选择一些孩子,或者为给定的孩子寻找父母等。

或者至少如果您仍然使用一个表,请通过一个确定父项和子项的列来严格定义父项和子项。即类型=父母,类型=孩子。这将消除您根据没有角色(即 parent_id = 空)确定某事物的角色的可能问题。

与往常一样,它不一定更适合您的确切要求,这就是为什么它是一个建议/信息:)

于 2013-08-29T19:29:17.470 回答