IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Разбиение каталога ссылок постранично. (https://www.imho.ws/showthread.php?t=91777)

mihas 30.08.2005 16:02

Разбиение каталога ссылок постранично.
 
Ребята, надо мне помочь :) Незная PHP тяжело на нем программировать. Я уже это понял. А изучать с самого начала много времени нужно. Ну в общем есть у меня скрипт каталога ссылок и выдается этот каталог весь на одной странице. Это очень весело, но если в каталог наберется пару сотен ссылок, то такая страница будет час открываться. Вобщем мне нужно этот каталог разбить постранично. Может объясните на пальцах и в примерах ? :biggrin: Или я вам скрипт этот вышлю для корректировки. Заранее благодарен.

Trotil 30.08.2005 20:29

А эти ссылки где хранятся? В БД (MySQL), или в отдельном файле, или еще как?

mihas 30.08.2005 20:58

Ссылки хранятся в базе MySQL.

aoxyz_30330 30.08.2005 21:56

тада все просто ... определяеш количество саписей в таблице, делаеш сапрос и укасиваеш w нем интервал с откуда по куда ...
вот пример:
SELECT * FROM table LIMIT 10 , 20

патом пишеш на странице линки на все страници ...
пример линка:
<a href=index.php?page=10>10</a>

и собсна все ...

SergoZD 30.08.2005 22:49

Гораздо проще будет так сделать.

Допустим 5 страниц, в каждой по 20 линков.

Внизу странички где-нить цикл, выводящий список страниц.

PHP код:

