Клас за странициране
25-11-2009
Така... първо тоя клас не съм го писал аз, само го ползвам. Също така не го и разбирам добре , но поне мога да го подкарам на всякакви страници.
Автора е Тук
Оставил съм оригиналните коментари и съм добавил някои мои.. дано да е разбираемо.
Искахте ООП.. ето ви :).
Ето го и кода:
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, чийто клас използвах повече от година, но така и не можах да настроя добре. Надявам се новият му урок да е още по изпипан.






/ Трябва да сте регистриран за да напишете коментар /
От: vankata
2:17 08-12-2009
super
От: noname_dark
17:57 30-05-2010
Едно демо няма да е излишно :)
От: gLaVoReZa
20:28 27-06-2010
Браво за труда, но имам забележка - пише се страниране, вместо страниЦИране.
От: rombeca
20:51 27-06-2010
Хаха... баси, това странИране го ползвам главно за тълковен речник. И не бях проверил как се пише. Благодаря, прав си :).
Ето и работещо демо, щом искате.
http://www.t-rechnik.info/
От: relax15pyt
3:05 02-09-2010
Както има страниране(paging) така има и странициране (pagination)
1