PHP pagination - проблема с отображением корректного контента на дополнительных страницах

0

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

Любые идеи будут высоко оценены

<?php
        //Include the PS_Pagination class
        include('includes/ps_pagination.php');

        //Connect to mysql db
        $conn = mysql_connect("localhost", "root", "root");
        mysql_select_db('database',$conn);
        $sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}'";
        //Create a PS_Pagination object
        $pager = new PS_Pagination($conn,$sql,4,5);
        //The paginate() function returns a mysql
        //result set for the current page
        $rs = $pager->paginate();
        //Loop through the result set
        while($row = mysql_fetch_assoc($rs)) {

    $a=0;
    while ($a < $num) {

    $id=mysql_result($result,$a,"id");
    $title=mysql_result($result,$a,"title");
    $strategies=mysql_result($result,$a,"strategies");
    $client=mysql_result($result,$a,"client");
    $copy=mysql_result($result,$a,"copy");
    $thumbmedia=mysql_result($result,$a,"thumbmedia");
    $niche=mysql_result($result,$a,"niche");


    echo '<div class="container"><p class="subheadred"><a href="casestudy.php?id='.$id.'">'.$title.'</a></p></div>';

    echo '<div class="containerstudy"><div class="column1"><p class="subheadsmall">Strategies</p><p class="sidebarred">'.$strategies.'</p>';

    echo '<p class="subheadsmall">Client</p><p class="sidebargrey">'.$client.'</p></div>';

    echo '<div class="column2"><p class="bodygrey">'.substr($copy, 0, 300).'<a href="casestudy.php?id='.$id.'">...more</a></p></div>';

    echo '<div class="column3"><img src="images/'.$thumbmedia.'" height="160" /></div></div>';

    $a++;
    }

        }
        //Display the navigation
        echo $pager->renderNav();
    ?>

Это включенный файл:

<?php
/**
 * PHPSense Pagination Class
 *
 * PHP tutorials and scripts
 *
 * @package     PHPSense
 * @author      Jatinder Singh Thind
 * @copyright   Copyright (c) 2006, Jatinder Singh Thind
 * @link        http://www.phpsense.com
 */

// ------------------------------------------------------------------------

class PS_Pagination {
    var $php_self;
    var $rows_per_page; //Number of records to display per page
    var $total_rows; //Total number of rows returned by the query
    var $links_per_page; //Number of links to display per page
    var $sql;
    var $debug = false;
    var $conn;
    var $page;
    var $max_pages;
    var $offset;

    /**
     * Constructor
     *
     * @param resource $connection Mysql connection link
     * @param string $sql SQL query to paginate. Example : SELECT * FROM users
     * @param integer $rows_per_page Number of records to display per page. Defaults to 10
     * @param integer $links_per_page Number of links to display per page. Defaults to 5
     */

    function PS_Pagination($connection, $sql, $rows_per_page = 1, $links_per_page = 5) {
        $this->conn = $connection;
        $this->sql = $sql;
        $this->rows_per_page = $rows_per_page;
        $this->links_per_page = $links_per_page;
        $this->php_self = htmlspecialchars($_SERVER['PHP_SELF']);
        if(isset($_GET['page'])) {
            $this->page = intval($_GET['page']);
        }
    }

    /**
     * Executes the SQL query and initializes internal variables
     *
     * @access public
     * @return resource
     */
    function paginate() {
        if(!$this->conn) {
            if($this->debug) echo "MySQL connection missing<br />";
            return false;
        }

        $all_rs = @mysql_query($this->sql);
        if(!$all_rs) {
            if($this->debug) echo "SQL query failed. Check your query.<br />";
            return false;
        }
        $this->total_rows = mysql_num_rows($all_rs);
        @mysql_close($all_rs);

        $this->max_pages = ceil($this->total_rows/$this->rows_per_page);
        //Check the page value just in case someone is trying to input an aribitrary value
        if($this->page > $this->max_pages || $this->page <= 0) {
            $this->page = 1;
        }

        //Calculate Offset
        $this->offset = $this->rows_per_page * ($this->page-1);

        //Fetch the required result set
        $rs = @mysql_query($this->sql." LIMIT {$this->offset}, {$this->rows_per_page}");
        if(!$rs) {
            if($this->debug) echo "Pagination query failed. Check your query.<br />";
            return false;
        }
        return $rs;
    }

    /**
     * Display the link to the first page
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to 'First'
     * @return string
     */
    function renderFirst($tag='First') {
        if($this->page == 1) {
            return $tag;
        }
        else {
            return '<a href="'.$this->php_self.'?page=1">'.$tag.'</a>';
        }
    }

    /**
     * Display the link to the last page
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to 'Last'
     * @return string
     */
    function renderLast($tag='Last') {
        if($this->page == $this->max_pages) {
            return $tag;
        }
        else {
            return '<a href="'.$this->php_self.'?page='.$this->max_pages.'">'.$tag.'</a>';
        }
    }

