[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PAGING
Игорь_Vasinsky
Вообщем на просторах рунета выкопал этот класс

подключаеться он так:

require("./paging.inc.php");


вот его листинг
Свернутый текст


<?
class
Paging {
private $page_size = 3;
private $link_padding = 10;
private $page_link_separator = ' ';
private $next_page_text = 'следующая';
private $prev_page_text = 'предыдущая';
private $result_text_pattern = 'Показано с %s по %s из %s';
private $page_var = 'page';

private $db;
private $q;
private $total_rows;
private $total_pages;
private $cur_page;
public function __construct($db, $q='', $page_var='page')
{
$this->db = $db;
if ($q) $this->set_query($q);
$this->page_var = $page_var;
$this->cur_page = isset($_GET[$this->page_var]) && (int)$_GET[$this->page_var] > 0 ? (int)$_GET[$this->page_var] : 1;
}

public function set_query($q)
{
$this->q = $q;
}

public function set_page_size($page_size)
{
$this->page_size = abs((int)$page_size);
}

public function set_link_padding($padding)
{
$this->link_padding = abs((int)$padding);
}

public function get_page($q='')
{
if ($q) $this->set_query($q);

$r = $this->db->query( $this->query_paging($this->q) );
$this->total_rows = array_pop($this->db->query('SELECT FOUND_ROWS()')->fetch_row());

if ($this->page_size !== 0) $this->total_pages = ceil($this->total_rows/$this->page_size);

if ($this->cur_page > $this->total_pages)
{
$this->cur_page = $this->total_pages;
if ( $this->total_pages > 0 ) $r = $this->db->query( $this->query_paging($this->q) );
}

return $r;
}

public function get_result_text()
{
$start = (($this->cur_page-1) * $this->page_size)+1;
$end = (($start-1+$this->page_size) >= $this->total_rows)? $this->total_rows:($start-1+$this->page_size);

return sprintf($this->result_text_pattern, $start, $end, $this->total_rows);
}

public function get_page_links()
{
if ( !isset($this->total_pages) ) return '';

$page_link_list = array();

$start = $this->cur_page - $this->link_padding;
if ( $start < 1 ) $start = 1;
$end = $this->cur_page + $this->link_padding-1;
if ( $end > $this->total_pages ) $end = $this->total_pages;

if ( $start > 1 ) $page_link_list[] = $this->get_page_link( $start-1, $start - 2 > 0 ? '...' : '' );
for ($i=$start; $i <= $end; $i++) $page_link_list[] = $this->get_page_link( $i );
if ( $end + 1 < $this->total_pages ) $page_link_list[] = $this->get_page_link( $end +1, $end + 2 == $this->total_pages ? '' : '...' );
if ( $end + 1 <= $this->total_pages ) $page_link_list[] = $this->get_page_link( $this->total_pages );

return implode($this->page_link_separator, $page_link_list);
}

public function get_next_page_link()
{
return isset($this->total_pages) && $this->cur_page < $this->total_pages ? $this->get_page_link( $this->cur_page + 1, $this->next_page_text ) : '';
}

public function get_prev_page_link()
{
return isset($this->total_pages) && $this->cur_page > 1 ? $this->get_page_link( $this->cur_page - 1, $this->prev_page_text ) : '';
}

private function get_page_link($page, $text='')
{
if (!$text) $text = $page;

if ($page != $this->cur_page)
{
$reg = '/((&|^)'.$this->page_var.'=)[^&#]*/';
$url = '?'.( preg_match( $reg, $_SERVER['QUERY_STRING'] ) ? preg_replace($reg, '${1}'.$page, $_SERVER['QUERY_STRING']) : ( $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'].'&' : '' ).$this->page_var.'='.$page);
return '<b class="vizit2"><a class="black" href="'.$url.'">'.$text.'</a></b></span>';
}
return '<b class="vizit">'.$text.'</b>';
}

private function query_paging()
{
$q = $this->q;

if ($this->page_size != 0)
{
//calculate the starting row
$start = ($this->cur_page-1) * $this->page_size;
//insert SQL_CALC_FOUND_ROWS and add the LIMIT
$q = preg_replace('/^SELECT\s+/i', 'SELECT SQL_CALC_FOUND_ROWS ', $this->q)." LIMIT {$start},{$this->page_size}";
}

return $q;
}
}

?>



а вывод реализован так:

$_PAGING = new Paging($_DB);
//выполняем обычный запрос данных не заботясь
//о разбивке на страницы через метод get_page объекта класса Paging

$r = $_PAGING->get_page("SELECT * FROM `TABLE` ORDER BY `id` ASC");
while($row = $r->fetch_assoc())
{
//вывод
}
так вот этот клас выводит по n-результатов на страницу (оч похоже на google или yandex)

я же хочу вывести тока первые 10 результатов, дописав сюда:
SELECT * FROM `TABLE`  ORDER BY `id` ASC

LIMIT 0,10
SELECT * FROM `TABLE`  ORDER BY `id` ASC LIMIT 0,10

в результате получаю ERROR:
Fatal error: Call to a member function fetch_assoc() on a non-object

ковырялся в классе, думал там где то выставить, но не нашёл...мож проглядел...

кто знает как реализовать...?







Спустя 14 минут, 44 секунды (1.12.2010 - 12:27) linker написал(а):
Что есть $_DB у тебя?

Спустя 6 минут, 30 секунд (1.12.2010 - 12:34) Lenarfate написал(а):
в коде вообще нет метода fetch_assoc

Спустя 16 минут, 28 секунд (1.12.2010 - 12:50) Семён написал(а):
Выкинь этот Paginator, кусок говнокода

Спустя 21 минута, 44 секунды (1.12.2010 - 13:12) Игорь_Vasinsky написал(а):
не .. не викину.. давайте считать этот вопрос принципиальным

Цитата
Что есть $_DB у тебя?


это общий вопрос или конкретно про мой случай?

Спустя 2 минуты, 54 секунды (1.12.2010 - 13:15) Игорь_Vasinsky написал(а):
$_DB = new mysqli(HOST,USER,PASS,DB);
$_DB->set_charset('utf8');
$dbSelect = mysql_select_db(DB, $link) or die("Не могу выбрать БД".mysql_error());

Спустя 25 минут, 14 секунд (1.12.2010 - 13:40) Игорь_Vasinsky написал(а):
куда все делись?

Спустя 3 часа, 39 минут, 24 секунды (1.12.2010 - 17:20) SlavaFr написал(а):
Игорь, ты бы взял да проверил бы что выдает query_paging и понял бы что sql с двумя LIMIT не работает.

Спустя 2 часа, 14 минут, 53 секунды (1.12.2010 - 19:34) Игорь_Vasinsky написал(а):
..ююювообщето я знал.. тока.... вообщем тот лмиуказывать кол-во записей на странице...

так... как же обойти этот момент и выдать 10 записей?

Спустя 1 день, 19 часов, 49 минут, 27 секунд (3.12.2010 - 15:24) tomash написал(а):
$_PAGING = new Paging($_DB);
//выполняем обычный запрос данных не заботясь
//о разбивке на страницы через метод get_page объекта класса Paging

$r = $_PAGING->get_page("SELECT * FROM `TABLE` ORDER BY `id` ASC");
while($row = $_PAGING ->fetch_assoc($r))
{
//вывод
}


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.