Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Постраничный вывод


Автор: No_Mad 13.8.2004, 17:18
Я сделал все как описал в FAQ'e Mutagen. Все ссылки, информацию выводит но как нажимаю допустим перейти на 2 страницу, он адрес изменяет но больше ничего(информация на экране не меняется). Немог бы кто-нибудь помочь..

ЗЫ: переключал в ручную на страницах инфа нормально распологается..

Автор: arial 13.8.2004, 17:45
Попробуй http://pear.php.net/package/Pager или http://pear.php.net/package/Pager_sliding. Очень удобная вещ! wink.gif

Автор: IZ@TOP 14.8.2004, 20:40
Можешь кинуть сюда свой код? Может ты просто не привязал данные к своему скрипту?

Автор: Chuck 15.8.2004, 09:28
Не знаю, что там в ФАКе, но я постранично делаю так!
Запросом
"SELECT * FROM table LIMIT $next, 20"

Код

function print_pages($pagecount, $on_page, $param)
{
echo "<table border='0' cellspacing='0' cellpadding='5'><tr><td>Страниц:</td>";
$pages = (int)ceil($pagecount / $on_page);
for ($i = 0; $i < $pages; $i++)
 {
 $k = $i * $on_page;
 $page = $i + 1;
 echo "<td><a href='show.php?next=$k&$param'>$page</a></td>";
 }
echo "</tr></table>";
}

А вызов
Код

//$pagecount  - всего записей!
print_pages($pagecount, 20, "user=$user");

Автор: IZ@TOP 15.8.2004, 11:36
Цитата(Chuck @ 15.8.2004, 10:28)
"SELECT * FROM table LIMIT ".intval($_GET['next']).", 20"

Безопасное программирование, часть 1.



Цитата(Chuck @ 15.8.2004, 10:28)
function print_pages($pagecount, $on_page, $param)
{
echo "<table border='0' cellspacing='0' cellpadding='5'><tr><td>Страниц:</td>";
$pages = ceil($pagecount / $on_page);
for ($i = 0; $i < $pages; $i++)
{
$k = $i * $on_page;
$page = $i + 1;
echo "<td><a href='show.php?next=$k&$param'>$page</a></td>";
}
echo "</tr></table>";
}


Автор: Chuck 15.8.2004, 13:13
Цитата

Цитата(Chuck @ 15.8.2004, )
"SELECT * FROM table LIMIT ".intval($_GET['next']).", 20"

Безопасное программирование, часть 1.

Знаю, просто сильно спешил - дюал ап smile.gif

Цитата

$pages = ceil($pagecount / $on_page);

Ты прав, ceil и так возвращает целое число! smile.gif)

Спасибо!

Автор: No_Mad 16.8.2004, 07:09
Вот мой код:

Код
<?

$db_name = "test";


mysql_select_db($db_name);

echo "<TABLE cellSpacing=0 cellPadding=0 width='100%' bgColor=#6699cc border=1>";
echo "<tr><td>Продавец</td><td>Адрес</td><td>Телефон</td>";
echo "<td>E-mail</td><td>Рейтинг</td><td>Товар</td>";
echo "<td>Цена</td><td>Наличие</td></tr>";

if (!isset($_GET['page'])) {$_GET['page'] = '1';}


$to_page = 3;
$pages_links = 2;

$p = ($_GET['page'] * $to_page) - $to_page;

$query = "SELECT COUNT(id) FROM price";
$result = mysql_query($query);
$count = mysql_result($result,0,'COUNT(id)');
$pages = ceil($count / $to_page);

if ($_GET['page'] > $pages) {
  header("Location: pages.php?page=".$pages);
} elseif($_GET['page'] < 1) {
  header("Location: pages.php?page=1");
}


$query = "select tovar.creater, , price.price1, price.nal, prod.name, prod.adres, prod.telefon, prod.mail, prod.reyting from prod, tovar, price where tovar.id = price.tovar and price.prod = prod.id and price.nal > 0 LIMIT ".$p.",".$to_page;

