【问题标题】:Limit pagination page number限制分页页码
【发布时间】:2012-01-11 19:20:29
【问题描述】:
$objConnect = mysql_connect("localhost","root","") or die(mysql_error());
$objDB = mysql_select_db("Test");

$strSQL = "SELECT * FROM UserAddedRecord WHERE (Name LIKE '%".$getname."%' and State LIKE '%".$getstate."%' and Cell LIKE '%".$getcell."%' and Custgroup LIKE '%".$getgroup."%') AND user_id=$id";

$objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
$Num_Rows = mysql_num_rows($objQuery);

$Per_Page = 5;   

if (!isset($_GET['Page'])) {
    $Page = 1;
} else {
    $Page = $_GET['Page'];
}

$Prev_Page = $Page - 1;
$Next_Page = $Page + 1;

$Page_Start = (($Per_Page * $Page) - $Per_Page);
if ($Num_Rows <= $Per_Page) {
    $Num_Pages = 1;
} elseif (($Num_Rows % $Per_Page) == 0) {
    $Num_Pages = ($Num_Rows / $Per_Page) ;
} else {
    $Num_Pages = ($Num_Rows / $Per_Page) + 1;
    $Num_Pages = (int) $Num_Pages;
}


$strSQL .=" order  by addedrec_ID DESC LIMIT $Page_Start , $Per_Page";
$objQuery  = mysql_query($strSQL) or trigger_error(mysql_error());;

if ($Prev_Page) {
    echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$Prev_Page&txtName=$getname&txtState=$getstate&txtCell=$getcell&txtGroup=$getgroup'><< Back</a> ";
}

for ($i=1; $i <= $Num_Pages; $i++) {
    if ($i != $Page) {
        echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$i&txtName=$getname&txtState=$getstate&txtCell=$getcell&txtGroup=$getgroup'>$i</a> ";
    } else {
        echo "<b> $i </b>"; 
    }
}

if ($Page!=$Num_Pages) {
    echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=$Next_Page&txtName=$getname&txtState=$getstate&txtCell=$getcell&txtGroup=$getgroup'>Next>></a> ";        
}

mysql_close($objConnect);

这是我用来为数据搜索创建分页页面的代码。但我只是注意到我有太多的记录,那么它就会有太多的页码。我正在尝试限制显示的页码,并寻找很多例子..它有很多方法可以做到,但我仍然不知道如何限制我的方法......

