【问题标题】:PHP - Looping A-Z To Sort Mysql Results using Dynamic LinksPHP - 循环 A-Z 以使用动态链接对 Mysql 结果进行排序
【发布时间】:2013-02-03 01:53:08
【问题描述】:

我在mysql中有下表:-

id |乐队名
1 |一个完美的圆圈
2 |航空史密斯
3 | b.b国王
4 |猫史蒂文斯

我在一个查询中获取所有结果:-

$result = mysql_query("SELECT id, bandname FROM bands ORDER BY bandname ASC");

在我的页面上,我有 A-Z 锚链接,它们会打开一个新标签:-

    <ul class="tabs-nav">
        <li class="active"><a href="#0">0-9</a></li>
    <?php
        // Print a-z link
        for ($i=97; $i<=122; $i++) {
         $curletter = chr($i);
         echo '<li><a href="#'.$curletter.'" title="Band names beginning with letter '.$curletter.'" class="uppercase">'.$curletter.'</a></li>';
        }
    ?>
    </ul>

我无法在其标签下列出乐队。目前我的代码是:-

    <div class="tabs-container">
    <?php
        // Print a-z tabs
        for ($i=97; $i<=122; $i++) {
         $curletter = chr($i);
    ?>
        <div class="tab-content" id="<?php echo $curletter; ?>">
            <?php
            while($bands = mysql_fetch_array( $result )) {
                $bandname = $bands['bandname'];
                $bandid = $bands['id'];
                $bandletter = strtolower(substr($bandname , 0 , 1));
            }
            if($curletter==$bandletter) {
                echo '<a href="'.$bandid.'/" title="'.$bandname.'>'.$bandname.'</a>';
            }
            ?>
        </div>
    <?php } ?>
    </div>

我知道这是不正确的,因为我在 for 循环中调用了 while 循环,这对我来说似乎不正确 - 因为 A-Z 选项卡创建过程的每次迭代都必须通过 while 循环。

如果我要处理 5,000 个乐队,那么最好的方法是什么?一个 sql 结果循环多次,每个带的一个结果然后保存在一个字母数组中,或者每当用户单击其中一个锚链接时,一个 ajax sql 查询?

这些甚至都没有开始处理 0-9 选项卡,我认为考虑到我当前的代码,这本身就是一个问题。任何指针都将不胜感激。

我已经搜索了一个答案,但没有找到与我的问题类似的东西:)

【问题讨论】:

  • 虽然我可以为你的循环问题找到更好的解决方案(一个循环就足够了),但我绝对不会向浏览器发送 5000 个结果,这不会带来非常愉快的浏览体验。

标签: php mysql alphabetical


【解决方案1】:

虽然我根本不推荐您使用的方法,但如果您想让它尽可能简单,那么您需要在输入名称循环 foreach 之前使用 while 提取所有乐队名称将它们放入临时数组中,或者在任何输出发生之前更好。这将允许您在此数组上使用 foreach() 而不是 while。您也可以按字母将它们排序到数组中,以便更轻松地查看哪些字母具有以它开头的带

一些额外的提示:

  • 在字母列表中使用range() 而不是for($i = ... )chr()
  • 为您的 href 值提供更多的值,而不仅仅是作为 id 的字母(美观但肯定更好),例如 letter-a letter-b 等等
  • 如果您使用 5000 多条记录,我认为您应该通过分页将这些记录放在单独的页面上,而不是放在一大页的乐队中
  • 如果这些内容不会经常更改,您最好使用某种缓存系统将数据库查询降至最低
  • 如果您使用我上面给出的按字母排列的方法,您可以使用count() 函数将带编号计数添加到字母列表中(甚至隐藏您没有带的字母)

【讨论】:

  • 非常感谢。目前我只有 3 条记录,但我计划在未来扩展 ;)
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多