$result = mysql_query($query);

for ($i=0; $i<mysql_num_rows($result); $i++)
{
echo "<tr>";

$sql=mysql_fetch_array($result);

echo "<td>$sql[name]</td><td>$sql[adres]</td><td>$sql[telefon]</td>";
echo "<td>$sql[mail]</td><td>$sql[reyting]</td>";
echo "<td>$sql[creater]</td>";
echo "<td>$sql[price1]</td><td>$sql[nal]</td>";

echo "</tr>";
}

$pages_links_view_max = 0;
$pages_links_view_min = 0;

if ($pages - $_GET['page'] >= ($pages_links + 1)) {
  $to_max = $_GET['page'] + $pages_links;
  $pages_links_view_max = 1;
} else {
  $to_max = $pages;
}


if ($_GET['page'] > ($pages_links + 1)) {
  $to_min = $_GET['page'] - $pages_links;
  $pages_links_view_min = 1;
} else {
  $to_min = 1;
}

if ($pages_links_view_min == 1) {
  echo ' <A href="?page=1"> К началу</A>';
}

if ($_GET['page'] > 1) {
  echo ' <A href="?page='.($_GET['page'] - 1).'"> &lt;&lt;</A>';
}

if ($pages_links_view_min == 1) {
  echo ' ...';
}


for ($p = $to_min; $p <= $to_max; $p++) {
  if ($_GET['page'] == $p) {
      echo ' <B>['.$p.']</B>';
  } else {
      echo ' <A href="?page='.$p.'">['.$p.']</A>';
  }
}
if ($pages_links_view_max == 1) {
  echo ' ...';
}

if ($_GET['page'] < $pages) {
  echo ' <A href="?page='.($_GET['page']+1).'"> &gt;&gt;</A>';
}

if ($pages_links_view_max == 1) {
  echo ' <A href="?page='.$pages.'"> Последняя ['.$pages.']</A>';
}

?>

Автор: IZ@TOP 16.8.2004, 10:46
Ужасно выглядит. Ты мне скажи что тебе нужно чтобы выводилось? Все страницы какие есть в БД? Или просто две стрелки взад-вперед?
Вот метод несколько проще чем тот который ты представил:
Цитата
$cp = (isset($_GET['page'])) ? intval($_GET['page']) : 1;
$maxr = 10; // Количество записей на страницу.
// Выбираем количество записей в таблице.
$qc = mysql_query("select count(*) from tablename");
$tcnt = mysql_fecth_array($qc, MYSQL_NUM);
$sp = ceil($tcnt[0] / $maxr); // Всего страниц.
$cp = ($cp > $sp) ? $sp - 1 : (($cp < 1) ? 1 : $cp); // Поверка на выход за границу текущей страницы.
$ls = $cp * $maxr; // С какого места выбирать записи в БД.
// Далее делаем выборку из БД.
$q = mysql_query('select * from tablename limit '.$ls.', '.$maxr);
$pp = ($cp < 1) ? 1 : $cp - 1; // Prev page number
$np = ($cp > $sp) ? $cp : $cp + 1; // Next page number

// Теперь можем печатать ссылки на предыдущую и следующую страницы:

echo '<a href="?page='.$pp.'">prev</a> || <a href="?page='.$np.'">next</a>';

Автор: No_Mad 16.8.2004, 10:57
В моем случае "след." и "пред." страницы будут не совсем удобны. Надо примерно как у вас на форуме, с несколькими ссылками на ближайшие страницы.

Автор: IZ@TOP 17.8.2004, 12:59
Ну так что мешает сделать еще ссылки типа
Цитата
echo '<a href="'.($pp-1).'">'.($pp - 1).'</a>';
echo '<a href="'.$pp.'">'.$pp.'</a>';
echo '<a href="'.$np.'">'.$np.'</a>';
echo '<a href="'.($np + 1).'">'.($np + 1).'</a>';

