分页帮助

时间:2011-06-13 23:14:46

标签: php pagination organization

*编辑***

我通过将拉出广播的主要查询与分页查询中的一些变量结合起来并最终使分页工作,取得了很大的进步。现在唯一的问题是第一页是空白的,第二页是正确的,从结果41-80

开始

这是限制和拉动电波的查询

        $rowsperpage = 40;
        $currentpage = (int) $_GET['currentpage'];
        $offset = ($currentpage - 1) * $rowsperpage;
        $query = "SELECT * FROM `CysticAirwaves` WHERE `FromUserID` = `ToUserID` AND `status` = 'active' ORDER BY `date` DESC, `time` DESC LIMIT $offset, $rowsperpage" ;
        $request = mysql_query($query,$connection);
        $counter = 0;
        while($result = mysql_fetch_array($request)) {

这是分页代码:

$query = "SELECT COUNT(*) FROM `CysticAirwaves`";
                        $result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
                        $r = mysql_fetch_row($result);
                        $numrows = $r[0];

                        // number of rows to show per page
                        $rowsperpage = 40;
                        // find out total pages
                        $totalpages = ceil($numrows / $rowsperpage);

                        // get the current page or set a default
                        if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) {
                           // cast var as int
                           $currentpage = (int) $_GET['currentpage'];
                        } else {
                           // default page num
                           $currentpage = 1;
                        } // end if

                        // if current page is greater than total pages...
                        if ($currentpage > $totalpages) {
                           // set current page to last page
                           $currentpage = $totalpages;
                        } // end if
                        // if current page is less than first page...
                        if ($currentpage < 1) {
                           // set current page to first page
                           $currentpage = 1;
                        } // end if

                        // the offset of the list, based on current page 
                        $offset = ($currentpage - 1) * $rowsperpage;

                        // get the info from the db 
                        $query2 = "SELECT `id` FROM `CysticAirwaves` LIMIT $offset, $rowsperpage";
                        $result = mysql_query($query2, $connection) or trigger_error("SQL", E_USER_ERROR);

                        // while there are rows to be fetched...
                        while ($list = mysql_fetch_assoc($result)) {
                           // echo data
                           echo $list['id'] . " : " . $list['number'] . "<br />";
                        } // end while

                        /******  build the pagination links ******/
                        // range of num links to show
                        $range = 3;

                        // if not on page 1, don't show back links
                        if ($currentpage > 1) {
                           // show << link to go back to page 1
                           echo " <a href='http://www.cysticlife.org/Airwave_build.php?currentpage=1'><<</a> ";
                           // get previous page num
                           $prevpage = $currentpage - 1;
                           // show < link to go back to 1 page
                           echo " <a href='http://www.cysticlife.org/Airwave_build.php?currentpage=$prevpage'><</a> ";
                        } // end if 

                        // loop to show links to range of pages around current page
                        for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) {
                           // if it's a valid page number...
                           if (($x > 0) && ($x <= $totalpages)) {
                              // if we're on current page...
                              if ($x == $currentpage) {
                                 // 'highlight' it but don't make a link
                                 echo " [<b>$x</b>] ";
                              // if not current page...
                              } else {
                                 // make it a link
                                 echo " <a href='http://www.cysticlife.org/Airwave_build.php?currentpage=$x'>$x</a> ";
                              } // end else
                           } // end if 
                        } // end for

                        // if not on last page, show forward and last page links        
                        if ($currentpage != $totalpages) {
                           // get next page
                           $nextpage = $currentpage + 1;
                            // echo forward link for next page 
                           echo " <a href='http://www.cysticlife.org/Airwave_build.php?currentpage=$nextpage'>></a> ";
                           // echo forward link for lastpage
                           echo " <a href='http://www.cysticlife.org/Airwave_build.php?currentpage=$totalpages'>>></a> ";
                        } // end if
                        /****** end build pagination links ******/
                        ?>

这么长的故事简短,我只是无法提取前40个结果,但在此之后它很好

2 个答案:

答案 0 :(得分:2)

这是一种更好的分页方式:

SELECT SQL_CALC_FOUND_ROWS id FROM `CysticAirwaves` LIMIT $offset, $rowsperpage

使用上面的示例查询选择要显示的数据,该查询将返回与 query2

相同的结果

然后执行另一个SQL查询:

SELECT FOUND_ROWS()

这将返回未使用限制而找到的行数。点击此处了解更多信息:

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

这将是管理分页的最快方式。

然后,您将遍历第一个查询的结果并显示。您需要跟踪的是您所在的页面以及每页显示的行数。

如果你的页码是* $ rowsperpage&gt;第二个选择(FOUND_ROWS)的结果,那么您不需要计算或显示'下一页'选项/链接。

对于“下一页”页面,循环3次递增页码或下一页* $ rowsperpage&gt;总行数。

对于“之前的”页面,循环3次递减页码或前一页= 1(在这种情况下突破循环)。

这应该可以解决问题。

答案 1 :(得分:0)

你可能编写的代码很多,很难读懂你曾经写过的东西。您似乎在每行代码旁边放置了注释,这可能会强调这一点。所以你可能应该减少代码来减少这个问题。

这只是一个建议,你写道:

        // if current page is greater than total pages...
        if ($currentpage > $totalpages) {
           // set current page to last page
           $currentpage = $totalpages;
        } // end if
        // if current page is less than first page...
        if ($currentpage < 1) {
           // set current page to first page
           $currentpage = 1;
        } // end if

所有这些if条款你需要处理!所有这些评论都要阅读!这不是负担吗?

        // currentpage must be within 1 and total of pages.
        $currentpage = max(1,min($totalpages, $currentpage));

怎么样?如果你有理解它的问题,你可以在顶部发表一些评论,就像你在代码中那样解释它 - 如果我的话不合适,那就是你的建议。