Webmaster общности: Predpriemach.com | SearchEngines.bg

    Клас за странициране

    Автор: rombeca

    Така… първо тоя клас не съм го писал аз, само го ползвам. Също така не го и разбирам добре , но поне мога да го подкарам на всякакви страници.
    Автора е Тук
    Оставил съм оригиналните коментари и съм добавил някои мои.. дано да е разбираемо.
    Искахте ООП.. ето ви :).
    Ето го и кода:
    ps_pagination.php

    <?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 = 10; //Number of records to display per page //това доколкото разбирам са минимални стойности,
    //по нататък се вижда че ноже и да се редактират
    var $total_rows = 0; //Total number of rows returned by the query
    var $links_per_page = 5; //Number of links to display per page
    var $append = ""; //Paremeters to append to pagination links
    var $sql = "";
    var $debug = false;
    var $conn = false;
    var $page = 1;
    var $max_pages = 0;
    var $offset = 0;
    //Това доколкото разбирам са минимални стойности,
    //по нататък се вижда че може и да се редактират.
    
    /**
    * 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
    * @param string $append Parameters to be appended to pagination links
    */
    
    function PS_Pagination($connection, $sql, $rows_per_page = 10, $links_per_page = 5, $append = "") {
    $this->conn = $connection;
    $this->sql = $sql;
    $this->rows_per_page = (int)$rows_per_page;
    if (intval($links_per_page ) > 0) {
    $this->links_per_page = (int)$links_per_page;
    } else {
    $this->links_per_page = 5;
    }
    $this->append = $append;
    $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() {
    //Check for valid mysql connection
    if (! $this->conn || ! is_resource($this->conn )) {
    if ($this->debug)
    echo "MySQL connection missing<br />";
    return false;
    }
    
    //Find total number of rows
    $all_rs = @mysql_query($this->sql );
    if (! $all_rs) {
    if ($this->debug)
    echo "SQL query failed. Check your query.<br /><br />Error Returned: " . mysql_error();
    return false;
    }
    $this->total_rows = mysql_num_rows($all_rs );
    @mysql_close($all_rs );
    
    //Return FALSE if no rows found
    if ($this->total_rows == 0) {
    if ($this->debug)
    echo "Query returned zero rows.";
    return FALSE;
    }
    
    //Max number of pages
    $this->max_pages = ceil($this->total_rows / $this->rows_per_page );
    if ($this->links_per_page > $this->max_pages) {
    $this->links_per_page = $this->max_pages;
    }
    
    //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 /><br />Error Returned: " . mysql_error();
    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
    */
    //Тук е по важно показването на линковете.
    //Надявам се, че разбирате. Може да преведете 'First' на 'Първа'.
    function renderFirst($tag = 'First') {
    if ($this->total_rows == 0)
    return FALSE;
    
    if ($this->page == 1) {
    return "$tag ";
    } else {
    return '<a href="' . $this->php_self . '?page=1&' . $this->append . '">' . $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->total_rows == 0)
    return FALSE;
    
    if ($this->page == $this->max_pages) {
    return $tag;
    } else {
    return ' <a href="' . $this->php_self . '?page=' . $this->max_pages . '&' . $this->append . '">' . $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->total_rows == 0)
    return FALSE;
    
    if ($this->page < $this->max_pages) {
    return '<a href="' . $this->php_self . '?page=' . ($this->page + 1) . '&' . $this->append . '">' . $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->total_rows == 0)
    return FALSE;
    
    if ($this->page > 1) {
    return ' <a href="' . $this->php_self . '?page=' . ($this->page - 1) . '&' . $this->append . '">' . $tag . '</a>';
    } else {
    return " $tag";
    }
    }
    
    /**
    * Display the page links
    *
    * @access public
    * @return string
    */
    //Тук показва само цифри от типа " 1 2 3..."
    function renderNav($prefix = '<span class="page_link">', $suffix = '</span>') {
    if ($this->total_rows == 0)
    return FALSE;
    
    $batch = ceil($this->page / $this->links_per_page );
    $end = $batch * $this->links_per_page;
    if ($end == $this->page) {
    //$end = $end + $this->links_per_page - 1;
    //$end = $end + ceil($this->links_per_page/2);
    }
    if ($end > $this->max_pages) {
    $end = $this->max_pages;
    }
    $start = $end - $this->links_per_page + 1;
    $links = '';
    
    for($i = $start; $i <= $end; $i ++) {
    if ($i == $this->page) {
    $links .= $prefix . " $i " . $suffix;
    } else {
    $links .= ' ' . $prefix . '<a href="' . $this->php_self . '?page=' . $i . '&' . $this->append . '">' . $i . '</a>' . $suffix . ' ';
    }
    }
    
    return $links;
    }
    
    /**
    * Display full pagination navigation
    *
    * @access public
    * @return string
    */
    //Тук показва пълно странициране от типа "Първа <<1 2 3>>Последна".
    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;
    }
    }
    ?>

    Четете коментарите, не е трудно.
    Тук автора е направил един примерен файл за видовете използване:

    usage.php

    <?php
    //Include the PS_Pagination class
    include('ps_pagination.php');
    
    //Connect to mysql db
    //Тук е ясно попълвате си данните за MYSql .
    $conn = mysql_connect('localhost','','');
    if(!$conn) die("Failed to connect to database!");
    $status = mysql_select_db('', $conn);
    if(!$status) die("Failed to select database!");
    $sql = 'SELECT * FROM sometable';
    
    /*
    * Create a PS_Pagination object
    *
    * $conn = MySQL connection object
    * $sql = SQl Query to paginate
    * 10 = Number of rows per page
    * 5 = Number of links
    * "param1=valu1&param2=value2" = You can append your own parameters to paginations links
    */
    //Това е важно: Слага се в страницата в която ще се извеждат резултатите. По долу е настройката
    // за брой резултати , брой страници и брой линкове ( примерно 1 2 3 4 5 )
    $pager = new PS_Pagination($conn, $sql, 10, 5, "param1=valu1&param2=value2");
    
    /*
    * Enable debugging if you want o view query errors
    */
    $pager->setDebug(true);
    
    /*
    * The paginate() function returns a mysql result set
    * or false if no rows are returned by the query
    */
    $rs = $pager->paginate();
    if(!$rs) die(mysql_error());
    while($row = mysql_fetch_assoc($rs)) {
    echo $row['image'],"<br />\n";
    }
    
    //Display the full navigation in one go
    
    //Тук вече избирате по какъв начин ще се показват линковете.
    echo $pager->renderFullNav();
    
    echo "<br />\n";
    
    /*
    * Or you can display the individual links for more
    * control over HTML rendering.
    *
    */
    
    //Display the link to first page: First
    echo $pager->renderFirst();
    
    //Display the link to previous page: <<
    echo $pager->renderPrev();
    
    /*
    * Display page links: 1 2 3
    * $prefix = Will be prepended to the page link (optional)
    * $suffix = Will be appended to the page link (optional)
    *
    */
    echo $pager->renderNav('<span>', '</span>');
    
    //Display the link to next page: >>
    echo $pager->renderNext();
    
    //Display the link to last page: Last
    echo $pager->renderLast();
    ?>

    Самия файл usage.php няма смисъл да се използва , защото той показва всички възможни варианти.
    Сега ще покажа един пример, как аз си извеждам резултатите:
    primer.php

    <?php
    
    include('ps_pagination.php');
    
    $conn = mysql_connect('localhost','root','');
    if(!$conn) die("Failed to connect to database!");
    $status = mysql_select_db('dumi', $conn);
    if(!$status) die("Failed to select database!");
    $sql = 'SELECT * FROM a ORDER BY duma ASC';
    $chars="SET CHARACTER SET cp1251";
    mysql_query($chars);
    
    $pager = new PS_Pagination($conn, $sql, 30, 5);//Тук е зададено да показва по 30 резултата, с 5 линка
    
    
    $pager->setDebug(true);
    
    echo '<table align="center" border="1" width=80%>
    <tr>
    <th>Дума</th>
    <th>Описание</th>
    </tr>';
    
    
    $rs = $pager->paginate();
    if(!$rs) die(mysql_error());
    while($row = mysql_fetch_assoc($rs)) {
    
    echo '<tr>
    
    <td>'.$row[duma].'</td>
    <td>'.$row[opisanie].'</td>
    </tr>';
    }
    //Тук показвам пълни линкове от типа 'Първа <<1 2 3 4 5>>Последна'
    echo '<thead><th align= "center" colspan="2">'.$pager->renderFullNav().'</th></thead>
    </table>';
    
    ?>

    Ако искате да използвате utf8 променете $chars=“SET CHARACTER SET cp1251″;
    mysql_query($chars);
    и запазете всички файлове в utf8 без BOM , за да не питате после: „Плс,плс, хлп, хлп излиза ми на квадрати или въпросителни“ 🙂

    Искам да изкажа благодарности на @devent, чийто клас използвах повече от година, но така и не можах да настроя добре. Надявам се новият му урок да е още по изпипан.