$i=1;
while (
$i<=5)
{
echo 
"<a href=link.php?id=".$i.">Страница ".$i."</a>";
if (
$i!=5)
{
echo 
" | ";
}
$i++;


В начале страницы проверка на валидность id:

PHP код:

if(!isset($id))
{
   
$id=1;
}
else
{
   if(!
is_int($id))
   {
      
$id=1;
   }
   else
   {
      if (
$id<or $id>5)
      {
         
$id=1;
      }
   }


Ну и сам вывод организуй.

В качестве скрипта используй то, что есть там, только сам запрос слегка модифицируй:

PHP код:

$start=($i-1)*20+1;

$sql="SELECT * FROM table LIMIT 20, ".$start

Т.е. в конец запроса добавь LIMIT.... (либо если есть какой-то, то замени)

Вот, вроде так. Если что, не серчайте ;)

mihas 30.08.2005 23:02

Ребята, спасибо огромное, я попробовал разобраться, но не выходит ничего. Может быть я код кину а вы посмотрите. Вот он
PHP код:

<?php
include "config.inc";

if (!@
mysql_connect($db_host,$db_user,$db_pass)) {
  print 
"Ошибка соединения с mysql: ".mysql_error()."<br>";
 }
 else {
  if (!@
mysql_select_db($db_name)) {
   print 
"Ошибка удаленного сервера, такой базы не существует: ".mysql_error()."<br>";
  }
  else {
   
$db_query = @mysql_query("SELECT * FROM $tb_linex");
   
$db_result = array(); $ibx 0;
   if (!
$db_query) {
    print 
"Ошибка чтения из таблицы: ".mysql_error()."<br>";
   }
   else {
    while (
$row = @mysql_fetch_row($db_query)) $db_result[$ibx++] = $row;
   }
  }
 }

///Выводим линки в базу данных...
 
for ($xi=0;$xi<count($db_result);$xi++)
{

$linex_array $db_result[$xi];

print
" <a href=\"$linex_array[1]\">$linex_array[3]</a> : ID - $linex_array[0] <br>";
}
@
mysql_close();

?>

Тут linex_array[1] это адрес сайта, $linex_array[3] это описание сайта и $linex_array[0] номер сайта.

SergoZD 30.08.2005 23:10

mihas
Ну а в чем трабла, мой пост присобачь к своему и все ок будет.
В первом коде link.php - адрес страницы каталога. Его замени.
Добавь его после
@mysql_close();

Во втором коде ничего менять не надо, пихни его после
include "config.inc";

ну а третий код, вот для твоего случая:

$db_query = @mysql_query("SELECT * FROM $tb_linex");
замени на
$db_query = @mysql_query("SELECT * FROM $tb_linex LIMIT 20, ".$start);

mihas 30.08.2005 23:25

SergoZD
Спасибо за помощь. Трабла в моем практически полном незнании PHP :biggrin:
Сделал все как ты сказал, появились внизу страницы, но ссылки пропали. Дает ошибку
Цитата:

Ошибка чтения из таблицы: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Ошибка исчезает при возврате строки
Цитата:

$db_query = @mysql_query("SELECT * FROM $tb_linex");

SergoZD 30.08.2005 23:30

Исправь так попробуй:

$start=($i-1)*20;

и

$sql_query="SELECT * FROM ".$tb_linex." LIMIT ".$start.", 20";
$db_query = @mysql_query($sql_query);

mihas 30.08.2005 23:37

Вот гад, не хочет. Та же ошибка, но на конце
Цитата:

near '-20, 20' at line 1

SergoZD 30.08.2005 23:40

а у тебя там в таблице есть хотя бы 20 линков?
Можешь дать ссылку на страницу эту, если она в нете?

Я с mysql пока ещё оч. мало успел поработать, поэтому не совсем разобрался в тонкостях синтаксиса, пока не соображу в чем трабла.

Trotil 30.08.2005 23:44

Хм... Замени
$start=($i-1)*20; на
$start=($id-1)*20;

Цитата:

Сообщение от SergoZD
пока не соображу в чем трабла.

ну ты наверно понял, в чем трабла...

mihas 30.08.2005 23:54

О. Вот это уже по моему оно. Спасибо ребята. Очень благодарен, правда. Только последний вопрос, заключительный. Вот эта ссылка
Цитата:

echo "<a href=link.php?id=".$i.">Страница ".$i."</a>";
Дело в том, что моя страница с ссылками уже имеет вид типа
Цитата:

http://страница..ру/base.php?ssilka=link
Как сформировать адреса страниц в этом случае?

SergoZD 30.08.2005 23:56

echo "<a href=http://страница..ру/base.php?ssilka=link&id=".$i.">Страница ".$i."</a>";

Важно проследить, чтобы этот переменная id не использовалась в других скриптах на странице, если где-то ещё встречается, то замени на другую.

mihas 31.08.2005 00:11

Ага, почти нормально. Переменная id нигде не используется, уже просмотрел. Только я что то не пойму. В данном случае количество ссылок на страницу 20? Ведь так понял? Если да, то у меня что то не выходит. Я меняю 20, например на 2, на первой странице 2 ссылки и на втрой эти же 2 и т.д.

Т.е. на всех страницах одно и то же.

Trotil 31.08.2005 00:18

Если смотреть на код, то такого в принципе не должно быть. Mihas, нужны уточнения:
1) Ссылки на сгенеренной странице имеют вид:
Цитата:

Страница 1
Страница 2
Страница 3
...
???

mihas 31.08.2005 00:21

Так точно. Только в одну строчку а не друг под другом, что не принципиально. И ссылки формируются правильно, т.е. в конце ссылки Страницы 1 id=1, страницы 2 id=2 и т.д.
Но при нажатии страница с ссылками не меняется, на всех страницах одно и тоже.

Даже если все оставить как есть, т.е. с 20, все страницы одинаковы.

SergoZD 31.08.2005 00:23

mihas
Фишка в проверке валидности id

Замени

PHP код:

if(!isset($id)) 

   
$id=1

