Forum Webscript.Ru

Программирование => PHP => Тема начата: bhor от 30 Января 2002, 15:41:23

Название: 1 2 3 .... last
Отправлено: bhor от 30 Января 2002, 15:41:23
Есть каталог в нем 300 наименований. На странице показывается 20 наименований. Как сделать чтобы было например как на этом форуме (1 2...10... last)
Помогите

Ооо. Как раз и у меня 300:super:
Название: 1 2 3 .... last
Отправлено: Britva от 30 Января 2002, 19:08:36

function getPages($total, $page, $link, $perpage) {
$mpp = $perpage;
$prev_page = $page - 1;
$next_page = $page + 1;

if ($total <= $mpp) $pages = 1;
elseif($total % $mpp == 0) $pages = $total / $mpp;
else $pages = $total / $mpp + 1;
$pages = (int) $pages;

$s_pages = $page<10 ? 1 : floor($page / 10) * 10;
$e_pages = $page + 9;

if ($e_pages > $pages) {
$e_pages = $pages;
}

$s = "";

if($prev_page != 0) $s = "<< \\n";
if($prev_page) {
$s .= "< \\n";
}

for($i=$s_pages;$i<=$e_pages;$i++) {
if ($i != $page) {
$s .= "$i \\n";
} elseif ($i != 1) {
$s .= " $i ";
} elseif ($page != $pages) {
$s .= " 1 ";
}
}
if($page != $pages) {
$s .= "> \\n";
$s .= ">> \\n";
}

return $s;
}


а вызывать, например

$print_pages = getPages($total, $page, "$PHP_SELF?param1=1& param2=2&", $pp);
где $total - всего записей, $page - текущая страница, $pp - кол-во записей на страницу.
Название: 1 2 3 .... last
Отправлено: Dj Fly от 30 Января 2002, 19:37:13
Или вот такой вариант, какой больше нравится


require("дляSQLконнекта.php");

@$result=mysql_query("select * from таблновост order by id desc");
@$n=mysql_num_rows($result);
$ppp=5;
$numpages=ceil($n/$ppp);
if(isset($pagenum))
   {
     if($pagenum==$numpages)
{$pagestart=($pagenum-1)*$ppp;$pageend=$n;}
     else
{$pageend=$pagenum*$ppp;$pagestart=$pageend-$ppp;}
   }
else
   {
if($numpages<=1){$pagestart=0;$pageend=$n;}
else{$pagestart=0;$pageend=$ppp;}
   }
