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

Форум MySQL

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

 

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

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

тема: Вывод данных из базы по 4 штуки
 
 автор: worker   (16.08.2005 в 15:14)   письмо автору
 
 

Нужно выводить текст из базы данных по 4 пункта.
Всего в базе данных 9 пунктов.
Тоесть: 1234, 5678, 9123, 4567, 8912, 3456, 7891, 2345, 6789
Как Вы видите дальше оно будет повториться, так вот нужно создать запрос, который выводил при следующим посещении странице следующую четвеку.
Принимаются все предложения. Заранее спасибо.

   
 
 автор: Киналь   (16.08.2005 в 15:22)   письмо автору
 
   для: worker   (16.08.2005 в 15:14)
 

При каждом посещении ставить cookie с номером последнего выведенного пункта.

   
 
 автор: cheops   (16.08.2005 в 16:01)   письмо автору
 
   для: worker   (16.08.2005 в 15:14)
 

В этом случае удобнее воспользоваться конструкцией LIMIT
SELECT * FROM tbl LIMIT 1,4

Для следующей четвёрки
SELECT * FROM tbl LIMIT 4,4

Для следующей
SELECT * FROM tbl LIMIT 8,4

Причём последний запрос выведет только одну запись. А переменную с цифрами 1, 4, 8 удобнее действительно хранить в cookie, если требуется, чтобы при каждом следующем обращении выводилась следующая четвёрка.

PS Вопросы, посвящённые базам данных, лучше сразу размещать в разделе http://www.softtime.ru/forum/index.php?id_forum=3

   
 
 автор: worker   (16.08.2005 в 16:28)   письмо автору
 
   для: cheops   (16.08.2005 в 16:01)
 

Спасибо, но кукиес отпадает, т.к. действовать будем не с пользователем а с Б.Д.
Поэтому и нужно чтобы при каждом другом обращении выводилась следующая 4-ка. Есть идея, по поводу вывода, после чего мы делаем заметку в дополнительном столбике, но как это всё реализовать ? Может подскажите возможно ли это при помощи запроса к Б.Д. ? Я полагаю с помощью ЛИМИТа как вы и показали, но как именно ?

   
 
 автор: cheops   (16.08.2005 в 17:13)   письмо автору
 
   для: worker   (16.08.2005 в 16:28)
 

Т.е. будет обращаться по сути один скрипт? А соединение разрываться между запросами будет? Не могли бы вы подробнее описать задачу и кто какие запросы посылает... есть несколько вариантов, но чтобы сказать определённо - нужно больше подробностей.

   
 
 автор: worker   (16.08.2005 в 18:16)   письмо автору
 
   для: cheops   (16.08.2005 в 17:13)
 


Т.е. будет обращаться по сути один скрипт?

Да скрипт будет один.

 А соединение разрываться между запросами будет?

Да после считывания с Б.Д. и выставлении отметочки о прочтении соединение разрывается.
Большое Вам человеческое спасибо, Вы тут один можите ответить или подсказать по поводу этого вопроса.

   
 
 автор: cheops   (16.08.2005 в 20:08)   письмо автору
 
   для: worker   (16.08.2005 в 18:16)
 

Тогда использовать переменные сервера MySQL не получится - придётся завести ещё одну таблицу и хранить цифру с которой начинается четвёрка там...

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

   
 
 автор: worker   (16.08.2005 в 20:35)   письмо автору
 
   для: cheops   (16.08.2005 в 20:08)
 

Согласен, ну а тогда какой будет запрос ? И какой код будет ? Подскажите пожалусто. Дополнительную таблицу можите обозвать как хотите, только укажите, что это дополнительная таблица.

   
 
 автор: cheops   (16.08.2005 в 23:10)   письмо автору
 
   для: worker   (16.08.2005 в 20:35)
 

Код может выглядеть примерно следующим образом
<?php
  
// Извлекаем номер из дополнительной таблицы
  // tbl - в начале там одна запись с цифрой 1
  
$query "SELECT num FROM ext";
  
$ext mysql_query($query);
  if(!
$ext) exit(mysql_error());
  
$num mysql_result($ext,0);
  
// Формируем основной запрос
  
$query "SELECT * FROM tbl LIMIT $num, 4";
  
$tbl mysql_query($query);
  if(!
$tbl) exit(mysql_error());
  while(
$result mysql_fetch_array($tbl))
  {
    
// ...
  
}
  
// Изменяем содержимое таблицы ext
  
$query "UPDATE ext SET num = num + 4";
  if(!
mysql_query($query)) exit(mysql_error());
?>

   
 
 автор: Киналь   (17.08.2005 в 00:01)   письмо автору
 
   для: cheops   (16.08.2005 в 23:10)
 

Э-э... Чего-то я недопонял... Если скрипт один, так тогда почему нельзя просто завести переменную РНР и после каждого обращения к БД увеличивать ее на 4? А потом выборку делать с лимитом по этой переменной... Наверное, я все-таки чего-то не понял=)

   
 
 автор: cheops   (17.08.2005 в 01:32)   письмо автору
 
   для: Киналь   (17.08.2005 в 00:01)
 

Я так понял, переменная должна сохранять свое значение между сеансами...

   
 
 автор: worker   (17.08.2005 в 00:06)   письмо автору
 
   для: cheops   (16.08.2005 в 23:10)
 

