2017-04-06 38 views
0

我正在使用下面给出的这个分页脚本。问题是它给了页面的连续计数。举例来说,如果有10个页面,它会给出数字1 2 3 4 5 6 7 8 9 10(全部可点击各个页面)。我想要的是在5之后打破分页计数。它应该显示1 2 3 4 5.......9 10。然后,当我点击第5页时,它应该隐藏1并显示为2 3 4 5 6....9 10。请帮帮我。打破分页页数

$start = 0; 
$limit = 1; 

if(isset($_GET['id'])){ 
    $id = (!empty($_GET['id']))?$_GET['id']:null; 
    $start = ($id-1)*$limit; 
}else{ 
    $id = null; 
} 

$stmt = $pdo->prepare("SELECT ad_id, ad_description, ad_url, ad_memclicks, ad_visclicks, ad_status, avc_clicks FROM ads 
         LEFT JOIN ads_viewed_cost ON ads.ad_clicks = ads_viewed_cost.avc_id 
         WHERE ad_user = :user LIMIT $start, $limit"); 
$stmt-> bindValue(':user', $sessionid); 
$stmt-> execute(); 

$count = $pdo->prepare("SELECT COUNT(*) as cnt FROM ads LEFT JOIN ads_viewed_cost ON ads.ad_clicks = ads_viewed_cost.avc_id WHERE ad_user = :user"); 
$count-> bindValue(':user', $sessionid); 
$count-> execute(); 
$rf = $count->fetch(); 
$rows = $rf['cnt']; 
$total = ceil($rows/$limit); 

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

echo "<ul class='pagination'>"; 
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>"; 

回答

1

我不认为你所描述的是当你丢失第一页时做分页的最好方法,但这就是你所要求的。

$dots = false; 
for ($i=1; $i<=$total; $i++) { 
    if($i == $id) { 
     echo "<li class='current'>{$i}</li>"; 
    } else { 
     if (($id < 5 && $i < 5) || (($i > $id-4 && $i < $id) || $i > $total-2 || $i == $id+1)) { 
      echo "<li><a href='?id=".$i."'>{$i}</a></li>"; 
     } else { 
      if ($i > $id && !$dots) { 
       echo "..."; 
       $dots = true; 
      } 
     } 
    } 
} 

如果当前$id小于5,则显示首页。之后,它会显示当前页面,三个之前和之后一个(所以当id = 5时,您会看到2,3,4,5,6)。

如果当前页面+1和最后两页之间存在间隙,但只显示一次(布尔值是什么),则显示点。

最后两页始终显示。

使用较大的页面集(高达100)进行测试,并按预期工作。


更常见的方式做分页,因为StackOverflow的本身并没有它,就当你是极端之外,你在第一页显示,圆点,当前页面和一对夫妇任何一方,点和最后页。

1 ... 12 13 [14] 15 16 ... 100

没有第一页锚,与已经提供给你什么,我在这里,它可能需要点击的LOT回到第一页,设置一个大页面。

要实现此方法,您可以改用此代码。更改在if逻辑中,第二个布尔值处理两组点。

$dotsLow = false; 
$dotsHi = false; 
for ($i=1; $i<=$total; $i++) { 
    if($i == $id) { 
     echo "<li class='current'>{$i}</li>"; 
    } else { 
     if (
      ($i == 1 || $i == $total) || 
      ($id < 5 && $i < 5) || 
      ($id > $total-4 && $i > $total-4) || 
      ($i >= $id-2 && $i <= $id+2) 
     ) { 
      echo "<li><a href='?id=".$i."'>{$i}</a></li>"; 
     } else { 
      if ($i > $id && !$dotsHi) { 
       echo "..."; 
       $dotsHi = true; 
      } 
      if ($i < $id && !$dotsLow) { 
       echo "..."; 
       $dotsLow = true; 
      } 
     } 
    } 
} 
+0

我的错好抱歉..你是对的。我想要去的第二个方法..但是,当我换成我的代码,三个点的最后一个号码后只来了,不是你在上面的例子中给出了'1 ... 12 13 [14] 15 16 ... 100' ..只有我得到的点不在正确的位置,否则代码正如你所说的那样工作。 –

+0

对于什么页面'$ id'?这两个点集只会出现在第10页的第5页和第6页。 – domwrap

+0

没有它没有出现在你提到的地方..它出现在最后一个数字之后,不管我在哪个页面..但是谢谢你的解决方案..除了点东西我得到了我想要的休息......谢谢:) –