else 

   if(!
is_int($id)) 
   { 
      
$id=1
   } 
   else 
   { 
      if (
$id<or $id>5
      { 
         
$id=1
      } 
   } 


на
PHP код:

if(!isset($id)) 

   
$id=1

else 


   
$id=intval($id);

      if (
$id<or $id>5
      { 
         
$id=1;
      } 



Trotil 31.08.2005 00:26

А! Доперло! Вот здесь исправляй:
Вместо:
PHP код:

if(!isset($id)) 

   
$id=1

else 

   if(!
is_int($id)) 
   { 
      
$id=1
   } 
   else 
   { 
      if (
$id<or $id>5
      { 
         
$id=1
      } 
   } 


на
PHP код:

if(!isset($_GET['id'])) 

   
$id=1

else 

   if(!
is_int($_GET['id'])) 
   { 
      
$id=1
   } 
   else 
   { 
      if (
$_GET['id']<or $_GET['id']>5
      { 
         
$id=1
      }  else  
$id$_GET['id'];

   } 



mihas 31.08.2005 00:29

:idontnow: к сожалению ничего не изменилось.

Вот черт, ни так, ни так не работает.

Trotil 31.08.2005 00:42

Уффф... Запусти
PHP код:

 if(!isset($_GET['id'])) 

   
$id=1;
    echo 
"<br>Переменая не определена<br>";

else 

   if(!
is_int($_GET['id'])) 
   { 
      
$id=1
       echo 
"<br>Переменная - не целое число!<br>";
      
   } 
   else 
   { 
      if (
$_GET['id']<or $_GET['id']>5
      { 
         
$id=1
         echo 
"<br>Значение переменной выходит за положенные рамки<br>";

      }  else  
$id$_GET['id']; 

   } 


Это код поможет выяснить на каком этапе происходит присваивание $id=1. Пиши результаты.

mihas 31.08.2005 00:46

Переменная не определена.

Trotil 31.08.2005 00:50

Да, кстати, какая версия php? (нужно запустить phpinfo())

PS: Сейчас решил быстро все это проверить на своем сайте. Думаю, ошибка будет найдена окончательно и бессповоротно.

mihas 31.08.2005 01:01

Версия 5.0.4

в принципе если нужно, то давай я весь скрипт сброшу, может быть так проще будет

Trotil 31.08.2005 01:12

PHP код:

if(!isset($_GET['id']))
{
   
$id=1;
    echo 
"<br>Переменая не определена<br>";
}
else
{
     
$id=intval($_GET['id']);

      if (
$id<or $id>4)
      {
         
$id=1;
         echo 
"<br>Значение переменной выходит за положенные рамки<br>";

      }


Вот этот код у меня работает как надо.

mihas 31.08.2005 01:28

Ничего не понимаю. Но я точно делаю все правильно. При таком раскладе я получаю сообщение переменная не определена и к этому все ссылки пропали. Нет вообще ни одной не на одной странице.

Стоп стоп, я лоханулся немного, сейчас еще попробую.

Нет, все равно все по старому. Переменная не определена, и содержимое страниц одинаково, одни и те же ссылки на всех страницах.

Trotil 31.08.2005 01:40

Так, если ты думаешь, это все проблемы, то ты глубоко ошибаешься. :) Было бы грамотно знать, сколько ссылок типа "Страница 1, Страница 2, ..."нужно генерить, чтобы получить на выборку все возможные ссылки, ведь число ссылок может измениться.
Нам поможет такой запрос к базе данных:
Цитата:

$query = 'SELECT COUNT(*) as num FROM $tb_linex;
Единственное поле "num" будет как раз и содержать количество ссылок в базе данных. Помести его в какую-нибудь переменную, например $num. А далее нужно подсчитать, сколько страниц, потребуется, чтобы выдать все ссылки из базы данных. Это достигается таким образом:
заменой
Цитата:

while ($i<=5)
на
Цитата:

$num=intval($num/20)+1;
while ($i<=$num)
Ворнемся к нашей проблеме:
Цитата:

Сообщение от mihas
Нет, все равно все по старому. Переменная не определена, и содержимое страниц одинаково, одни и те же ссылки на всех страницах.

У меня PHP версии 4.3.11, Там этот код работал нормально. В особенностях пятой версии еще не разбирался, но не думаю, что в этом дело.

SergoZD 31.08.2005 01:53

mihas
Открой ссылку /base.php?ssilka=link&id=1
И скажи что написалось.

"Переменая не определена"?

Со ссылками потом разберемся, это одно из самых простых, просто на момент текущих изменений они не будут отображаться.
Главное сейчас разобраться, как это id передавать от страницы к странице.

mihas 31.08.2005 02:04

Так, по порядку, код из лички запустил, получил следующее
Цитата:

Переменая не определена


Это страница 1

Страница 1 | Страница 2 | Страница 3 | Страница 4 | Страница 5
С предыдущего поста изменения внес, но показывает теперь только одну страницу. Второй нет. Например я делаю 2 ссылки на страницу. Показывает страница 1 с двумя ссылками а второй страницы просто нет.
Вот тут
Цитата:

$query = 'SELECT COUNT(*) as num FROM table_tb';
все правильно? Может нужно tb_linex в конце?

Все сделал. Теперь выходит, что есть только первая страница. Например у меня 3 ссылки, я меняю в коде 20 на 2, должно быть 2 страницы, но показывает только одну с двумя ссылками.

Trotil 31.08.2005 02:05

Цитата:

Переменая не определена


Это страница 1

Страница 1 | Страница 2 | Страница 3 | Страница 4 | Страница 5
Ну а если по ссылкам пощелкать? Это понятно, что она в самом начале будет неопределена, т.к. в URL мы ее не передаем. Будут страницы переключаться? Т.е появляться надписи "Это страница 2" и т.д?

Цитата:

все правильно? Может нужно tb_linex в конце?
Исправил, см. выше. Но пока не берись за этот код, пока не заставишь правильно генерить страницы с предопределенными параметрами.

mihas 31.08.2005 02:22

Нет. Есть только надпись Страница 1 с двумя ссылками, надписи страница 2 нет вообще. Если же в адресной строке браузера набрать ссылку на вторую страницу , т.е. в конце id=2 опять же ничего не происходит, вторая страница полностью идентична первой, одинаковое содержимое.

Ой, я тебя не понял, ты про тот код, что в личку скинул. Да, там все работает, при нажатии на страницы идет переключение.

А может быть сама ссылка сформирована не правильно
Цитата:

base.php?ssilka=link&id=1
Может как то по другому нужно?

Trotil 31.08.2005 02:23

Ну тогда у тебя все данные для решения поставленной задачи уже есть. Смотри:

1) Есть код, который генерит правильные ссылки (см. мой код в личке или код SergoZD)
2) Переменная $id точно проходит через нашу многострадальную проверку валидности как надо (это потверждается надписями "Эта страница 1", "Эта страница 2"...)
3) переменная $start=20*($id-1) принимает значения 0, 20, 40... (а с чего бы ей их не принимать?)

Если все это соединить воедино, то запрос
Цитата:

$sql_query="SELECT * FROM ".$tb_linex." LIMIT ".$start.", 20";
должен выдавать разные ссылки, каждый раз по 20 штук новых.

Ищи ошибку и делись своими идеями.

Цитата:

А может быть сама ссылка сформирована не правильно
base.php?ssilka=link&id=1
С точки зрения синтаксиса все правильно. А за что отвечает у тебя $ssilka? Она не может помешать правильному формированию страницы?

mihas 31.08.2005 02:41

Все. Я все понял. Ты прав на все 100. Проблема в этой ссылке. Вот только как исправить. Надо было сразу весь скрипт выкладывать. Незнаю как объяснить. Короче это система автоматического обмена ссылками. Этот файл с которым мы воевали, находится на центральном сервере. На сайтах, которые регистрируются в системе обмена линками лежит маленький php файл, который забирает информацио с центрального сервера и таким образом формирует каталог. Поэтому и ссылка такая. Незнаю понятно ли я объяснил. Давай я тебе на мыло скрипт кину, так понятнее будет.


Часовой пояс GMT +4, время: 08:05.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.