Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужна помощь (разбиение сообщений на страницы).
 
 автор: 077   (11.11.2004 в 16:02)
 
 

Я уже 4 дня не пойму, как сделать разбиение сообщений на страницы. Чтобы на каждую страницу по 10 сообщений было. Вот код гостевой (кроме кода формы):
<?php
if ($_POST['text']) {
$fh=fopen("xxx.dat","a");
rsort($a);
flock($fh,2);
$time=time();
$nik=strip_tags($_POST['nik']);
$IP=$HTTP_SERVER_VARS["REMOTE_ADDR"];
$city=strip_tags($_POST['city']);
$about=strip_tags($_POST['about']);
$url=strip_tags($_POST['url']);
$email=strip_tags($_POST['email']);
$text=strip_tags($_POST['text']);
$text=str_replace("\n","<br>",$text);
Header("location:new.php");
fputs($fh,"$time|xxx|$nik|xxx|$url|xxx|$email|xxx|$text|xxx|$IP|xxx|$city|xxx|$about\n");

fclost($fh);
}
$data=file("xxx.dat");
$data array_reverse($data);
foreach (
$data as $msg)
{
  list(
$time$nik$url$email$text$IP$city$about)=explode("|xxx|",$msg);
  echo 
date ("H.i.s d.m.Y ",$time)." <br>Автор(<font size=1 color=#FF0000>$IP</font>):$nik ($about)<br>Из города $city <br> Сайт автора: <a href=\"$url\">$url</a> <br> E-mail: <a href=\"mailto:$email\">$email</a><br>Сообщение:<br> $text <hr>";
}
?>

   
 
 автор: cheops   (11.11.2004 в 16:42)   письмо автору
 
   для: 077   (11.11.2004 в 16:02)
 

Постраничную навигацию можно организовать примерно следующим образом (можете порыться в форуме - здесь эта тема возникает постоянно и предлагается много решений как для MySQL, так и для файлов)
<?php 
  
// Блок добавления сообщения
  
if ($_POST['text'])
  { 
    
$fh=fopen("xxx.dat","a"); 
    
rsort($a); 
    
flock($fh,2); 
    
$time=time(); 
    
$nik=strip_tags($_POST['nik']); 
    
$IP=$HTTP_SERVER_VARS["REMOTE_ADDR"]; 
    
$city=strip_tags($_POST['city']); 
    
$about=strip_tags($_POST['about']); 
    
$url=strip_tags($_POST['url']); 
    
$email=strip_tags($_POST['email']); 
    
$text=strip_tags($_POST['text']); 
    
$text=str_replace("\n","<br>",$text); 
    
Header("location:new.php"); 
    
fputs($fh,"$time|xxx|$nik|xxx|$url|xxx|$email|xxx|$text|xxx|$IP|xxx|$city|xxx|$about\n"); 
    
fclost($fh); 
  } 
  
// Блок отображения сообщений
  
$data=file("xxx.dat"); 
  
$data array_reverse($data);
  
// Число сообщений на одной странице
  
$pnumber 10;
  
// Вычисляем общее число сообщений в
  // файле xxx.dat
  
$total count($data);
  
// Проверяем передан ли странице параметр start
  // Определяющий позицию начиная с которой необходимо
  // выводить сообщения
  
if(isset($_GET['start'])) $start $_GET['start'];
  else 
$start 0;
  
// Счётчик сообщений
  
$count 0;
  
// Выводим сообщения
  
