sql >> データベース >  >> RDS >> Mysql

複雑なクエリ+ページネーションスクリプト

    これがどれだけ役立つかはわかりませんが、

    1.)$ uidはどこで定義されていますか?おそらくそれはそこにあり、あなたがたくさんのコードを持っていたので私はそれを逃しました。コントローラまたは他のタイプの仲介者ファイルで定義されている場合、ページを変更したときにuidが設定解除された可能性がありますか?

    2.)同じページネーションを複数回使用している場合は、それを関数に作成します。

    使用しているクエリを使用すると、得られた結果が正しいと思います。唯一の問題は、他のページに正しい結果が表示されなかったことです。その場合は、私が微調整したこの関数を使用してください。 (自分で微調整する必要があるかもしれません。たとえば、私のページのようにdomain.com/pg=3を読み取れない場合があります)

    function Pagination($list, $limit){
    
    global $pagination;
    global $total_pages;
    global $pg;
    global $offset;
    global $page_limit;
    $page_limit = $limit;
    global $total_results;
    $total_results = $list;
    
    global $offset;
    
    // number of rows to show per page
    // find out total pages
    $total_pages = ceil($list / $limit);
    
    // get the current page or set a default
    if ($pagination) {
       // cast var as int
       $pg = $pagination;
    } else {
       // default page num
       $pg = 1;
    } // end if
    
    // if current page is greater than total pages...
    if ($pg > $total_pages || $pg == "last") {
       // set current page to last page
       $pg = $total_pages;
    } // end if
    // if current page is less than first page...
    if ($pg <= 1 || $pg == "first") {
       // set current page to first page
       $pg = 1;
    } // end if
    
    // the offset of the list, based on current page 
    $offset = ($pg - 1) * $limit;
    
    // get the info from the db 
    }
    
    
    function PaginationLinks($url, $tab){
    
    global $pg;
    global $total_pages;
    global $total_results;
    global $page_limit;
    global $offset;
    
    
    $displayed_results = ($total_results - $offset);
    
    if($displayed_results >= $page_limit && $total_results > $page_limit){
    $displayed_results = $page_limit;
    }
    
    
    
    
    /******  build the pagination links ******/
    // range of num links to show
    $range = 5;
    
    if($tab){
    $tab = "?$tab";
    }
    
    // if not on page 1, don't show back links
    if ($pg > 1) {
       // show << link to go back to page 1
       echo "<li class='pagination'><a href='$url/pg=first$tab'><<</a></li>";
       // get previous page num
       $prevpage = $pg - 1;
       // show < link to go back to 1 page
       echo "<li class='pagination'><a href='$url/pg=$prevpage$tab'><</a></li>";
    } // end if 
    
    // loop to show links to range of pages around current page
    for ($x = ($pg - $range); $x < (($pg + $range) + 1); $x++) {
       // if it's a valid page number...
       if (($x > 0) && ($x <= $total_pages)) {
          // if we're on current page...
          if ($x == $pg) {
             // 'highlight' it but don't make a link
             echo "<li class='current_page'>$x</li>";
          // if not current page...
          } else {
             // make it a link
             echo "<li class='pagination'><a href='$url/pg=$x$tab'>$x</a></li>";
          } // end else
       } // end if 
    } // end for
    
    // if not on last page, show forward and last page links        
    if ($pg != $total_pages) {
       // get next page
       $nextpage = $pg + 1;
        // echo forward link for next page 
       echo "<li class='pagination'><a href='$url/pg=$nextpage$tab'>></a></li>";
       // echo forward link for lastpage
       echo "<li class='pagination'><a href='$url/pg=last$tab'>>></a></li>";
    } // end if
    /****** end build pagination links ******/
    
    echo "<div style='float:right; align: right; margin-top: 10px'>Displaying <font class='f2'>$displayed_results</font> of <font class='f2'>$total_results</font> results</div>";
    } // end pagination links function
    

    使用するには: (単純なため、基本的な「ユーザー」テーブルを使用しています)

    1つのクエリを記述して、探しているものの合計行数を取得します。例:

    $getusers = mysql_query("SELECT * FROM users", $conn);
    $total_users = mysql_num_rows($getusers)
    
    $display_limit = "20" // display 20 users per page
    

    次に、最初の関数を使用します。

    Pagination($total_users, $display_limit);
    

    次にクエリを再度実行しますが、今回は制限を設定して、ページごとに20人のユーザーのみが表示されるようにします。

    $getusers = mysql_query("SELECT * FROM users ORDER BY id DESC LIMIT $offset, $display_limit", $conn);
    
    if($total_users == 0){
    echo "There are no users at this time.";
    }
    else {
    
    // for each user
    while ($rowuserss = mysql_fetch_assoc($getusers)) {
       // echo data
    
    $user_id = $rowusers['id'];
    $username = $rowusers['username'];
    
    // etc etc
    }
    

    次に、リンクを表示するには、2番目のクエリを使用します

    PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab);
    

    これは、クエリが最初から正しい限り、どんなに複雑であっても、どのクエリでも機能するはずです。あなたの質問は正しかったように私には聞こえました、ちょうど結果が2ページ目に表示されていました。いずれにせよ、その関数が機能しない場合でも、独自の関数にページネーションを作成する必要があります。これは、複数の場所に書き出すにはコードが多すぎます。




    1. 排他的論理和またはmysqlでの使用

    2. LOAD_FILE()がMariaDBでどのように機能するか

    3. トレースフラグ2389と新しいカーディナリティ推定量

    4. 大きなテーブルでのSQLServerクエリのパフォーマンスを向上させる