【问题讨论】:

    标签: php mysql sql pagination paging


    【解决方案1】:

    好吧,如果你的意思是显示类似的东西

    Prev 1 2 3 4 5 6 .. 40 41 Next 
    Prev 1 2 .. 6 7 8 9 10 .. 40 41 Next
    

    首先我们需要创建一个函数来处理我们需要输出分页的内容。这是我使用的一个功能,效果很好。

    function get_paging_info($tot_rows,$pp,$curr_page)
    {
        $pages = ceil($tot_rows / $pp); // calc pages
    
        $data = array(); // start out array
        $data['si']        = ($curr_page * $pp) - $pp; // what row to start at
        $data['pages']     = $pages;                   // add the pages
        $data['curr_page'] = $curr_page;               // Whats the current page
    
        return $data; //return the paging data
    
    }
    

    现在这个功能非常可靠,对我来说效果很好。

    所以你传递了这个函数

    • $tot_rows = 计算的查询行数
    • $pp = 每页项目数
    • $curr_page = 当前页码

    好的,现在您有了所需的数据,您需要显示它。

    这是我使用的内容,请在您思考“啊,太长了”之前先阅读它。其实很简单。

    这是它将返回的快照

        <!-- Create the query -->
        <?php $count = mysql_fetch_assoc( mysql_query ( "SELECT COUNT( rows ) as count FROM table" ) ) ;
    
        <?php $count = $count[0]['count']; ?>
    
    <!-- Call our function from above -->
    <?php $paging_info = get_paging_info($count,5,34); ?>
    
    
    <p>
        <!-- If the current page is more than 1, show the First and Previous links -->
        <?php if($paging_info['curr_page'] > 1) : ?>
            <a href='' title='Page 1'>First</a>
            <a href='' title='Page <?php echo ($paging_info['curr_page'] - 1); ?>'>Prev</a>
        <?php endif; ?>
    
    
    
        <?php
            //setup starting point
    
            //$max is equal to number of links shown
            $max = 7;
            if($paging_info['curr_page'] < $max)
                $sp = 1;
            elseif($paging_info['curr_page'] >= ($paging_info['pages'] - floor($max / 2)) )
                $sp = $paging_info['pages'] - $max + 1;
            elseif($paging_info['curr_page'] >= $max)
                $sp = $paging_info['curr_page']  - floor($max/2);
        ?>
    
        <!-- If the current page >= $max then show link to 1st page -->
        <?php if($paging_info['curr_page'] >= $max) : ?>
    
            <a href='' title='Page 1'>1</a>
            ..
    
        <?php endif; ?>
    
        <!-- Loop though max number of pages shown and show links either side equal to $max / 2 -->
        <?php for($i = $sp; $i <= ($sp + $max -1);$i++) : ?>
    
            <?php
                if($i > $paging_info['pages'])
                    continue;
            ?>
    
            <?php if($paging_info['curr_page'] == $i) : ?>
    
                <span class='bold'><?php echo $i; ?></span>
    
            <?php else : ?>
    
                <a href='' title='Page <?php echo $i; ?>'><?php echo $i; ?></a>
    
            <?php endif; ?>
    
        <?php endfor; ?>
    
    
        <!-- If the current page is less than say the last page minus $max pages divided by 2-->
        <?php if($paging_info['curr_page'] < ($paging_info['pages'] - floor($max / 2))) : ?>
    
            ..
            <a href='' title='Page <?php echo $paging_info['pages']; ?>'><?php echo $paging_info['pages']; ?></a>
    
        <?php endif; ?>
    
        <!-- Show last two pages if we're not near them -->
        <?php if($paging_info['curr_page'] < $paging_info['pages']) : ?>
    
            <a href='<?php echo str_replace('/page'.$paging_info['curr_page'], '', $paging_info['curr_url']) . '/page'.($paging_info['curr_page'] + 1); ?>' title='Page <?php echo ($paging_info['curr_page'] + 1); ?>'>Next</a>
    
            <a href='<?php echo str_replace('/page'.$paging_info['curr_page'], '', $paging_info['curr_url']) . '/page'.$paging_info['pages']; ?>' title='Page <?php echo $paging_info['pages']; ?>'>Last</a>
    
        <?php endif; ?>
    </p>
    

    【讨论】:

    • 非常感谢您的示例和所有说明,我现在正在努力理解和学习它。
    • 很高兴为您提供帮助。显然,我刚刚从我的代码中获取了这个并对其进行了一些修改,但结构已经存在,供您使用。
    • 这种页面导航的问题是很难到达“...”范围中间的页面(至少通过单击)。您可以考虑使用我在this question 中描述的方法,即使有数千个页面,也可以通过几次鼠标点击轻松访问任何页面。
    • 这对我来说是一个很好的基础,谢谢!一些小调整让我得到了我想成为的地方。
    • curr_url 的用户是什么以及我们在函数中传递它的位置?
    【解决方案2】:

    $count_pages = ceil($total / $items_per_page);

    【讨论】:

      【解决方案3】:

      我在这里用非常相似的脚本为其他人解决了一个非常相似的问题:How to limit pages shown in pagination script

      此外,我注意到您的脚本还有一些其他异常(除了我修复的不可读格式)。您应该将所有出现的$_SERVER[SCRIPT_NAME] 更改为$_SERVER['SCRIPT_NAME']。例如,在您的脚本中:

      echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=...";
      

      会变成:

      echo " <a href ='{$_SERVER['SCRIPT_NAME']}?Page=...";
      

      【讨论】:

        【解决方案4】:

        简单点,代码如下:

        <?php       
            //put this code on the begining of the page
            $page=$_GET['page']; //Getting page number from url | example: www.mydomain.com/index.php?page=3
            if(!is_numeric($page)) $page=1; //If there is no page number specified we set number 1
        $queryCount = "SELECT * FROM table "; //select from db
        $query = $DB->query( $queryCount);
            $num = mysql_num_rows ($query); //count num rows
            $per_page=5; //default 5 results per page
        $start=$per_page*($page-1); //start for select on next page (page2, 3, 4,5)
        $end=min($num,$page*$per_page); //end
        
        
        //here is select for your results. Be careful for LIMIT in the select!
        $query = "SELECT * FROM page LIMIT $start, $per_page ";
        
        
        //page bottom, where you want to put your numbers
        $pages=ceil($num/$per_page);
          for($s=1; $s<=$pages; $s++)
          {
            if($s==$page)
              $numPage  .= "[$s] ";
            else
              $numPage  .= "<a href='index.php?page=$s'>$s</a> ";
          }
        
        echo $numPage;
        

        ?>

        我没有测试它,但我认为它必须工作:-)

        问候,伊万

        【讨论】:

        • 代码有效,但这只是简单地打印所有页码。问题是将页码限制为例如 10 页码。如果用户在第 12 页,那么它应该显示例如 10 到 20 等。
        【解决方案5】:

        我的代码总是显示至少 9 页,以防总页数>9 无论您在第 1、2、3 页上是什么

        <ul class="pagination pagination-sm" style="align:center">
            <li><a href="./?page=1"><</span></a></li>
            <?php
            if ($current_page <4){
                if ($total_pages<9)
                {
                    for($i = 1; $i <=  $total_pages; $i++)
                    {
        
                        if ($i == $current_page)
                        {
                            echo '<li class="active"><a href="#">'; echo $i.'</a></li>'."\n";
                        } else {
                            echo ' <li><a href="./?page='.$i.'">'; echo $i.'</a></li>'."\n";
                        }
                    }
                }
                else
                {
                    for($i = 1; $i <=  9; $i++)
                    {
        
                        if ($i == $current_page)
                        {
                            echo '<li class="active"><a href="#">'; echo $i.'</a></li>'."\n";
                        } else {
                            echo ' <li><a href="./?trang='.$i.'">'; echo $i.'</a></li>'."\n";
                        }
                    }
                }
            }
            elseif ($current_page >$total_pages-4)
            {
                if ($total_pages<9)
                {
                    for($i = 1; $i <=  $total_pages; $i++){
        
                        if ($i == $current_page){
                            echo '<li class="active"><a href="#">'; echo $i.'</a></li>'."\n";
                        } else {
                            echo ' <li><a href="./?page='.$i.'">'; echo $i.'</a></li>'."\n";
                        }
                    }
                }else{
                    for($i = $total_pages-8; $i <=  $total_pages; $i++){
        
                        if ($i == $current_page){
                            echo '<li class="active"><a href="#">'; echo $i.'</a></li>'."\n";
                        } else {
                            echo ' <li><a href="./?page='.$i.'">'; echo $i.'</a></li>'."\n";
                        }
                    }
                }
        
            }else{
                for($i = max(1, $current_page - 4); $i <= min($current_page + 4, $total_pages); $i++){
        
                    if ($i == $current_page){
                        echo '<li class="active"><a href="#">'; echo $i.'</a></li>'."\n";
                    } else {
                        echo ' <li><a href="./?trang='.$i.'">'; echo $i.'</a></li>'."\n";
                    }
                }
            }
            ?>
            <li>
                <a href="./?trang=<?php echo $total_pages ?>">></a>
            </li>
        </ul>
        

        【讨论】:

          【解决方案6】:

          您需要在 sql 语句中使用 LIMIT 子句。例如:

          SELECT <column> 
            FROM <table>
              LIMIT 0, 5
          

          参考:SELECT Syntax

          【讨论】:

          • 感谢您的回复。是这一行吗?$strSQL .=" order by addedrec_ID DESC LIMIT $Page_Start , $Per_Page";
          【解决方案7】:

          此代码的目的只是显示分页中确定的(特定)页数

          从url获取当前页码并定义$curr_pg_numb

          从mysql获取总页数并定义$total_pages

          这是分页的代码

          $counter=0;
          $init_num_to_left = 3;//initial number of pages to show to left from current page
          $init_num_to_right = 4;
          
          if( $curr_pg_numb - $init_num_to_left < 1 ){
          $init_num_to_right = $init_num_to_right + ( 1 - ($curr_pg_numb - $init_num_to_left) );
          $init_num_to_left = $curr_pg_numb - 1;
          }
          else if( $curr_pg_numb + $init_num_to_right > $total_pages ){
          $init_num_to_left = $init_num_to_left + ( ($curr_pg_numb + $init_num_to_right) - $total_pages );
          $init_num_to_right = ($curr_pg_numb + $init_num_to_right) - $total_pages;
          }
          
          while($counter <= $total_pages ) {
            if ( $counter > 0 ){
              if ($curr_pg_numb==$counter){
              echo '<strong> '. ( htmlspecialchars($curr_pg_numb , ENT_QUOTES, "UTF-8") + 0 ). '</strong> ';
              }
              else {
              if ( $counter >= ($curr_pg_numb - $init_num_to_left ) and $counter <= ($curr_pg_numb + $init_num_to_right ) ) {
              echo '<a href="?cpn='. htmlspecialchars(($counter), ENT_QUOTES, "UTF-8"). '" style="margin:5px;">'. htmlspecialchars(($counter), ENT_QUOTES, "UTF-8"). '</a>';
              }
              }//else {
            }//if ( $counter > 0 ){
          $counter++;
          }//while($counter <= $total_pages ) {
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-25
            • 2013-05-04
            • 1970-01-01
            • 1970-01-01
            • 2021-10-17
            • 1970-01-01
            相关资源
            最近更新 更多