为MySQL表中的每一行显示一个项目符号列表


Present one bulleted list for each row in a MySQL table

我有一个mysql表,如下所示:

 name1 |  dllink1 | dltarget1 | dllink1Text | link2 | dltarget2 | dllink2Text | link3 | dltarget3 | dllink3Text | ... | link10
 name2 |  dllink1 | dltarget1 | dllink1Text | link2 | dltarget2 | dllink2Text | NULL  | NULL      | NULL        | ... | link10
 ...   |    ...   | ...       |    ...      | ...   | ...       | ...         | ...   | ...

只要链接不是NULL,我就想为每个名称输出一个链接的项目符号列表:

<dl>name1<dl/>
    <li><a href="dllink1" target="dltarget1>dllink1Text</a></li>
    <li><a href="dllink2" target="dltarget2>dllink2Text</a></li>
    <li><a href="dllink3" target="dltarget2>dllink3Text</a></li>
<dl>name2<dl/>
    <li><a href="dllink1" target="dltarget1>dllink1Text</a></li>
    <li><a href="dllink2" target="dltarget2>dllink2Text</a></li>
<dl>name3<dl/>
    <li><a href="dllink1" target="dltarget1>dllink1Text</a></li>
...

(表中的'dltarget(x)'为_self_blank等)

实现这一目标的最佳和最正确的方法是什么?获取值,即while($row = @mysql_fetch_array($rs))中的$row['name'],对于新手来说相对容易学习,但这在一定程度上是一个挑战。。

首先,您的SQL表没有正确规范化。你应该把它分成两个表(这将使它更容易扩展、维护和理解),比如links和link_groups(为了便于讨论,因为我不完全了解上下文)。您的链接表可以包含"href"、"target"、"title"answers"link_group_id"作为将您的链接与您的link_group关联的外键,并且您的link_groups可以有一个自动递增的"id"作为主键,以及一个用于标识组的"name"字段。

一旦完成,有很多方法可以解决这个问题,其中一种简单的方法(尽管有点嘈杂)如下。。。

注意,第二个块中的替代PHP语法(这是假设前端代码)。您可以随心所欲地对其进行编码(即,将传统形式的PHP放在一个完整的块中)。

<?php 
$links = []; // only use this alternative array syntax if using PHP 5.4+ 
// your recordset for links
while ($row = mysql_fetch_object($rs)) {
    $links[$rs->link_group_id][] = $row;
}
?>
<!-- your recordset for link groups -->
<?php while ($row = mysql_fetch_object($rs)): ?>
    <dl>    
      <dt><?php echo($row->name); ?></dt>
      <?php foreach ($links[$row->id] as $link): ?>
        <dd>
          <a href="<?php echo($link->href); ?>"
             target="<?php echo($link->target); ?>"><?php echo($link->title); ?></a>
        </dd>
      <?php endforeach; ?>
    </dl>
<?php endwhile; ?>