【问题标题】:Limit Pagination Numbers For Huge Databases限制大型数据库的分页数
【发布时间】:2014-08-27 09:43:34
【问题描述】:

无论如何我似乎都找不到答案,所以我想我至少需要问一下,无论如何我确实尝试过 google 我正在制作一个类似于 facebook 的群组功能,但效果不佳,因为我是唯一的一个开发这个,但随着时间的推移它会变得更好。

无论如何, 如何使此代码限制分页数?例如,如果数据库中有大量结果,我只想在使用点之后显示前 10 个结果,以便他们可以单击并更深入地了解,所以当单击点时,他们会得到另外 10 个结果,所以 20然后 -30 将显示为分页。我不需要完全像这样,而是需要某种方式来限制一次显示的数字数量。

这里是代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<style type="text/css">
#content
{
    width: 900px;
    margin: 0 auto;
    font-family:Arial, Helvetica, sans-serif;
}
.page
{
float: right;
margin: 0;
padding: 0;
}
.page li
{
    list-style: none;
    display:inline-block;
}
.page li a, .current
{
display: block;
padding: 5px;
text-decoration: none;
color: #8A8A8A;
}
.current
{
    font-weight:bold;
    color: #000;
}
.button
{
padding: 5px 15px;
text-decoration: none;
background: #333;
color: #F3F3F3;
font-size: 13PX;
border-radius: 2PX;
margin: 0 4PX;
display: block;
float: left;
}
</style>


</head>
<body>
<div id="content">
<?php
error_reporting(0);
$query1=mysql_connect("localhost","root","");
mysql_select_db("freeze_demo",$query1);
error_reporting(0);
$start=0;
$limit=1;

if(isset($_GET['id']))
{
    $id=$_GET['id'];
    $start=($id-1)*$limit;
}

$query=mysql_query("select * from pagination LIMIT $start, $limit");
echo "<ul>";
while($query2=mysql_fetch_array($query))
{
    echo "<li>".$query2['text1']."</li>";
}
echo "</ul>";


$rows=mysql_num_rows(mysql_query("select * from pagination"));
$total=ceil($rows/$limit);

if($id>1)
{
    echo "<a href='?id=".($id-1)."' class='button'>PREVIOUS</a>";
}
if($id!=$total)
{
    echo "<a href='?id=".($id+1)."' class='button'>NEXT</a>";
}

echo "<ul class='page'>";
        for($i=1;$i<=$total;$i++)
        {

            if($i==$id) { echo "<li class='current'>".$i."</li>"; }

            else { echo "<li><a href='?id=".$i."'>".$i."</a></li>"; }
        }
echo "</ul>";
?>
</div>
</body>
</html>

当我的数据库或某个组变得更大时,基本上需要更新它。

谢谢

【问题讨论】:

  • 有时我想显示的分页数限制可能很难解释这个问题,如果你有 100 个分页数显示,它会变得很乱
  • 修复了 sql 错误 ;)

标签: php mysql database pagination limit


【解决方案1】:
<?php 
function custom_pagination($page, $totalpage, $link, $show)  //$link = '&page=%s' 
{ 
    //show page 
if($totalpage == 0) 
{ 
return 'Page 0 of 0'; 
} else { 
    $nav_page = '<div class="navpage"><span class="current">Page '.$page.' of '.$totalpage.': </span>'; 
    $limit_nav = 3; 
    $start = ($page - $limit_nav <= 0) ? 1 : $page - $limit_nav; 
    $end = $page + $limit_nav > $totalpage ? $totalpage : $page + $limit_nav; 
    if($page + $limit_nav >= $totalpage && $totalpage > $limit_nav * 2){ 
        $start = $totalpage - $limit_nav * 2; 
    } 
    if($start != 1){ //show first page 
        $nav_page .= '<span class="item"><a href="'.sprintf($link, 1).'"> [1] </a></span>'; 
    } 
    if($start > 2){ //add ... 
        $nav_page .= '<span class="current">...</span>'; 
    } 
    if($page > 5){ //add prev 
        $nav_page .= '<span class="item"><a href="'.sprintf($link, $page-5).'">&laquo;</a></span>'; 
    } 
    for($i = $start; $i <= $end; $i++){ 
        if($page == $i) 
            $nav_page .= '<span class="current">'.$i.'</span>'; 
        else 
            $nav_page .= '<span class="item"><a href="'.sprintf($link, $i).'"> ['.$i.'] </a></span>'; 
    } 
    if($page + 3 < $totalpage){ //add next 
        $nav_page .= '<span class="item"><a href="'.sprintf($link, $page+4).'">&raquo;</a></span>'; 
    } 
    if($end + 1 < $totalpage){ //add ... 
        $nav_page .= '<span class="current">...</span>'; 
    }     
    if($end != $totalpage) //show last page 
        $nav_page .= '<span class="item"><a href="'.sprintf($link, $totalpage).'"> ['.$totalpage.'] </a></span>'; 
    $nav_page .= '</div>'; 
    return $nav_page; 
} 
} 


//using
if(isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = 1;
}
$sql = "SELECT count(*) AS total FROM post ORDER BY idpost DESC"; //please select COUNT is fast
$result = mysql_query($sql);
$rows = mysql_fetch_array($result);
$show = 5; //Show 5 result per page
$totalpage = ceil($rows['total'] / $show); //Total page
$start = ($page * $show) - $show; //Start result

$yourQuery = "SELECT * FROM post ORDER BY id LIMIT $start, $show";
//Query and show here

//Show pagination
echo custom_pagination($page, $totalpage, 'index.php?action=detail&page=%s', $show);

?>

【讨论】:

  • 到目前为止谢谢 :) 这段代码正在输出一个 sql 数组错误,但除此之外它看起来会起作用,所以希望你能看到它,但我会尽力修复它
【解决方案2】:

鉴于 $id 是一个页码(也许将其重构为 $page 以便它识别为页码,而不是特定记录的唯一 id),您可以将最终的 for 循环更改为更严格。

例如,不是从 1 开始,而是从当前页之前的 5 页开始。而不是在$total 结束,而是在当前页之后的 5 页结束。

$start = $id - 5.
if ($start < 1) {
    $start = 1;
}
$end = $id + 5;
if ($end > $total) {
    $end = $total;
}

for ($i = $start; $i <= $end; $i++) {
    // echo pagination options
}

您也可以修改它以提供链接,让您更接近您想去的地方(即,如果显示第 20 到 30 页,共 100 页,显示第 10、40、50 和 60 页的链接,甚至提供一个输入框,让您跳转到特定页面。

【讨论】:

  • 谢谢,这是另一个好主意:D
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多