Автор: No_Mad 19.8.2004, 10:16
IZ@TOP У тебя нескоко неточностей в коде. Вот один:
Цитата

$tcnt = mysql_fetch_array($qc, MYSQL_NUM);

А другие я пока не заметил.
Он например выводит неправельное количество строк на экран(мне кажется в деление чето нето). И не осуществляет переход между листами..

ЗЫ: Если поставить maxr=5, при столбца~4 то он чето как-то(по кол-ву строк). Если поставить maxr=10 то он нечего не выводит..

Автор: IZ@TOP 19.8.2004, 12:00
Цитата(IZ @ 16.8.2004, 11:46)
$ls = $cp * $maxr - $maxr; // С какого места выбирать записи в БД.

Сорри smile.gif У меня просто возможности проверить нету.
Цитата(No_Mad @ 19.8.2004, 11:16)
IZ@TOP У тебя нескоко неточностей в коде. Вот один:

Бывает smile.gif

Автор: No_Mad 20.8.2004, 07:22
IZ@TOP
Извени за назойливость и тупость, но непашет он у меня.. Выводятся строки теперь правильно, но между страницами не хочет делать переход(Адрес изменяется но ничего больше).

Автор: IZ@TOP 20.8.2004, 11:02
No_Mad
Код в студию.

Автор: No_Mad 20.8.2004, 11:17
Вот:

Код
<?

$db_name = "test_0";

if(!mysql_connect($server,$user,$passwd))
{
echo $head;
echo $cp;
echo $body;
echo "<h2>$error</h2>";
echo "</body></html>";
exit;
}

mysql_select_db($db_name);

echo "<TABLE cellSpacing=0 cellPadding=0 width='100%' bgColor=#6699cc border=1>";
echo "<tr><td>Продавец</td>....</tr>";

$cp = (isset($_GET['page'])) ? intval($_GET['page']) : 1;
$maxr = 5;
$qc = mysql_query("select count(*) from cell");
$tcnt = mysql_fetch_array($qc, MYSQL_NUM);
$sp = ceil($tcnt[0] / $maxr);
$cp = ($cp > $sp) ? $sp - 1 : (($cp < 1) ? 1 : $cp);
$ls = $cp * $maxr - $maxr;
$q = mysql_query('select tovar.creater, cell.price, cell.nal, prod.name, prod.adres from prod, tovar, cell where tovar.id = cell.tovar and cell.prod = prod.id and cell.nal > 0 and cell.tol > now() order by prod.name limit '.$ls.', '.$maxr);
$pp = ($cp < 1) ? 1 : $cp - 1;
$np = ($cp > $sp) ? $cp : $cp + 1;


while ($sql=mysql_fetch_array($q)) {
$count++;
 print ("<tr");
 if ($count/2==intval($count/2))
   print (" bgcolor=#e1e1e1");
 print ("><td align=center>${sql[name]}</td><td align=center>${sql[adres]}</td><td align=center>${sql[creater]}</td>
<td align=center>${sql[price1]}</td>
<td align=center>${sql[nal]}</td></tr>\n");
 }

echo '<a href="?page='.$pp.'">(prev)</a>';
echo '<a href="?page'.($pp-1).'">'.($pp - 1).'_</a>';
echo '<a href="?page'.$pp.'">'.$pp.'_</a>';
echo '<a href="?page'.$np.'">'.$np.'_</a>';
echo '<a href="?page'.($np + 1).'">'.($np + 1).'_</a>';
echo '<a href="?page='.$np.'">(next)</a>';

?>


Сделал все как ты показал..

Автор: No_Mad 23.8.2004, 08:52
2IZ@TOP Я было подумал в начале что он не преключается из-за малого кол-ва данных в табле, но набил 20 все равно не чего не меняется.

Автор: IZ@TOP 23.8.2004, 09:42
Проблема решена. Устаревшая версия РНР не поддерживала глобальный массив $_GET. С заменой онного на $HTTP_GET_VARS все заработало.
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)