Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2009, 22:39   #1
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию Вывод из базы постранично

Помогите разобраться с разбивкой.
Есть простенькая форма (имя, сообщение), на той же странице - вывод сообщений:

PHP код:
[PHP]<?php
include "config.php";
?>
<form action=add.php method=POST>
ИМЯ................: <input type=text name="name"> <br>
СООБЩЕНИЕ:           <textarea type=text name="msg"></textarea><br>
                     <input type=submit value="отправить">
                     <input type=hidden value="add">
</form>
<hr>


<?
$per_page
=3;
$query="SELECT * FROM miproject ORDER BY id DESC LIMIT 0,$per_page";
$res=mysql_query($query);
$row=mysql_fetch_array($res);
$total_rows=$row['0'];
$num_pages=ceil($total_rows/$per_page);
while (
$row=mysql_fetch_array($res))
{

echo 
"<b>Имя:</b>"; echo $row['name'];
echo 
"<br>";
echo 
"<b>Сообщение:</b>"; echo $row['msg'];
echo 
"<br><hr>";
}
for(
$i=1;$i<=$num_pages$i++)
{
 echo 
'<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">'.$i."</a>\n";
}  

?>
[/PHP]

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

P.S. Пример взял с PHPFAQ
Amen вне форума Ответить с цитированием
Старый 09.10.2009, 01:03   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Как-то странно скрипт сделан. Лучше сделать всё с нуля.
Вам надо получить общее число записей в таблице, разделить его на число записей на страницу. Получите число страниц.
Далее, в запросе на выборку записей, указываете:
LIMIT ($page - 1) * $per_page, $per_page
$page - номер текущей страницы. Его получаете через $_GET. Так же его нужно проверить на корректность, привести к целому и что бы этот номер был > 0.
Arigato вне форума Ответить с цитированием
Старый 09.10.2009, 12:59   #3
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Как-то странно скрипт сделан. Лучше сделать всё с нуля.
Вам надо получить общее число записей в таблице, разделить его на число записей на страницу. Получите число страниц.
PHP код:
$per_page 3;

$query "SELECT * FROM miproject";
$res mysql_query($query);
$total_rows mysql_num_rows($res);

$num_pages ceil($total_rows/$per_page); 
Цитата:
$page - номер текущей страницы. Его получаете через $_GET. Так же его нужно проверить на корректность, привести к целому и что бы этот номер был > 0.
PHP код:
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0
Цитата:
Далее, в запросе на выборку записей, указываете:
LIMIT ($page - 1) * $per_page, $per_page
PHP код:
$q "SELECT * FROM miproject ORDER BY DESC LIMIT ($page-1)*$per_page$per_page";
$r mysql_query($q);
while(
$row =mysql_fetch_array($r))
{
 echo 
"<b>Имя:</b>"; echo $row['name'];
 echo 
"<br>";
 echo 
"<b>Сообщение:</b>"; echo $row['msg'];
 echo 
"<br><hr>";

и
PHP код:
for($i=1;$i<=$num_pages$i++)
{
 echo 
'<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">'.$i."</a>\n";

Результат тот же.((
[/QUOTE]
Amen вне форума Ответить с цитированием
Старый 09.10.2009, 17:20   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Amen
Результат тот же.((
Тот же - это что?
Вы при получении $page вычли из $_GET['page'] единицу. Тогда зачем ещё раз вычитать 1 в лимите в запросе?
Замените на:
PHP код:
if (isset($_GET['page'])) $page=intval ($_GET['page']); else $page=1;
if (
$page 1$page 1;
if (
$page $num_pages$page $num_pages
Ну и общее количество записей я бы вам посоветовал искать через запрос COUNT(*).
Arigato вне форума Ответить с цитированием
Старый 09.10.2009, 20:25   #5
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию

Arigato, сделал.

Блок вывода:

PHP код:
<?
$per_page 
3;

$query "SELECT COUNT(*) FROM miproject";
$res mysql_query($query);
$total_rows mysql_num_rows($res);

$num_pages ceil($total_rows/$per_page);
if (isset(
$_GET['page'])) $page=intval($_GET['page']); else $page=1;
if (
$page<1$page=1;
if (
$page>$num_pages$page $num_pages;

$q "SELECT COUNT(*) FROM miproject ORDER BY DESC LIMIT ($page-1)*$per_page$per_page";
$r mysql_query($q);
while(
$row=mysql_fetch_array($r))
{
 echo 
"<b>Имя:</b>"; echo $row['name'];
 echo 
"<br>";
 echo 
"<b>Сообщение:</b>"; echo $row['msg'];
 echo 
"<br><hr>";
}

for(
$i=1;$i<=$num_pages$i++)
{
 echo 
'<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">'.$i."</a>\n";

?>
1 ошибка - не выводит записи -
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in j:\home\mysql.ru\www\index.php on line 30
30 - это
PHP код:
while($row=mysql_fetch_array($r)) 
2 ошибка - (судя по тому, что ссылка внизу стоит лишь одна даже при множественном добавлении записей) - и не вводит(.

Последний раз редактировалось Amen; 09.10.2009 в 20:31.
Amen вне форума Ответить с цитированием
Старый 09.10.2009, 20:34   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ну вы даёте, что это у вас везде теперь "COUNT(*)", вы хоть понимаете, что делаете, или делаете это машинально?
Arigato вне форума Ответить с цитированием
Старый 09.10.2009, 20:53   #7
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Ну вы даёте, что это у вас везде теперь "COUNT(*)", вы хоть понимаете, что делаете, или делаете это машинально?
Что-то понимаю, что-то - не очень.
Я добавил COUNT во второй запрос после того как скрипт не дал результата.
Убрал. Те же ошибки, что я описал в предыдущем посте.
Amen вне форума Ответить с цитированием
Старый 09.10.2009, 21:01   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

PHP код:
$query "SELECT COUNT(*) FROM miproject";
$res mysql_query($query);
$total_rows mysql_num_rows($res); 
Замените последнюю строку на:
PHP код:
$f mysql_fetch_row ($res);
$total_rows $f[0]; 
Arigato вне форума Ответить с цитированием
Старый 09.10.2009, 21:24   #9
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию

Теперь всё прекрасно, за исключением ошибки в выводе на линии 30.

ЗЫ... аха, count(*) - строки, * - ряды))
Amen вне форума Ответить с цитированием
Старый 10.10.2009, 11:31   #10
Amen
Заблокирован
Форумчанин
 
Регистрация: 22.01.2008
Сообщений: 121
По умолчанию

С выводом я разобрался.
Только ссылки опять не работают.

PHP код:
$q="SELECT * FROM miproject ORDER BY id DESC LIMIT ".($page 1)*$per_page.",".$per_page.".";
$r=mysql_query($q);
while (
$row=mysql_fetch_array($r))
{

echo 
"<b>Имя:</b>"; echo $row['name'];
echo 
"<br>";
echo 
"<b>Сообщение:</b>"; echo $row['msg'];
echo 
"<br><hr>";
}  

for(
$i=1;$i<=$num_pages$i++)
{
 echo 
'<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">'.$i."</a>\n";


В адресной строке значение num меняется, но отображаются всё те же 3 первых сообщения.
Amen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие Базы, Перенос базы ke6ko БД в Delphi 1 10.07.2009 08:05
помогите с разбивкой постранично El_Pablo PHP 2 16.05.2008 12:12
две базы IGRA Помощь студентам 1 16.11.2007 14:18
Чтение из базы Антон Шестаков БД в Delphi 8 18.05.2007 19:24