foreach ($data as $msg
  { 
    ++
$count;
    
// Если мы еще не дошли до стартовой точки
    // пропускаем цикл
    
if($count<$start) continue;
    
// Выводим сообщение
    
list($time$nik$url$email$text$IP$city$about)=explode("|xxx|",$msg); 
    echo 
date ("H.i.s d.m.Y ",$time)." <br>Автор(<font size=1 color=#FF0000>$IP</font>):$nik ($about)<br>Из города $city <br> Сайт автора: <a href=\"$url\">$url</a> <br> E-mail: <a href=\"mailto:$email\">$email</a><br>Сообщение:<br> $text <hr>"
    
// Если мы вывели на странице $pnumber
    // сообщений - выходим из цикла
    
if($count>$start+$pnumber) break;
  } 
  
// Выводим ссылки на предыдущие новости
  
if ($start != 0) print "<A href=http://".$_SERVER["SERVER_NAME"].$_SERVER['PHP_SELF']."?start=".($start $pnumber).">Предыдущие</A> ";
  
// Выводим ссылки на следующие новости
  
if ($total $start $pnumber) print "<A href=http://".$_SERVER["SERVER_NAME"].$_SERVER['PHP_SELF']."?start=".($start $pnumber).">Следующие</A>";
?>

При таком подходе чем больше сообщений - тем медленее работа скрипта - по идеи нужно стремится к чтению из файла только того его куска в котором находятся сообщения, но здесь уже нужно по другому организовывать хранение данных, и одним файлом уже вряд ли можно обойтись...

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=721&page=1

   
 
 автор: 077   (11.11.2004 в 19:02)
 
   для: cheops   (11.11.2004 в 16:42)
 

Спасибо. Сейчас попробую так сделать.

   
 
 автор: 077   (11.11.2004 в 19:11)
 
   для: cheops   (11.11.2004 в 16:42)
 

Спасибо еще раз, сделал, получилось, но почему-то на одной странице 11 сообщений, а не 10.

   
 
 автор: cheops   (11.11.2004 в 19:50)   письмо автору
 
   для: 077   (11.11.2004 в 19:11)
 

Хм... попробуйте поместить
<?php
  
if($count>$start+$pnumber) break;
?>

сразу после
<?php
  
if($count<$start) continue; 
?>

   
 
 автор: chip   (11.11.2004 в 23:07)   письмо автору
 
   для: cheops   (11.11.2004 в 19:50)
 

Вот еще одно решение подсмотрено ...
Страничный вывод данных 19.04.2003 21:19

Андрей Головин

В прошлом опыте я рассказал, как организовать визуальное представление данных из таблиц СУБД mySQL. Описанный метод применим, если количество выводимых данных не велико или заранее известно. Но, иногда, необходимо предоставить пользователю возможность просмотреть большой массив данных. Для этого его (массив ;), обычно разбивают на страницы с возможностью перехода от одной страницы к другой.
К счастью, данная задача решается не протосто, а очень просто. mySQL поддерживает параметр запроса SELECT ... LIMIT первый,кол-во, где первый - индекс элемента, с которого начинается выборка, а кол-во - количество элементов в выборке. Причем, параметр LIMIT накладывается на результат работы всех предыдущих параметров, таких как WHERE, ORDER BY и пр. Т.е. сначала производится полная выборка, а потом происходит ее "урезание" до заданных пределов.

Предположим, что желаемое количество рядов данных, выводимое на одну страницу задано в переменной $itemsPerPage, а номер страницы передается в адресной строке с именем page, например: http://your.host.ru?page=1. Теперь, зная количество рядов на страницу и номер страницы мы можем вычислить индекс первого элемента в выборке (первый):
$first=$page*$itemsPerPage;
Здесь необходимо заметить, что индекс самого первого элемента в базе - 0. Аналогично примем, что первая страница будет иметь индекс 0.

Устанавливаем соединение с сервером mySQL и получаем список полей таблицы, как в предыдущем опыте:
<? 
mysql_connect
("yourhost","user","password");
mysql_select_db("database");
$res=mysql_list_fields("database","table");
echo 
"<TABLE BORDER=1>";
echo 
"<TR>";
for (
$i=0$i mysql_num_fields($res); $i++) {
   echo 
"<TH>";
   echo 
mysql_field_name($res,$i);
   echo 
"</TH>";
}
?>

Далее сформируем SQL-запрос:
$sql="SELECT * FROM table ORDER BY $order LIMIT $first,$itemsPerPage";
Предположим, что мы передаем в адресной строке еще и имя поля, по которому происходит сортировка данных - $order. Это не важно для темы данного опыта, но наглядно демонстрирует возможности работы параметра LIMIT.

На этом можно было бы и закончить описание того, как получить набор данных, соответствующий заданным границам, так как далее можно напрямую скопировать код из предыдущего опыта. Я приведу этот код еще раз:
<?php 
$res
=mysql_query($sql);
while (
$row=mysql_fetch_row($res)) {
   echo 
"<TR>";
   for (
$i=0$i $fields$i++) {
      echo 
"<TD>".$row[$i]."</TD>";
   }
   echo 
"</TR>";
}
echo 
"</TR></TABLE>";
?>

Т.е., этот код настолько универсален, что ему, практически, безразлично содержание запроса.

Далее мы должны сформировать ссылки для навигации по нашему многостраничному документу:
<?php 
$res
=mysql_query("SELECT COUNT(*) FROM table");
$itms=mysql_fetch_array($res);
$total=$itms[0];
$pages=floor($total/$itemsPerPage);
if ((
$total%$itemsPerPage) !=0) {
   
$pages++;
}
if (empty(
$page)) {
   
$page=0;
}
?>

В первых трех строчках мы запрашиваем у сервера базы данных количество рядов данных в таблице. Далее расчитываем общее количество страниц, которое получается в нашем документе ($pages). Последняя строчка используется для того, чтобы при дальнейших действиях не возникло неоднозначности, если пользователь вызвал наш документ без параметров в адресной строке.

Далее формируем сами ссылки:
<?php
if ($page!=0) {
   echo 
" <A HREF='$PHP_SELF?order=name&page=".($page 1)."'> Назад (".($page).")</A>";
}
if ((
$page+1)<$pages) {
   echo 
" <A HREF='$PHP_SELF?order=name&page=".($page 1)."'> Далее (".($page 2).")</A>";
}
?>

Переменная $PHP_SELF содержит имя текущего скрипта. Таким образом (предположим, что наш документ называется data.phtml) вид формируемых ссылок будет таким:
<A HREF="http://your.host.ru/data.phtml?order=name&page=2"> Назад (1)</A>
<A HREF="http://your.host.ru/data.phtml?order=name&page=3"> Вперед (3)</A>
Кроме того, вы самостоятельно сможете дополнить этот документ ссылками на первую и последнюю страницу. Удачи!
Источник:

   
 
 автор: 077   (12.11.2004 в 00:07)
 
   для: chip   (11.11.2004 в 23:07)
 

Сейчас еще другая проблема. Не действует почему-то код
Header("location:new.php");
. После отправки сообщения загружается не new.php, а index.php и только форма , сообщения не загружаются. Куда ни вставлю этот код, не действует.

   
 
 автор: 077   (12.11.2004 в 00:16)
 
   для: 077   (12.11.2004 в 00:07)
 

Т.е. чтобы увидеть сообщение, приходится нажимать на "Назад".

   
 
 автор: cheops   (12.11.2004 в 00:21)   письмо автору
 
   для: 077   (12.11.2004 в 00:16)
 

Может лучше использовать заголовок Refresh?

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=748

   
 
 автор: cheops   (12.11.2004 в 00:18)   письмо автору
 
   для: 077   (12.11.2004 в 00:07)
 

Хм... странно у меня работает, может требуется передать какие-либо параметры?
<?php
  Header
("location:new.php?id=something");
?>

Что находится в файле new.php?

PS Давайте под новые проблемы заводить новые темы - просто их в таком случае потом проще искать, да и по объему они меньше становятся...

   
 
 автор: 077   (12.11.2004 в 00:25)
 
   для: cheops   (12.11.2004 в 00:18)
 

В new.php находится только текст : "Спасибо, ваше сообщение добавлено. Нажмите сюда для продолжения!" На слове "сюда" ссылка на index.php. Но я и пропобовал ставить значение index.php вместо new.php, дело не в странице, на которую стоит значение.

   
 
 автор: cheops   (12.11.2004 в 00:31)   письмо автору
 
   для: 077   (12.11.2004 в 00:25)
 

Дело может быть в кэшировании браузера, если используете IE - зайдите в "Свойства обозревателя->Общие->Параметры->Проверять наличия обновления" - следует поставить радио-кнопку при каждом посещении страницы.

   
 
 автор: 077   (12.11.2004 в 00:34)
 
   для: cheops   (12.11.2004 в 00:31)
 

У меня с браузером нет неполадок. Например, ваш форум нормально грузится и после отправки сообщения.

   
 
 автор: 077   (12.11.2004 в 00:50)
 
   для: cheops   (12.11.2004 в 00:31)
 

Извините, я разобрался, в чем дело. Это из-за кода баннера сети rle.ru. Я убрал код и все грузится. Для баннера надо фрейм делать.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования