Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сделать постраничный вывод записей. PHP+MySQL 
V
    Опции темы
Blaga
  Дата 21.10.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Пишу новостной двиг. Вроде уже все сделал... НО не могу сделать так чтобы у меня считались и выводились страницы. Короче полный геморой...smile 
Во всех книгах которые у меня есть я ответа не нашел. Сделал кое что, Но эта фигня так и не работает. Он выводит неправильное кол-во страниц... и ссылки не такие получаються... smile 
Система работает с мускулом... вот код, посмотрите мож кто хоть какую идею подкинет...
Код

<html><head><title>Просмотр записей</title>
<meta http-equiv="content-type" content="text/html; charset=Windows-1251">
</head><body>
<?php

Error_Reporting(7);
include "blagaB_conf.php";
$_GET['ot'];
$_GET['do'];
$kol_vo_z=3; //количество записей на странице
$my_sql = mysql_connect(HOST, LOGIN, PASS) or die ("Невозможно приконектится к MySQL");
mysql_select_db(NAMEDB, $my_sql) or die ("Невозможно выбрать БД MySQL");
//проверка переменных на присутствие
if ($ot == false and $do == false) {
    echo "false";
    $ot=0;
    $do=$kol_vo_z;
}

//выбор максимального ID
$my_sql_query_max = "SELECT MAX(id) FROM ".PREF."blog ;";
$maxi = mysql_query($my_sql_query_max, $my_sql) or die ("не выполняеться запрос на максимум");
//выбор просматриваемых записей
$my_sql_query = "SELECT id, name_b, date_b, annot_b FROM ".PREF."blog WHERE id>".$ot." AND id<=".$do." ;";
$result = mysql_query($my_sql_query, $my_sql) or die ("не выполняеться запрос");
//вывод просматриваемых записей
for ($i=0; $i<mysql_num_rows($result); $i++)
{
    $e=$i+1;
    $mas=mysql_fetch_array($result);
    echo "<table border=1 width=50%>";
    echo "<tr><td>".$mas[name_b]."</td></tr>";
    echo "<tr><td>Дата: ".$mas[date_b]."</td></tr>";
    echo "<tr><td>".$mas[annot_b]."</td></tr>";
    echo "<tr><td><form name=\"form".$e."\" action=\"details.php\" method=\"get\"><input name=\"id\" type=\"hidden\" value=\"".$mas[id]."\"><input type=\"submit\" value=\"Передать\"></form>".$mas[id]."</td></tr>";
    echo "</table><br>";
}

//вывод количества страниц
$p=$maxi/$kol_vo_z;
settype($p,'String');
for($c=0;$c<$p;$c++)
{
    if($p[$c]!=".")
    {
    $s.=$p[$c];
    $f=0;
    }
    else
    {
    $f=1;
    ++$s;
    break;
    }
}
echo $s;
$pag=0;
$ot=0;
$do=$kol_vo_z;
echo "<table border=1 width=50%><tr><td>";
for ($r=0; $r<$s; $r++) {      $pag=$pag+1;


     echo "| <a href=\"proba.php?ot=".$ot."&do=".$do."\">".$pag."</a> |";
      $ot=$ot+$kol_vo_z;
     $do=$do+$kol_vo_z;
}
 echo "</td></tr></table>";
//закрытие соединения
mysql_close($my_sql) or die ("Невозможно закрыть соединение MySQL");


?>
<br><br><hr width="30%" align="left">
Copyright &copy; <b>blaga</b> 2006
</body></html>
 smile 


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
skyboy
Дата 21.10.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



отталкиваться от id можно только в том единственном случае, когда у тебя никогда-никогда не удаляются объекты. А они у тебя(если я правильно понял, и это структура описывает блог) вполне могут удаляться. Потому вместо сравнения по id и определения max(id) рекомендую конструкцию LIMIT
PM MAIL   Вверх
Blaga
Дата 21.10.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Они точно не будут удаляться до тех пор пока сервер не накроеться. Выводить то он по три штуки выводит а вот сами страницы... smile  Есть еще у кого идеи?


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
skyboy
Дата 21.10.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