Класный пример, спасибо. Всё бы устроило, если бы нам не нужно было начинать считывать заново, тогда когда мы доходим до пункта 9.
Наши пункты в Б.Д.:
1
2
3
4
5
6
7
8
9
считываем по 4-ре, тоесть получаем следующее:
1234 - первый запрос
5678 - второй запрос
9123 - третий запрос
4567 - четвертый запрос
8912 - пятый запрос
3456- шестой запрос
7891 - седьмой запрос
2345 - восьмой запрос
6789 - девятый запрос
Ну а дальше как Вы видите будет опять повторение 1234
Надеюсь нормально объяснил. если нет, то задавайте вопросы, на все отвечу в подробнейшем виде. Заранее спасибо.

   
 
 автор: cheops   (17.08.2005 в 01:35)   письмо автору
 
   для: worker   (17.08.2005 в 00:06)
 

Почему? Ведь в таблице, насколько я понял только 9 записей? MySQL должна уперется в конец таблицы и всё? Или записей больше?

   
 
 автор: Киналь   (17.08.2005 в 01:58)   письмо автору
 
   для: cheops   (17.08.2005 в 01:35)
 

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

   
 
 автор: worker   (17.08.2005 в 09:37)   письмо автору
 
   для: Киналь   (17.08.2005 в 01:58)
 


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

Верно, так и должно быть, точно в цель.
Вот с этим я и столкнулся.

   
 
 автор: cheops   (17.08.2005 в 13:05)   письмо автору
 
   для: worker   (17.08.2005 в 09:37)
 

У вас имеется нумерация как пишет woker 1, 2, 3 ...?

   
 
 автор: worker   (17.08.2005 в 20:44)   письмо автору
 
   для: cheops   (17.08.2005 в 13:05)
 

Не очень ясен Ваш вопрос, сформулируйте пожалусто поконкретней и кому вопрос ?

   
 
 автор: worker   (17.08.2005 в 23:19)   письмо автору
 
   для: worker   (17.08.2005 в 20:44)
 

Ну так что предложения имеются ?

   
 
 автор: cheops   (18.08.2005 в 02:54)   письмо автору
 
   для: worker   (17.08.2005 в 20:44)
 

Извиняюсь не посмотрел, что это ваш ник :))) Я имею ввиду имеются у вас в таблице поле с номерами
1
2
3
4
5
6
7
8
9
или только
1234 - первый запрос
5678 - второй запрос
9123 - третий запрос
4567 - четвертый запрос
8912 - пятый запрос
3456- шестой запрос
7891 - седьмой запрос
2345 - восьмой запрос
6789 - девятый запрос
Дело в том, что без нумерации по возрастанию достаточно сложно зациклить вывод.

   
 
 автор: worker   (18.08.2005 в 17:06)   письмо автору
 
   для: cheops   (18.08.2005 в 02:54)
 

В таблице строки вида:
1
2
3
4
5
6
7
8
9
А нам нужно, чтобы эти строки выдавались по 4-ре штуки. Тоесть 1 раз посетитель зашел на эту страницу и увидел 1234 строки, второй раз зашел и увидел 5678 а в третий раз зашел увидел 9123 ну и т.д.
А это:
1234 - первый запрос
5678 - второй запрос
9123 - третий запрос
4567 - четвертый запрос
8912 - пятый запрос
3456- шестой запрос
7891 - седьмой запрос
2345 - восьмой запрос
6789 - девятый запрос
<--Это я показал для того, чтобы было видно, что получается цикл, ведь после 6789 опять пойдет 1234.

   
 
 автор: cheops   (18.08.2005 в 22:23)   письмо автору
 
   для: worker   (18.08.2005 в 17:06)
 

Т.е. в таблице присутсвует отдельный столбец с номерами
1
2
3
4
5
6
7
8
9

   
 
 автор: worker   (19.08.2005 в 14:10)   письмо автору
 
   для: cheops   (18.08.2005 в 22:23)
 

Ага

   
 
 автор: worker   (19.08.2005 в 18:01)   письмо автору
 
   для: worker   (19.08.2005 в 14:10)
 

Ну что предложения есть ?

   
 
 автор: cheops   (19.08.2005 в 22:57)   письмо автору
 
   для: worker   (19.08.2005 в 14:10)
 

Тогда следует прибегнуть примерно к следующему коду
<?php 
  $arr 
= (1=>'1'2=>'2'3=>'3'4=>'4'5=>'5'6=>'6'7=>'7'8=>'8'9=>'9'10=>'1'11=>'2'12=>'3'13=>'4'14=>'5'15=>'6'16=>'7'17=>'8'18=>'9');
  
// Извлекаем номер из дополнительной таблицы 
  // tbl - в начале там одна запись с цифрой 1 
  
$query "SELECT num FROM ext"
  
$ext mysql_query($query); 
  if(!
$ext) exit(mysql_error()); 
  
$num mysql_result($ext,0); 
  
// Формируем условие
  
$where "WHERE id IN ("
  
for($i $num$i $num 4$i++)
  {
    
$index[] = $arr[$i];
    if(
$i == $num 3$last $arr[$i];
  }
  
$where .= implode(",",$index).")";
  unset(
$index);
  
// Формируем основной запрос 
  
$query "SELECT * FROM tbl $where"
  
$tbl mysql_query($query); 
  if(!
$tbl) exit(mysql_error()); 
  while(
$result mysql_fetch_array($tbl)) 
  { 
    
// ... 
  

  
// Изменяем содержимое таблицы ext 
  
$query "UPDATE ext SET num = $last"
  if(!
mysql_query($query)) exit(mysql_error()); 
?>

   
Rambler's Top100
вверх

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