Справка по нумерации страниц - PullRequest
0 голосов
/ 14 июня 2011

* РЕДАКТИРОВАТЬ ***

Я добился большого прогресса, объединив основной запрос, который извлекает радиоволны с некоторыми переменными из запроса разбивки на страницынаконец получил пагинацию на работу.Единственная проблема сейчас в том, что первая страница пуста, а вторая страница правильная, начиная с результата 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 ]

2 голосов
/ 14 июня 2011

Это лучший способ разбивки на страницы:

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

Это был бы самый быстрый способ управления разбиением на страницы.

Затем вы прошли бы по результатам первого запроса и отобразили бы его.Все, что вам нужно отслеживать, это то, на какой странице вы находитесь, и сколько строк показывать на странице.

Если вы номер страницы * $ rowperpage> результат второго выбора (FOUND_ROWS), то вы не делаете этого.необходимо рассчитать или показать опции / ссылки «следующих» страниц.

Для «следующих» страниц цикл 3 раза увеличивает номер страницы или следующей страницы * $ rowperpage> общее количество строк.

Для«предыдущие» страницы, цикл в 3 раза уменьшает номер страницы или предыдущая страница = 1 (в этом случае прерывание цикла).

Это должно сработать.

0 голосов
/ 14 июня 2011

Возможно, вы так много кодируете, что вам трудно прочитать то, что вы когда-то написали. Вы, кажется, помещаете комментарий рядом с каждой строкой кода, который может подчеркнуть это. Поэтому вам, вероятно, следует уменьшить код, чтобы уменьшить эту проблему.

Это просто предложение, вы написали:

        // 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

Все эти пункты, если вам нужно иметь дело! Все эти комментарии читать! Разве это не бремя?

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

Как насчет этого? Если у вас есть проблемы с его пониманием, вы можете поместить некоторые комментарии сверху, которые объясняют это так же, как вы делаете это в своем коде - вашими словами, если мои не подходят, это просто предложение.

...