    /**
     * Display the next link
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to '>>'
     * @return string
     */
    function renderNext($tag=' &gt;&gt;') {
        if($this->page < $this->max_pages) {
            return '<a href="'.$this->php_self.'?page='.($this->page+1).'">'.$tag.'</a>';
        }
        else {
            return $tag;
        }
    }

    /**
     * Display the previous link
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to '<<'
     * @return string
     */
    function renderPrev($tag='&lt;&lt;') {
        if($this->page > 1) {
            return '<a href="'.$this->php_self.'?page='.($this->page-1).'">'.$tag.'</a>';
        }
        else {
            return $tag;
        }
    }

    /**
     * Display the page links
     *
     * @access public
     * @return string
     */




    function renderNav() {
        for($i=1;$i<=$this->max_pages;$i+=$this->links_per_page) {
            if($this->page >= $i) {
                $start = $i;
            }
        }

        if($this->max_pages > $this->links_per_page) {
            $end = $start+$this->links_per_page;
            if($end > $this->max_pages) $end = $this->max_pages+1;
        }
        else {
            $end = $this->max_pages;
        }

        $links = '';
        $niche = $_GET['niche'];

        for( $i=$start ; $i<$end ; $i++) {
            if($i == $this->page) {
                $links .= " $i ";
            }
            else {
                $links .= ' <a href="'.$this->php_self.'?page='.$i.'&niche='.$niche.'">'.$i.'</a> ';
            }
        }

        return $links;
    }

    /**
     * Display full pagination navigation
     *
     * @access public
     * @return string
     */
    function renderFullNav() {
        return $this->renderFirst().'&nbsp;'.$this->renderPrev().'&nbsp;'.$this->renderNav().'&nbsp;'.$this->renderNext().'&nbsp;'.$this->renderLast(); 
    }

    /**
     * Set debug mode
     *
     * @access public
     * @param bool $debug Set to TRUE to enable debug messages
     * @return void
     */
    function setDebug($debug) {
        $this->debug = $debug;
    }
}
?>
  • 1
    $ sql = "ВЫБРАТЬ * ИЗ ОБУЧЕНИЯ, ГДЕ ниша = '{$ _GET [' ниша ']}'"; На этом написано SQL-инъекция. ПОБЕГ.
  • 0
    Не ответ на ваш вопрос, но я рекомендую переработать этот код. Он подлежит внедрению SQL: $ sql = "SELECT * FROM изучает ГДЕ нишу = '{$ _GET [' ниша ']}'";
Теги:
pagination

4 ответа

1

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

$sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}' limit $startPoint, $offset";

Таким образом, смещение совпадает с количеством элементов, которое вы хотите на странице, а $startPoint - это точка, в которой поиск начинается с следующей итерации.

может быть что-то вроде:

if(!$startPoint){$startPoint = 0;}else{$startPoint = {$_GET['$startPoint'];}

внутри вашего кода передайте начальную точку обратно в запрос и увеличив ее на смещение после каждой итерации.

Пожалуйста, имейте в виду, что я не принимаю во внимание такие вещи, как инъекция, и тот факт, что переменная $num не появляется нигде в первом файле. Я не могу видеть, где вы его инициализировали, чтобы протестировать $a против него.

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

<?php
        //Include the PS_Pagination class
       include('includes/ps_pagination.php');

        //Connect to mysql db
        $conn = mysql_connect("localhost", "root", "root");
        mysql_select_db('database',$conn);
        $sql = "SELECT * FROM studies";// WHERE niche = '{$_GET['niche']}'";
        //Create a PS_Pagination object
        $pager = new PS_Pagination($conn,$sql,4,5);
        //The paginate() function returns a mysql
        //result set for the current page
        $rs = $pager->paginate();
        //Loop through the result set
        while($row = mysql_fetch_assoc($rs)) {

 //   $a=0;
 //   while ($a < $num) {

 //   $id=mysql_result($result,$a,"id");
 //   $title=mysql_result($result,$a,"title");
  //  $strategies=mysql_result($result,$a,"strategies");
 //   $client=mysql_result($result,$a,"client");
 //   $copy=mysql_result($result,$a,"copy");
 //   $thumbmedia=mysql_result($result,$a,"thumbmedia");
 //   $niche=mysql_result($result,$a,"niche");
    $id=$row['id'];
    $title=$row['title'];
    $strategies=$row['strategies'];
    $client=$row['client'];
    $copy=$row['copy'];
    $thumbmedia=$row['thumbmedia'];
    $niche=$row['niche'];

    echo '<div class="container"><p class="subheadred"><a href="casestudy.php?id='.$id.'">'.$title.'</a></p></div>';

    echo '<div class="containerstudy"><div class="column1"><p class="subheadsmall">Strategies</p><p class="sidebarred">'.$strategies.'</p>';

    echo '<p class="subheadsmall">Client</p><p class="sidebargrey">'.$client.'</p></div>';

    echo '<div class="column2"><p class="bodygrey">'.substr($copy, 0, 300).'<a href="casestudy.php?id='.$id.'">...more</a></p></div>';

    echo '<div class="column3"><img src="images/'.$thumbmedia.'" height="160" /></div></div>';

  //  $a++;
  //  }

        }
        //Display the navigation
        echo $pager->renderNav();
    ?>

Обратите внимание, что я прокомментировал какую-то часть, где не требуется

переменная $a была бессмысленной, поскольку она сравнивалась с $num, которая не существует, поэтому ничего не показывалось. Теперь эти строки:

   //   $id=mysql_result($result,$a,"id");
     //   $title=mysql_result($result,$a,"title");
      //  $strategies=mysql_result($result,$a,"strategies");
     //   $client=mysql_result($result,$a,"client");
     //   $copy=mysql_result($result,$a,"copy");
     //   $thumbmedia=mysql_result($result,$a,"thumbmedia");
     //   $niche=mysql_result($result,$a,"niche");

где также неправильно, поскольку вы пытаетесь получить результат из результата $result. ни в коем случае вы не поставили результирующий набор в $result, который вы импортировали, и помещает результирующий набор в идентификатор с именем $rs.

Поскольку вы используете $row = mysql_fetch_assoc($rs) для чтения набора результатов, чтобы получить все переменные, которые вам нужно сделать, это получить строку столбца через массив, подобный этому

$id=$row['id'];

и т.д. как только вы это сделаете, код должен работать должным образом. Однако это возвращает нас к этому:

$sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}'";