а зачем ты определяешь общее количество записей:
SELECT max(id)...
если можно так:
SELECT count(*)...
А по страницам бегать вот так:
SELECT <column1>,<column2>... FROM blog ORDER BY id LIMIT (<number of page> - 1)*<adverts per page>, <adverts per page>
В прицнипе, можно обойтись без сортировки, но как-нить MySQL выдаст строки в совсем произвольном порядке, потому лучше перестраховаться.

PM MAIL   Вверх
Blaga
Дата 21.10.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Посмотрел про LIMIT как я понял он может показывать только определенное кол-во строк с начала таблицы. Да и не понял я как это мне поможет с выводом страниц... smile

Добавлено @ 14:41 
Я немного не понял чем принципиально отличаються max() и cout()? Ты не мог бы написать примерный вариант запроса? Поподробней этого, а то я чуток не понимаю что  за <column1>,<column2> и ORDER BY id LIMIT (<number of page> - 1)*<adverts per page>, <adverts per page> Я ведь только начал Скуль изучать... Буду очень благодарен. )


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
Blaga
Дата 21.10.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Так, как реализовать то что написано выше я понял, вроде. НО как же мне вывести список страниц с сылками я так и не догнал...(типа | 1 | 2 | 3 | 4 | .... | n |)


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
Blaga
Дата 21.10.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Кстати, общее кол-во записей я определяю чтоб потом разбивать на страницы... Вот как это у меня сейчас функционирует:
1 вылавливаем количество строк в БД
2 делим количество строк на то количество которое должно отображаться в одной странице
3 провереям поделилось нацело или нет для этого:
3,1 переводим переменную с количеством страниц(то что получилось в результате деления) в строку
3,2 ищем в строке точку
3,3 Если точка не нашлась все остаеться как было
3,4 если нашлась то добавляем к той цифре что была перед точкой 1(типа округляем )
4 циклом выводим номера страниц (не отображаеться как нужно)
5 присваиваем к номерам страниц ссылки (тоже не работает как нужно)

Вот в принципе и все. Естесственно больше всего интересуют 4 и 5 пункты. Кто подскажет?
 smile 


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
skyboy
Дата 21.10.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Blaga, <column 1>,<column 2> etc - это я по незнанию структуры твоей таблицы так поля использую, которые тебе нужны... я ж их названия не знаю..
А LIMIT(я ж указал ссылку на мануал) может работать в двух ипостасях:
LIMIT <число> выбирает указанное количество строк, начиная с первой;
LIMIT <начиная с какой строки>,<сколько строк> выберет заданной количество строк, начиная с указанной строки ,а не с первой. 
Т.е. LIMIT 10,50 - 50 строк, начиная с десятой.
Цитата(Blaga @  21.10.2006,  13:35 Найти цитируемый пост)
ORDER BY id LIMIT (<number of page> - 1)*<adverts per page>, <adverts per page>

ORDER BY id - надо бы применить сортировку(хотя бы и по id), а то можно получить неожиданный порядок;
LIMIT (<number of page> - 1)*<adverts per page>, <adverts per page> переведу "комментарии"-переменные на русский:
LIMIT (<номер текущей страницы> - 1)*<количество записей, отображаемых на одной странице>, <количество записей, отображаемых на одной странице>
Т.е., коль у тебя 20 записей отображается на странице, то запрос для записей на третьей странице, будет выглядеть так:
Код

SELECT * 
FROM blog 
ORDER BY id
LIMIT 40,20

Т.е. "отбросив" первые 40 записей(первые две страницы) выберем 20 записей - это и будет третья страница. А ссылки можно реализовывать, как хочешь. Например, так(таблица my_table содержит только два поля: id(auto_increment) и some_text(varchar) с какой-нить информацией):
Код

<?php
include_once 'dbinit.php'; // самописный модуль, так что не ищи в папке с PHP ;)
dbinit(); // сама процедура инициализации; тоже самописная из самописного модуля, подключенного строкой выше
if(isset($_GET['page']))
 $page= $_GET['page'];
else
 $page= 1;