for($i=$pagestart;$i<$pageend;$i++)
{
 @$postdate=mysql_result($result,$i,\'postdate\');
 @$newstext=mysql_result($result,$i,\'newstext\');
 @$header=mysql_result($result,$i,\'header\');
 print "

".$header." -::- ".$postdate."

";
 print "

".$newstext."

";
}
if($numpages>1)
 {
print "

Pages: ";
?>
1
for($i=2;$i<=$numpages;$i++)
{?>
  >

 }
#############
?>


Его реализация на http://www.digitals-pace.com/home.php

Единственно что, я пока его тестировал - запихивал кучу новостей, а сейчас - чистовой вариант - и новости уже начальник будет пихать, так что пока там их мало...
Название: 1 2 3 .... last
Отправлено: bhor от 31 Января 2002, 11:01:29
Britva
Dj Fly
Спасибо. Щас буду скрещивать ;)
Название: 1 2 3 .... last
Отправлено: AlieN от 31 Января 2002, 20:14:10
while($i<$total_katalog){
           if($i%20==0){
             $b_1="";$b_2="";
             $page_print=$i/20;
             if($page_print==$page){$b_1="[";$b_2="]";}
             print "$b_1$page_print$b_2 ";
            }
           ++$i;
           }
Название: Еще раз о разбивке на страницы....?
Отправлено: Matvey от 13 Марта 2002, 02:04:53
Господа, помогите, предположнм есть массив
$massiv=($test); //например для простоты
                               //в нем порядка 1000 элементов            //необходимо их вывести постранично

что нибудь в духе
$i=0
while ($i<1000)
print"$massiv=($test);"
$i++;
endwhile;

выыедит весь "фарш" на одной странице.
Прочитав все вышесказанное я так и не понял как мне  сделать постраничный вавод :)


Возьмем последний пример господина AlieN~а

while($i<$total_katalog){
if($i%20==0){
$b_1="";$b_2="";
$page_print=$i/20;
if($page_print==$page){$b_1="[";$b_2="]";}
print "$b_1$page_print$b_2 ";
}
++$i;
}

Вроде все понятно, ну и что дальше-то, и ссылочки создаются и нумерация, а как страницы генерируются не понимаю... :(





____________________________________________________
Огромная просьба помогите....
Название: беру мой пример
Отправлено: Britva от 13 Марта 2002, 10:27:50

if(!isset($page)) $page = 1;

$pp = 50; // всего на страницу
$total = sizeof($array); // всего записей

$res = intval($total / $page);
$rem = $total % $page;

if($rem > 0) { $res++; }

$pages = $res; // получили кол-во страниц

$npst = ($page-1)*$pp;
$print_pages = getPages($total, $page, "$PHP_SELF?&", $pp);

print \'pages: \'.$print_pages.\'
\';
for($i=$npst;$i<($npst+$pp);$i++) {
  print array[$i];
}
?>

вроде правильно.
Название: Ответ и вопрос?
Отправлено: Matvey от 14 Марта 2002, 20:51:17
INCLUDE("getpages.inc");

$i=0;
while ($i<1000) {
$i++;
$array[$i]=$i;
}
if(!isset($page)) $page = 1; //если $page не существует, то $page=1
$pp = 50; // всего на страницу
$total = sizeof($array); // всего записей  (число элементов массива $array)
$res = intval($total / $page); //целочисленное значение переменной в десятичной системе счисления.
$rem = $total % $page; //остаток от деления

if($rem > 0) { $res++; }

$pages = $res; // получили кол-во страниц
$npst = ($page-1)*$pp; // в начале 0
$print_pages = getPages($total, $page, "$PHP_SELF?&", $pp); //задействовали функцию
print "";
print "";
print "";
print "";
print "";
for($i=$npst;$i<($npst+$pp);$i++) {
print "
$print_pages
";
print "";
print "";
print "";
print "";

}
?>
 Пример работает на ура, большое спасибо,  НО моя проблема заключается в том, то вышеуказанный код вызывается не из самого скрипта, а из библиотеки ( и является функцией).
Например код находится в файле test.inc и заключен между
function view()
{
..............
.............
}
 Тогда...---->



        Untitled



INCLUDE("test.inc")
view();
?>


 Почему-то в этом случае выводиться заголовок, выводится первая страница, но при нажатии на ссылочки (1 2 3 ...) не происходит.
 Как с этим бороться?
Мне кажется, что  дело в "$PHP_SELF?&", но я не уверен.
ПОМОГИТЕ ПОЖАЛУЙСТО..... :(
Название: Добавлю....
Отправлено: Matvey от 14 Марта 2002, 20:55:38
Добавлю, что этот пример как тест, задача решается естественно совершенно иная, и выглядет там все гораздо страшней... :)
Название: 1 2 3 .... last
Отправлено: AlieN от 15 Марта 2002, 12:19:15
Элементарно:
ты просто модульделай без функций т.е. он запускается по вызову и ему уже ничего передавать не надо разве глобализацию тебе придётся сделать
у меня так сделано вот сурс:

function print_type($name,$path,$comment)
{
print \'
$array[$i]

   
     
   
 

       
         
           
         
         
           
           
         
       

             
\'.$name.\'

           
\'.$comment.\'  Смотреть

     

\';
}
if(!$path && !$img)   
{
 $handle = opendir(\'raboty\');
 while (false !== ($file = readdir($handle)))
   {
     if ($file != "." && $file != "..")
    {
    $file1="raboty/$file";
   $infofile="$file1"."/"."info.txt";
   if(is_dir($file1) && file_exists("$infofile"))
      {
      $infodata=file("$infofile");
      $name=rtrim($infodata[0]);
      $path=$file;
      $comment=$infodata[1];
      print_type($name,$path,$comment);
      }
       }
   }
$path=null;
}
if($path && !$img)   
{
 if(!$page){$page=1;}
 $file_img="raboty/"."$path"."/"."$page".".jpg";
 $file_plan="raboty/"."$path"."/"."$page"."_1".".jpg";
 $file_info="raboty/"."$path"."/"."$page".".txt";
 if(file_exists($file_img)){print "  ";}
 if(file_exists($file_plan)){print "  ";}
 if(!file_exists($file_img)){print "
Фотография отсуствует
";}
 if(file_exists($file_info)){readfile($file_info);}
 $count=1;
 $img_file="raboty/"."$path"."/"."1.jpg";
 print "

";
 while(file_exists($img_file))
    {
    if($count==$page){print "";}
   print "$count";
    if($count==$page){print "
";}
    print " ";
    ++$count;$img_file="raboty/"."$path"."/"."$count".".jpg";
   }
}
// СДЕЛАТЬ ПРОТОКОЛИРОВАНИЕ НА КРИВЫЕ КАРТИНКИ
if($img && $pic && $type)
{
$file="raboty/".$img."/".$pic.".jpg";
$src_img=imagecreatefromjpeg($file);
if($type=="mini"){
              $w=250;              
              $h=intval(imagesy($src_img)/(imagesx($src_img)/250));              
             }
if($type=="full"){$w=imagesx($src_img);$h=imagesy($src_img);}
header("Content-type: image/jpeg");
$im=ImageCreate($w,$h);
ImageCopyResized($im,$src_img,0,0,0,0,$w,$h,ImageSX($src_img),ImageSY($src_img));
imagejpeg($im);
}
?>

Вызываётся он инклудом из главного файла index.php сам он jobs.php
Название: Там еще проблемка...
Отправлено: Matvey от 15 Марта 2002, 21:40:57
Alien это я пишу еще до теста твоего примера, если делать как я писал выше, то ошибка кроется в потере переменных, т.е. при вызове функии getpages, (хоть include, хоть в теле php, который вызываем) например

PHP:--------------------------------------------------------------------------------
INCLUDE("getpages.inc");

$i=0;
while ($i<1000) {
$i++;
$array[$i]=$i;
}
if(!isset($page)) $page = 1; //если $page не существует, то $page=1
$pp = 50; // всего на страницу
$total = sizeof($array); // всего записей (число элементов массива $array)
$res = intval($total / $page); //целочисленное значение переменной в десятичной системе счисления.
$rem = $total % $page; //остаток от деления

if($rem > 0) { $res++; }

$pages = $res; // получили кол-во страниц
$npst = ($page-1)*$pp; // в начале 0
$print_pages = getPages($total, $page, "$PHP_SELF?&", $pp); //задействовали функцию
print "";
print "";
print "";
print "";
print "";
for($i=$npst;$i<($npst+$pp);$i++) {
print "
$print_pages
";
print "";
print "";
print "";
print "";

}
?>
PHP:--------------------------------------------------------------------------------
Вот ример который приведен выше он работает, но как только я изменяю
while ($i<1000) {
$i++;
$array[$i]=$i; }
 положем на

while ($i<$kolvo) {
$i++;
$array[$i]=$i; }

где $kolvo задается не явно ($kolvo=1000;), а передается из другой формы, то превое отображение в норме (первый вызов getpages), но второе и последующее к сожалению нет. Проследил теряется значение $kolvo, попытался обозвать GLOBAL, ноль имоций и даже STATIC, как сделать чтобы getpages заодно возвращала и другие преременные, пускай переданные ей насельно и не используемые
getPages($total, $page, "link", $pp, $kolvo)  ;) ?
Название: 1 2 3 .... last
Отправлено: AlieN от 15 Марта 2002, 21:52:43
сделай инит кол-ва т.е. хотябы проверь передано ли оно главному скрипту если не поможет - кинь сурс
kex_net@mail.ru (kex_net@mail.ru)
Название: AlieN
Отправлено: Matvey от 16 Марта 2002, 01:59:57
У меня уже параноя скоро начнется, измучился, вообщем добился я того чтобы  на странички разбивалось все что надо, пришлось в параметре
getPages($total, $page, $linc, $pp , $tttt);  добавить еще одну возвращаемую переменную ($tttt- количество записей), но возникла другая проблемма, возможно я не с внимательно читаю оитературу, но ради бога объясните почему например
test.php
INCLUDE \'bbb.inc\'
-----
----
print "$www";

?>

____________________  
bbb.inc
GLOBAL $www;
--------
$www=666;
?>
_____________________

переменная не видится, во вторых почему иногда в годе пишется В третьих обясните как сделать чтобы переменные были видны из включаемых библиотек,
 И самое интересное, допустим есть массив $array=////
ну вообщем в нем много всего $array[1]=1
array[2]=2 и т.п.

почему он толком не передается при
ааа($array) - function в каком-нибудь INCLUDе

Или
возвращаясь к началу разговора
getPages($total, $page, $linc, $pp , $array);  массив не передается.
__________________________________________________
Короче господа, если не лень научите обявлять глобальные массивы и передавать их целиком в какие-нибудь управляющие функции.
И что за зверь return т.к. его вызов ни к чему хорошему не приводит, я всегда пологал, что эта ф-ция возвращает значение функции и прерывает ее действие, но тут что-то похитрее.... :)
PS/
Если так и дальше пойдет плюну на разбиение постраничное и выложу так как есть ;(
Название: 1 2 3 .... last
Отправлено: AlieN от 16 Марта 2002, 15:39:19
должно всё без global работать если ты не используешь функций а если используешь то объявлешь ей в функции глобальной после её определения а потом в test.php
Название: Вроде Ок
Отправлено: Matvey от 16 Марта 2002, 16:24:13
После долгих мучений все заработало, я использую функции и при передаче параметров приходится очень много лишнего тащить, избавиться от этого можно если передавать массив в getPages($total, $page, $linc, $pp , $array), но почему-то массив не передается
 как передать массив
$array[$i] - всего-то?
Название: 1 2 3 .... last
Отправлено: AlieN от 16 Марта 2002, 16:27:55
function getpages($total,$page,$link,$pp,$array)
{
блабла
}
Название: ДОП.
Отправлено: Matvey от 17 Марта 2002, 02:37:16
$s .= "> \\n"; - не работает...
Название: например
Отправлено: Britva от 17 Марта 2002, 03:00:11
$array_url = "";
reset($array);
while(list(, $s) = each($array)) {
    $array_url .= "array".urlencode("[]")."=".urlencode("$s")."&";
}
$pages = getPages($total, $page, "search.php?var1=$var1&var2=$var2&".$array_url, $page_limit);
Название: 1 2 3 .... last
Отправлено: AlieN от 17 Марта 2002, 12:57:36
Цитировать
">


$array- массив
Название: 1 2 3 .... last
Отправлено: Britva от 17 Марта 2002, 13:52:02
Цитировать
$array- массив

ну я и написал пример как передавать массив через урл
Название: Прод.
Отправлено: Matvey от 18 Марта 2002, 15:41:54
$array[$i]="что-то"
$i=1..1000; - например
getpages($total,$page,$link,$pp,$array) - будет работать?
Название: э
Отправлено: Britva от 18 Марта 2002, 16:26:10
а почему нет?
просто добавь код в getPages и еще один аргумент
Название: 1 2 3 .... last
Отправлено: AlieN от 18 Марта 2002, 16:46:18
$pages = getPages($total, $page, "search.php?var1=$var1&var2=$var2&".$array_url, $page_limit,$array);
Он про это

PS предпоследнее сообщение не тебе
Название: гы
Отправлено: Britva от 18 Марта 2002, 16:59:20
Цитировать
$pages = getPages($total, $page, "search.php?var1=$var1&var2=$var2&".$array_url, $page_limit,$array);

зачем два раза дублировать то? array_url и $array

а про массив, он не может не передаваться, в крайнем случае внутри функции getPages добавить строку
settype($array, "array");

Цитировать
PS предпоследнее сообщение не тебе

эээ, а кому?...
Название: 1 2 3 .... last
Отправлено: AlieN от 18 Марта 2002, 17:30:51
Цитировать
эээ, а кому?...

Матвею на сообщение перед твоим :)
Название: Спасибо, .....
Отправлено: Matvey от 19 Марта 2002, 00:39:01
Всем спасибо, я вас наверное уже замучал, у меня все работает, просто хочестся чтобы код бы более красивым и читабельным.
Название: 1 2 3 .... last
Отправлено: alesh от 17 Апреля 2002, 10:46:48
2 britva:
В твоем примере
$s=""
Это и есть тело ?
Название: 1 2 3 .... last
Отправлено: alex007 от 24 Июня 2003, 23:32:02
А не легче было бы следующим образом:


$limit=20; //сколько показать на странице
$Prev = "Предыдущая";
$Next = "Следующая";
$username="вася пупкин";
$password="что-угодно";
$host="localhost";
$tables="имя db";

$db = mysql_connect($host, $username,$password);
mysql_select_db("$tables",$db);
$numresults=mysql_query("SELECT * FROM ваша_таблица ORDER BY ваша_поле ASC");
$numrows=mysql_num_rows($numresults);

if (empty($offset)) {
$offset=0;
}


echo "
$array[$i]
";

$sql = "SELECT * FROM ваша_таблица ORDER BY ваша_поле  ASC limit $offset,$limit ";
$result = mysql_query($sql,$connection) or die("Could not execute query.");
while ($row = mysql_fetch_array($result)) {

echo "

";
}
mysql_free_result($result);


echo "
$row[ваша_поле]
";


$pages=intval($numrows/$limit);

if ($numrows%$limit) {
$pages++;
}

for ($i=1;$i<=$pages;$i++) {
$newoffset=$limit*($i-1);
print "$i \\n";
}


if ($offset>1) {
$prevoffset=$offset-$limit;
print "$Prev \\n";
}


if ($numrows>($offset+$limit)) {
$nextoffset=$offset+$limit;
print "$Next

\\n";
}

Название: 1 2 3 .... last
Отправлено: tomashik от 29 Апреля 2004, 21:22:35
alex007
Я взял твой скрипт - все работает, только вопрос:
как сделать что бы та страница на которой находишься, была не активна (т.е. не ссылка, а просто текст)?
Название: 1 2 3 .... last
Отправлено: alex007 от 29 Апреля 2004, 21:30:08
tomashik
можно через if...else сделать,  вот пример:

for ($i=1;$i<=$pages;$i++) {
$newoffset=$limit*($i-1);
print "$i \\n";
}
Превратить в:
for ($i=1;$i<=$pages;$i++) {
$newoffset=$limit*($i-1);
if ($offset ==$newoffset)  { print "$i \\n";} else {
print "$i \\n"; }
}
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 29 Апреля 2004, 21:54:22
Скрипт весьма кривоват, как и большинство скриптов новичков.
нельзя подсчитывать общее количество записей через селект *
надо использовать count(*)

подсчет количества страниц осуществляется в одну строчку с помощью ceil
Да и остальное можно подсократить изрядно.


tomashik
скрипты надо не "брать" а читать и думать. разбирпаться как они работают и что делают.
Название: 1 2 3 .... last
Отправлено: Sniper от 29 Апреля 2004, 22:55:24
alex007
alex007
А как быть, если id не подряд идут.
То есть некоторые отсутствуют.
Как определить с какой записи начать?
Название: 1 2 3 .... last
Отправлено: Dj Fly от 29 Апреля 2004, 23:02:31
RomikChef
Хм... а ты не обратил внимание, что именно селект всего, далее вытаскивает из базы всё, что надо выводить? :-)
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 30 Апреля 2004, 00:22:44
Sniper
А при чем здесь id?
с какой записи выводить опредяет переменная $offset

Dj Fly
Нет, не обратил. Все, что надо выводить вытаскивает селект НЕ всего.

Оба - носом рыть скрипт, пока не найдете ответы на интересующие вас вопросы.
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 30 Апреля 2004, 00:39:36
Чтобы вам было проще, вот тот же cамый скрипт, но в два раза короче
$limit=20; //сколько показать на странице
$result=mysql_query("SELECT count(*) FROM ваша_таблица);
$row=mysql_fetch_row($result);
$numrows=$row[0];

if (empty($_GET[\'offset\'])) $offset=0;
$sql = "SELECT * FROM ваша_таблица ORDER BY ваша_поле  ASC LIMIT $offset,$limit";
$result = mysql_query($sql,$connection) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
  echo $row[\'ваша_поле\']."
\\n";
}
if ($offset > 1) {
  echo \'Prev \';
}
$pages=ceil($numrows/$limit);
for ($i=0;$i<$pages;$i++) {
  echo \'\'.$i." \\n";
}
if ($numrows > ($offset+$limit)) {
  echo \'Next\';
}
?>
Название: 1 2 3 .... last
Отправлено: alex007 от 30 Апреля 2004, 01:39:29
RomikChef
Скрипт конечно я для себя переделал, но на то время (24-06-03 19:32) он был единственым примером для меня, так как что ljдо сегоднешнего дня все что написано выше - это было просто пустозвонство...

Цитировать
скрипты надо не "брать" а читать и думать

Что я и сделал, но для примера другим дал мой пример.

Цитировать
А как быть, если id не подряд идут.
То есть некоторые отсутствуют.

Да ни каких проблем не видал тогда... Так что RomikChef все правильно написал.
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 30 Апреля 2004, 05:58:34
Цитировать
alex007:
Скрипт конечно я для себя переделал, но на то время (24-06-03 19:32) он был единственым примером

не смешите мои тапочки.
примеров постранички - даже на этом форуме - масса. Не заставляй меня пользоваться поиском вместо тебя.
Не говоря уже о том, что никакой скрипт переделывать не нужно, поскольку и самому его написать элементарно. Если только представлять себе, что хочешь сделать
Название: 1 2 3 .... last
Отправлено: Aku Aku от 30 Апреля 2004, 12:30:07
And my 2 cents. Почему бы вместо самописных скриптов, которые не везде и всегда подходят, не юзать Pear::Pager?
Название: 1 2 3 .... last
Отправлено: Dj Fly от 30 Апреля 2004, 16:42:04
RomikChef
Уж очень много пафоса...
Твой скрипт не в два раза короче, это раз...
Во вторых он также не идеален.
И в третьих, это дурной тон и воспитание выражаться в твоём стиле... Будь добр, выражения типа "рыть носом", применять исключительно к себе, усёк?
Название: 1 2 3 .... last
Отправлено: alex007 от 30 Апреля 2004, 19:22:56
RomikChef
Да я тебя не смешу (но если тебя от пальца вызывает смех, то смейся себе на здоровье), просто какого ... Sniper тогда поднял эту тему, если как ты говоришь/пишешь, что на форуме и везде столько примеров заваолялось...

Цитировать
Не заставляй меня пользоваться поиском вместо тебя.

да и никто и не просит, я это делал.
Название: 1 2 3 .... last
Отправлено: Britva от 30 Апреля 2004, 19:39:40
[off]
Так! Хватит флеймить, если очень хочется, то во флейм, пожалуйста. Форум - не место для выяснения отношений!
Или использовать [ off ]
[/off]
Название: 1 2 3 .... last
Отправлено: Sniper от 30 Апреля 2004, 22:06:43
Aku Aku
как это
Цитировать
Aku Aku:
не везде и всегда подходят
???????

Самописные, я так понимаю это написанные своими руками?
Как они могут не подходить - сам же пишешь, под свои задачи.

а если "юзать Pear::Pager", то и не поймешь никогда как все происходит.
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 01 Мая 2004, 11:38:32
[off]
Dj Fly
мне проще выкинуть тебя за шкирку отсюда. усек?

Цитировать
alex007:
просто какого ... Sniper тогда поднял эту тему, если как ты говоришь/пишешь, что на форуме и везде столько примеров заваолялось...

такого, что он, как и ты, не умеет пользоваться поиском.

Цитировать
alex007:
да и никто и не просит, я это делал.

стоп. Не просишь?
ты же утверждаешь,что до тебя тут ничего на эту тему не было.
сам найдешь, или носом ткнуть?
[/off]
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 01 Мая 2004, 11:42:25
Sniper
Своими, говоришь? ;-)
Название: 1 2 3 .... last
Отправлено: Меняздесьдавнонет от 01 Мая 2004, 14:33:53
Aku Aku
например потому, что скрипты бывают очень маленькие, в 10 раз меньше этого пейджера. а реально постраничка- это 5 строчек. ради них лепить здоровенную либу с кучей настроек?