Мне пришлось получить последнюю часть из того, что эта переменная не возвращается обратно в строку запроса (видя, что вы используете get), другая проблема - это первый раз, когда вы загружаете страницу этой переменной "niche" doesn ' t, так что в первый раз, когда вы запустите код, вы получите пустую страницу, если только этот script не доступен через ссылку, которая проходит в этой переменной. в этот момент я оставил его прокомментированным, так как не уверен, что вы пытались сделать через нишу.

Надеюсь, что это поможет.

  • 0
    привет спасибо за помощь Я устал от этого, и он сказал неожиданный '{' перед $ _GET ... куда мне нужно поместить оператор if?
  • 0
    позвольте мне воссоздать ваш сценарий с моей стороны, запустите его и сообщите, что делать.
0

Я думаю, что если вы изменили функцию paginate, чтобы у нее был один параметр $page, и вы бы установили $this->page = $page в начале функции, это сработает.

Вам также придется изменить вызов этой функции в вашем коде на $pager->paginate($_GET['page']).

Пейджер также очень неэффективен, он получает весь запрос, чтобы узнать, сколько строк имеет ответ. Я бы использовал что-то вроде:

$all_rs = @mysql_query('SELECT COUNT(*) FROM (' . $this->sql . ')');
if(!$all_rs) {
        if($this->debug) echo "SQL query failed. Check your query.<br />";
        return false;
}
$this->total_rows = mysql_result($all_rs, 0, 0);
@mysql_close($all_rs);
0

У вас есть страница в строке запроса?

0

Я не уверен, что эта библиотека разбиения на страницы с индексом строк, но вы всегда устанавливаете $a to 0. Возможно, индекс не относится к этой странице, а относится к общему набору записей?

Другими словами, что, если вы установите $a на 0 на странице 1, 4 на странице 2 и т.д.

Вы можете использовать $rows_per_page и $page для расчета. Или, возможно, это значение смещения $, так что вы устанавливаете $a для смещения и зацикливаете его до тех пор, пока не нажмете $rows_per_page дополнительные строки.


Изменить осветляющее решение:
Итак, я вижу, что вы можете сделать это:

$a=0;
while ($a < $pager->rows_per_page) {
    $row = $a + $pager->offset;

    $id=mysql_result($result,$row,"id");
    $title=mysql_result($result,$row,"title");
    $strategies=mysql_result($result,$row,"strategies");
    $client=mysql_result($result,$row,"client");
    $copy=mysql_result($result,$row,"copy");
    $thumbmedia=mysql_result($result,$row,"thumbmedia");
    $niche=mysql_result($result,$row,"niche");

    ...
    $a++;
}
  • 0
    Да, попробуйте установить $ a = $ pager -> $ offset и проходить циклически, пока вы не нажмете $ offset + $ row_per_page
  • 0
    Другими словами: $ a = $ pager-> offset; while ($ a <($ pager-> offset + $ pager-> row_per_page)) {...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню