0

私はmysqlに次のテーブルを持っています:-

ID | バンド名
1 | 完全な円
2 | エアロスミス
3 | bbキング
4 | 猫のスティーブンス

私は単一のクエリですべての結果を取得しています:-

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

私のページには、新しいタブを表示するAZアンカーリンクがあります:-

    <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 ループを呼び出しているため、これが正しくないことはわかっていますが、AZ タブ作成プロセスのすべての反復は while ループを実行する必要があるため、私には正しくないように思えます。

たとえば 5,000 のバンドを扱う場合、これに最適なアプローチは何ですか? 1 つの SQL 結果が複数回ループされ、各バンドの 1 つの結果がアルファベット配列に保持されるか、ユーザーがアンカー リンクの 1 つをクリックするたびに ajax SQL クエリが実行されますか?

これは、現在のコードを考えると、それ自体が問題になると思う 0-9 タブの処理を開始するものではありません。どんな指針も本当に高く評価されます。

私は答えを探しましたが、私の質問に似たものは見つかりませんでした:)

4

1 に答える 1

0

使用した方法はまったくお勧めしませんが、できるだけシンプルに保ちたい場合は、名前を入力する前に while を使用してすべてのバンド名を抽出する必要があります。一時的な配列、またはさらに良いのは、出力が行われる前です。foreach()これにより、while の代わりにこの配列で使用できるようになります。これらを文字ごとに配列に並べ替えることもできます。これにより、どの文字がそれで始まるバンドを持っているかを簡単に確認できます

追加のヒント:

  • 文字リストにはandの代わりにrange()を使用しますfor($i = ... )chr()
  • href 値に、id として単なる文字以上のものを指定します (美的ですが、確かに優れています)letter-a letter-bなど
  • 5000 以上のレコードを使用している場合、私の意見では、バンドの 1 つの大きなページではなく、ページネーションを使用してこれらを別々のページに提供する必要があります。
  • これらがあまり頻繁に変更されない場合は、データベースへのクエリを最小限に抑えるために、何らかのキャッシュ システムを使用することをお勧めします。
  • 上記の配列による文字メソッドを使用する場合は、count()関数を使用して、バンド番号のカウントを文字リストに追加できます (バンドのない文字を非表示にすることもできます)。
于 2013-02-03T02:37:57.603 に答える