$records_per_page= 20; // по 20 записей будет отображаться на странице 
$q= 'SELECT count(*) FROM my_table';
$query= mysql_query($q);
if($query && $row= mysql_fetch_array($query, MYSQL_NUM))
{ 
 echo 'total there are '.$row[0].' records...';
 $page_count= floor($row / $records_per_page) + 1; // количество страниц
 if($page > $page_count || $page<1) // проверим на "валидность" номер страницы
  $page= 1; 
 echo 'Страница: ';
 for($i= 0; $i< $page - 1; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';
 echo $page.' |'; // текущая страница будет отображаться не ссылкой, а простым текстом
 for($i= $page; $i< $page_count; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';
 $q= 'SELECT id,some_text
         FROM my_table
         ORDER BY id
         LIMIT '.($page-1)*$records_per_page.','.$records_per_page; // выбираю очередные 20 записей для текущей страницы
 $query= mysql_query($q);
 if($query)
 {
   echo '<table><tbody>'; 
   while($row= mysql_fetch_array($query, MYSQL_NUM))
    echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td></tr>';
   echo '</tbody></table>';
 }
}
?>

вроде, все. учебный пример должен работать smile

Добавлено @ 15:34 
Цитата(Blaga @  21.10.2006,  14:21 Найти цитируемый пост)
3,1 переводим переменную с количеством страниц(то что получилось в результате деления) в строку
3,2 ищем в строке точку
3,3 Если точка не нашлась все остаеться как было
3,4 если нашлась то добавляем к той цифре что была перед точкой 1(типа округляем )

какая разница - нацело делится или нет? что ж ты, последнюю страницу с 15 записями( вместо 20 на "полной странице") отображать не будешь?!

Добавлено @ 15:35 
потому вместо всех этих пунктов советую делать так:
floor(общее_количество_записей / количество_записей_на_"полной"_странице) + 1
PM MAIL   Вверх
Piphon
Дата 21.10.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: 2
Всего: 2



Вот тебе еще один "кирпич", на этот раз функцией,  а не цельным кодом .

В нем: 
  $index       = номер страницы;
  $count       = общее число элементов;
  $delimiter  = количество элементов на странице;
  $href_link  = шаблон ссылки где (%) - подстановка номера страницы;
  $count_list= количество ссылок на другии листы помимо активного;

В запросе используй 
Код

LIMIT ( $index - 1 ) * $delimiter, $delimiter


Код

<?php
    function string_spliter($index, $count, $delimiter, $href_link, $count_list = 10)
    {
        $max_c = intval($count_list / 2) - 1;
        //$text .= '<center>';
        
        if ($count <= $delimiter)
        {
            return ; 
        }
        else
        {
            $max_int = intval($count / $delimiter);
            $max     = $count / $delimiter;
            $c_max = $max > $max_int ? $max_int + 1 : $max_int;
            
            if ($max_int > ($max_c * 2 + 1))
            {
                $r_min = ($index - $max_c >= 1)      ? $index - $max_c : 1     ;
                $r_max = ($index + $max_c <= $c_max) ? $index + $max_c : $c_max;
                
                if ($r_min < $max_c + 1)
                {
                    $r_max = $r_min + $max_c + $max_c;
                }
                
                if ($r_max - $r_min < $max_c * 2 )
                {
                    $r_min = $r_max - $max_c - $max_c ;
                }
            }
            else
            {
                $r_min = 1;
                $r_max = $c_max;
            }
            
            $r_min = $r_min < 1      ? 1      : $r_min;
            $r_max = $r_max > $c_max ? $c_max : $r_max;
            
            if ($index > 1)
            {
                $link = str_replace('(%)', $index - 1 , $href_link);
                $array[] = '<a href="' . $link . '">&laquo;</a> ';
            }
            else
            {
                $array[] = '&nbsp;';
            }
            
            for ($i = $r_min; $i <= $r_max; $i++)
            {
                $link = str_replace('(%)', $i, $href_link);
                $t = ($i == $index) ? $i . ' ' : "<a href='$link'>$i</a> ";
                $array[] = $t;
            }
            
            if ($index < $c_max)
            {
                $link = str_replace('(%)', $index + 1 , $href_link);
                $array[] = '<a href="' . $link . '">&raquo;</a>';
            }
            else
            {
                $array[] = '&nbsp;';
            }
            
        }
        
        if (is_array($array))
        {
            $text = '<center><table><tr>';
            foreach ($array as $cell)
            {
                $text .= '<td>' . $cell . '</td>';
            }
            $text .= '</tr></table></center>';
        }
        
        return $text;
    }
    
    $step = $_GET['step'];
    $step = $step == null ? 1 : $step;
    
    echo string_spliter($step, 120, 10, 'test2.html?step=(%)');

?>


P.S. Исправил баг с >>

Это сообщение отредактировал(а) Piphon - 21.10.2006, 15:52
--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
Vaulter
Дата 21.10.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 6
Всего: 22



приведу функцию - рабочую лошадку практически всех списков и отчетов
куча параметров. но зато позволяет мне в шаблоне просто писать типа:
Код

<select name='user_id'>
  <option value=0>-все-</option>
  <report name='users' onpage='0' sql='select user_id,username from users order by username'>
    <option value='$item[user_id]'>$item[username]</option>
  </report>
</select>

+ валидатор форм вообще сказка, но речь не об этом, итак: smile
Код


//we may to code this:
    //$page->reports['users']['sql'] = "asfasdf";
    //$page->reports['users']['csv'] = "asfasdf";
    //$page->reports['users']['array'] = "asfasdf";
    /*----------------------------------------
    $page - current page num
    $ttable - entire wrapper
    $trow - template of item
    $tempty - empty items template
    $params: 
        sql - query to DB
        csv - from files (dictionaries)
        array - from code
        params - array of parametrs
        onpage - 
        pagelinks - how many links will bee at once
        pagingurl - in a form of '?mod=tratata&page=this&p=%d' %d - will be number
        itemvar - name of var wroten in template ($item[name] $item[id])
        reportvar - ... name of all items ($items)
        pagingvar - name in template where paging will be inserted
        pagertype - todo
        callback - function of callback to call it like doreport(& $item){}
        selected - if set, have to be value that will be checked with $item[0].
        select - have to be setted to to default 'selected' (as <option selected>) 
            may be selected, checked, disabled... and so on
        login is simple - usual use SELECT id,name FROM ...
        
        work only 1 SELECTED VALUE... NO multiply TODO common univarsalis
    $params = array("onpage" => 100, "pagingurl" => "?page=%d" ,/* in format ?mod=some&mode=list&page=%d sprintf 
        "itemvar" => "item",    "reportvar" => "items",        "pagingvar" => "paging", "callback" => null, 
        "pagertype" => "window" ,"pagelinks"=>15 ))
    ----------------------------------------*/
    /* --------------------------------------
    допускается два варианта использования 
    <report name='' reportvar='items'>
        <template> some template $items </template>
        <itemtemplate>some item template </itemtemplate>
        <emptytemplate>ничего нет</emptytemplate>
    </report>
    и упрощенный вариант
    <report name='short'>
        some item template
    </report>
    в котором <template/> = $items;
    <emptytemplate/> = '';
    <itemtemplate/> = <report/>;
    
     --------------------------------------*/
    function build_reports()
    {
        global $DB,$ts;
        foreach($this->globals as $varname)
            global $$varname;
        extract($this->vars);
        foreach($this->vars as $varname=> $varvalue)
            eval("\$$varname = \"".$varvalue."\";");
        //----------------------------------------
        if(empty($this->reports))return;
        foreach($this->reports as  $id => $report)
        {
            unset($csvfile);
            if(empty($report['sql']))//code override this! warning :)
                eval("\$query = \"".trim($report['attr']['sql'],'"')."\";");//warning sql from templates :)
            else
                $query = $report['sql'];//full trust to coder and DB:)
            //if(defined('DEBUG') || $this->_debug)sys_log($report,'debug');//debug check!!!
            if(!empty($report['csv']))//code override this! warning :)
                $csvfile = $report['csv'];//some pathnamings???
            elseif(!empty($report['attr']['csv']))//we will try
                $csvfile = $report['attr']['csv'];
            elseif(!empty($report['attr']['csvfile']))
                $csvfile = $report['attr']['csvfile'];

            //$report['params'] - csv
            //one way to go: $report['array']
            //we have to override params byte
            //$page->reports[0]['params']['onpage'] = 20;
            //sys_log($report['attr']['name'].' '.var_export($report['params'],true));
            //sys_log('params:'.var_export($report['params'],true));
            //sys_log($report['attr']);
            is_array($report['params'])? $params =  ($report['params'] + $report['attr']):$params =  $report['attr'];

            if(!isset($params['onpage']) || !is_numeric($params['onpage'])) $params['onpage'] = 100;
            if(!isset($params['pagelinks']) || !is_numeric($params['pagelinks'])) $params['pagelinks'] =15;//in row//only for window or slider (<prev 1 2 3 4 5 next>)
            if(!isset($params['pagingurl'])) $params['pagingurl'] = "?page=%d";
            if(!isset($params['itemvar'])) $params['itemvar'] = "item";
            if(!isset($params['reportvar'])) $params['reportvar'] = "items";
            if(!isset($params['pagingvar'])) $params['pagingvar'] = "paging";
            if(!isset($params['pagertype'])) $params['pagertype'] = "window";//can be continuos or simple, complex TODO
            $pagesinrow  = $params['pagelinks'];

            if(!empty($params['selected'])) 
            {
                $params['onpage'] = 0;//no paging in selects
                $uid = sys_fetchvar(urldecode($params['selected']),$params['selected']);//we need to code this: $params['selected'] = 'user_id';
                //sys_log($params['selected'].' '.$uid);
                
                if(empty($params['select']))  $params['select']='selected';//no 
            }
            if(isset($params['pagevar']))    $page = sys_fetchvar($params['pagevar'],1,VALID_NUMBER);
            else $page = 1;
            if($page < 1) $page = 1;
            $tbox = $this->getElementsByTagName($report['inner'],'template');//to defines
            $tbox = str_replace('"','&quot;',$tbox[0]['inner']);//it have to be quicky
            $titem = $this->getElementsByTagName($report['inner'],'itemtemplate');
            $titem = str_replace('"','&quot;',$titem[0]['inner']);
            $tempty = $this->getElementsByTagName($report['inner'],'emptytemplate');
            $tempty =  str_replace('"','&quot;',$tempty[0]['inner']);
            /* ------- start ---- to iterate ---*/
            $pagingvar = $params['pagingvar'];
            $itemvar = $params['itemvar'];
            $reportvar = $params['reportvar'];
            $onpage = $params['onpage'];
            //check for short variant
            if(empty($tbox) && empty($titem) && !empty($report['inner']))//short form
            {
                $tbox='$'.$reportvar;
                $titem = $report['inner'];                
            }
            $$reportvar = '';//init

            //we need start and onpage
            //if(!empty($params['selected'])) $uid = $params['selected'];
            //if is set array
            
            if(isset($report['array']) || isset($csvfile))//source
            {
                //sys_log($csvfile);
                if(!empty($csvfile))
                {
                    $report['array'] = $this->loadcsv($csvfile,0);//read all file by rows
                    //may fail
                }
                $totalitems = count($report['array']);
                if($onpage > 0)
                {
                    $totalpages = ceil($totalitems / $onpage);
                    if($totalpages > 0 && $page > $totalpages) $page = $totalpages;
                //build_pages($totalitems,$page,$onpage,$pagesinrow,$pagingurl)
                    $$pagingvar = $this->build_pages($totalpages, $page, $onpage, 
                        $params['pagelinks'], $params['pagingurl']);
                }
                
                if(count($report['array']))
                {
                    //sys_log($this->_template.': '.$report['attr']['name'].' '.count($report['array']));
                    while($$itemvar = each($report['array']))/*CHANGIVE CONDITION ? TOO SLOW*/
                    {
                        
                        
                        if(is_array(${$itemvar}[1]))
                            ${$itemvar} = ${$itemvar}[1];//value = array//fuck keys!!empty($csvfile) && 
                        $it = & $$itemvar;    
                        //echo "<pre>";print_r($it);echo "</pre>";exit;
                        //sys_log($this->_template.': '.$report['attr']['name'].' '.var_export($item[1],true));

                        if($onpage == 0 || (($line >= ($page - 1)*$onpage) && ($line < $page * $onpage)))
                        {
                            //if($wedocsv)
                                //$it = implode(';',trim($it));
                            if(!empty($params['callback'])) $params['callback']($it);
                            if(!empty($uid) && ((is_array($it) && $it[0] == $uid) || (!is_array($it) && $it == $uid)))
                                $it['selected'] = $params['select'];
                            //css class for swaping colors
                            $lO = $line % 2;//0 1
                            eval("\$$reportvar .= \"".$titem."\";");//$tengine -> addBlock????
                        }
                        $line ++;
                    }
                    eval("\$replace = \"".$tbox."\";");
                }
                else //empty
                    eval("\$replace = \"".$tempty."\";");
            }
            elseif(!empty($query) && !defined('NODB'))
            {//do report of sql file, 
                if($onpage > 0)
                {
                    $query = preg_replace("/SELECT\s+(.*?)FROM/is","SELECT SQL_CALC_FOUND_ROWS $1 FROM",$query,1);

                    $start = ($page-1)*$onpage;
                    $query = preg_replace("/LIMIT\s+[0-9]+(\s?,\s?[0-9]+)?/i","",$query);
                    $query .=" LIMIT $start,$onpage";
                }
                    
                //sys_log($uid);
                $requery = false;
                $ritems = $DB->select($query);
                if($onpage > 0)
                {
                    $totalitems = $DB->selectCell("SELECT FOUND_ROWS()");
                    $totalpages = ceil($totalitems/$onpage);
                    if($totalpages > 0 && $page > $totalpages)
                    {
                        $page = $totalpages;//need requery
                        $requery = true;
                    }
                    $$pagingvar = $this->build_pages($totalitems, $page, $onpage, 
                    $params['pagelinks'], $params['pagingurl']);
                }
                if($requery)
                {
                    $start = ($page-1)*$onpage;
                    $query = preg_replace("/LIMIT\s+[0-9]+(\s?,\s?[0-9]+)?/i","",$query);
                    $query .=" LIMIT $start,$onpage";
                    $ritems = $DB->select($query);
                }
                if($ritems && $DB->numRows($ritems))
                {//do report
                    $line = 0;
                    while($$itemvar = $DB->fetch($ritems))
                    {
                        $it = & $$itemvar;
                        if(!empty($params['callback'])) $params['callback']($it);
                        if(!empty($uid) && $it[0] == $uid) $it['selected'] = $params['select'];
                        //sys_log($it);
                        $lO = $line++ % 2;//0 1
                        eval("\$$reportvar .= \"".$titem."\";");//$tengine -> addBlock????
                    }
                    @eval("\$replace = \"".$tbox."\";");
                }
                else
                {//empty 
                    eval("\$replace = \"".$tempty."\";");
                }
            }
            //sys_log($report['_origin']."\r\n---------------------\r\n".$replace);
            //file_put_contents('repl'.$report['attr']['name'].'.html',$this->content);
            //file_put_contents('repl'.$report['attr']['name'].'2.html',$report['_origin']);
            $this->content = str_replace($report['_origin'],$replace,$this->content);
            //replace
            unset($replace);
            unset($$reportvar);
        }
    }
    function build_pages($totalitems,$page,$onpage,$pagesinrow,$pagingurl)
    {
        foreach($this->globals as $varname)
            global $$varname;
        extract($this->vars);
        foreach($this->vars as $varname=> $varvalue)
            eval("\$$varname = \"".$varvalue."\";");
        //----------------------------------------
        $totalpages = ceil($totalitems / $onpage);
        $pagesHTML = '';
        if($totalpages > 0 && $totalitems > $onpage)
        {//we have to output paging
            $startpage = floor(($page-1) / $pagesinrow) * $pagesinrow + 1;// start from
            $startdec = floor(($page-1) / $pagesinrow);

            //if($page > 30) $paging.= "<a href='./gotkat-$cat-1.html'>в начало&lt;&lt;</a>&nbsp;&nbsp;";
            if($startdec > 0)
            {
                $pageurl = sprintf($pagingurl,$startpage-1);
                eval("\$items.=\"".$this->loadt('pager/_left_inc')."\";");
            }
            $pagenum = $this->loadt('pager/_page_num');
            for($i = $startpage; ($i < $startpage + $pagesinrow) && $i <= $totalpages ;$i++)
            {
                $pageurl = sprintf($pagingurl,$i);
                if($i != $page)
                    eval("\$items.=\"".$pagenum."\";");
                else
                    eval("\$items.=\"".$this->loadt('pager/_page_cur')."\";");
            }    
            if($startdec < floor($totalpages / $pagesinrow))
            {
                $pageurl = sprintf($pagingurl,($startpage+$pagesinrow));
                eval("\$items.=\"".$this->loadt('pager/_next_inc')."\";");
            }
            eval("\$pagesHTML=\"".$this->loadt('pager/default')."\";");//Override
        }
        return $pagesHTML;
    }

как видно. по теме это последняя функция.
здесь просто округление, нет никаких заворотов со строками (это ошибочная логика)
$totalpages = ceil($totalitems / $onpage);


--------------------
PM MAIL WWW ICQ   Вверх
Blaga
Дата 21.10.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Так, по коду от skyboy. Короче опять глючит... smile 
Для наглядности сделал скрины вот они:
user posted image

user posted image
А вот мой подпраленый код(глючит который)
Код

if(isset($_GET['page']))
 $page= $_GET['page'];
else
 $page= 1;

$records_per_page= 4; // по 20 записей будет отображаться на странице
$q= "SELECT count(*) FROM ".PREF."blog";
$query= mysql_query($q) or die ("нельзя так делать");

if($query && $row= mysql_fetch_array($query, MYSQL_NUM))
{
 echo 'total there are '.$row[0].' records...<br><br>';
 $page_count= floor($row[0] / $records_per_page); // количество страниц
 $page_count = $page_count+1;
 if($page > $page_count || $page<1) // проверим на "валидность" номер страницы
  $page= 1;
 echo 'Страница: ';
 for($i= 0; $i< $page - 1; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';
 echo $page.' |'; // текущая страница будет отображаться не ссылкой, а простым текстом
 for($i= $page; $i< $page_count; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';

  $q= "SELECT id, name_b FROM ".PREF."blog ORDER BY id LIMIT ".($page-1)*$records_per_page.",".$records_per_page;
  $query= mysql_query($q);
 if($query)
 {
   echo '<table><tbody>';
   while($row= mysql_fetch_array($query, MYSQL_NUM))
    echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td></tr>';
   echo '</tbody></table>';
 }
}

Вот так... 
Сейчас буду смотреть то что дали мне Piphon и Vaulter. Спасибо всем кто помогает. )

Добавлено @ 17:35 
Piphon, вроде не сложно, попробую.
Vaulter, скажем так для меня это очень сложно... Там что то даже про шаблоны которые я не использую. Но все же посмотрю, мож чего и получиться.


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
skyboy
Дата 21.10.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



мдя. писал на работе, без отладки - отсюда и ошибки.
значит, так.
строки 18-19 меняются на 
Код

for($i= 1; $i< $page - 1; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';

а строки 21-22
Код

 for($i= $page + 1; $i<= $page_count; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';

А ты бы сам глянул: там обе страницы ведь имеют номер "1". Со счетчиком ошибся.
PM MAIL   Вверх
Blaga
Дата 21.10.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Так, с примером от Piphon я так и не разобрался...smile Чет не хочет. Совсем я отупел видать..  smile 
 
skyboy, изменял я, смотрел... Я в этих циклах уже запутался давно... Не по глазам мне это было...smile Короче сейчас почти все показывает кроме того что на второй странице не показывает ссылку на первую. Попробую поиграться, но ты все же поглди тож. ок? smile 
Спать хочу... smile 
ЕЩЕ ОДНА БЛАГОДАРНОСТЬ ВСЕМ КТО ПОМОГАЕТ!!!


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
skyboy
Дата 21.10.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



опять же строки 18-19:
Код

for($i= 1; $i< $page; $i++)
  echo '<a href="?page='.$i.'">'.$i.'</a> |';

мдя. ошибок же наделал  smile 
PM MAIL   Вверх
Blaga
Дата 22.10.2006, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЛамМер++
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 15.11.2005
Где: г. Иркутск

Репутация: 2
Всего: 4



Ура!!! smile  Если бы не ты, skyboy, я бы так и сидел с этой фигней... Вчера что только не делал...smile С меня + и добавлю тебя в список разработчиков скрипта.  smile   smile 


--------------------

http://displayart.ru - Обои.
http://a2themes.ru - Сайт о движках DLE, phpBB3, WordPress.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.