自定义PHP分页

时间:2011-09-13 12:32:06

标签: php pagination

我使用下面的代码执行“下一个”和“上一个”导航。它可以工作,但即使有一个条目,下一个按钮显示,当有超过20个条目时,一旦它们被提供,代码显示下一个和上一个。我怎样才能使下一个按钮只显示超过10个,如果没有更多的结果显示,我怎么不显示下一个和上一个按钮:

       if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) {

        $startrow = 0;

       } else {
       $startrow = (int)mysql_real_escape_string($_GET['pg']);
       }

       echo '<a id=pgnvg href=
      "'.$_SERVER['PHP_SELF'].'?pg='.($startrow+20).'&   q='.($what).'">Next</a>';


       $prev = $startrow - 20;

       //only print a "Previous" link if a "Next" was clicked
       if ($prev >= 0)
       echo '<a id=pgnvg2 href="'.$_SERVER['PHP_SELF'].'?pg='.$prev.'">Previous</a>';

3 个答案:

答案 0 :(得分:4)

您需要检查实际返回的项目数量,例如:

if($itemAmount > 20) {
echo '<a id=pgnvg href=
      "'.$_SERVER['PHP_SELF'].'?pg='.($startrow+20).'&   q='.($what).'">Next</a>';
}

否则下一个按钮将始终显示

答案 1 :(得分:2)

假设您有一个变量$itemsCount,其中包含记录集中的项目数。

如果您没有,可以使用

等查询进行计算
count(*) FROM <wathever table or join> WHERE <list of conditions>

此外,我会使用一个名为ITEMS_ON_A_PAGE的常量(希望你猜它的内容;)

define ('ITEMS_ON_A_PAGE',20); // put it where more appropriate

...

if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) {
    $startrow = 0;
} else {
   // no need to issue a mysql query, you need an integer from a numeric variable
   $startrow = (int)$_GET['pg'];
}

$linkTemplate = '<a id="%s" href="?%s">%s</a>';
$nextPageFirstItem = $startrow + ITEMS_ON_A_PAGE;
$previousPageFirstItem = $startrow - ITEMS_ON_A_PAGE;

if ($itemsCount> $nextPageFirstItem) {
    echo printf($linkTemplate,
            'pgnvg',
            http_build_query(array('pg'=>$nextPageFirstItem,'q'=>$what)),
            'Next'
    );
}

if ($previousPageFirstItem >= 0) {
   echo printf($linkTemplate,
            'pgnvg2',
            http_build_query(array('pg'=>$previousPageFirstItem,'q'=>$what)),
            'Previous'
   );
}

此处有为您创建查询的http_build_query的参考

将有很大的空间来改进此代码,但作为一个起点,它就足够了;)

答案 2 :(得分:-2)

您可能实际上想要使用switch语句。有时if语句在你有太多的时候停止工作而且有太多的评价是真的。只需注意您希望break;与不打破(不包括break;)。