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

Форум MySQL

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

 

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

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

тема: вывести только 5 сообщений
 
 автор: ols   (24.07.2008 в 00:54)   письмо автору
 
 

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

<?

      
// Иначе динамическая генерация
      // Выбираем первое сообщение темы
      
$query "SELECT * FROM $tbl_posts 
                WHERE id_theme = 
$id_theme AND
                      hide != 'hide' 
              LIMIT 5"
;
      
$pst mysql_query($query);
      if(!
$pstputerror("Ошибка при обращении к теме: $id_theme");
      
$posts mysql_fetch_array($pst);
      
// Рекурсивно выводим все подчинённые сообщения
      
@putpost($posts['id_post'],
               
$id_theme,
               
2,
               
$lasttime,
               
$current_author,
               
$id_forum,
               
$lineforum,
               
$lineforumdown,
               
$skin,
               
$themes['hide'],
               
$tbl_posts,
               
$tbl_themes);

?>

   
 
 автор: sms-send   (24.07.2008 в 01:17)   письмо автору
 
   для: ols   (24.07.2008 в 00:54)
 

> только не получается
что именно?

Дамп таблицы?
mysql_error(); ?
Значения переменных $tbl_posts и $id_theme?

   
 
 автор: BinLaden   (24.07.2008 в 01:19)   письмо автору
 
   для: ols   (24.07.2008 в 00:54)
 

Ошибка как минимум в том, что Вы забыли сортировку ( ... ORDER BY `id` DESC .... ).
Вместо `id` - то поле, по которому Вы можете определить какое из сообщений добавлено позже или раньше.

   
 
 автор: Trianon   (24.07.2008 в 01:37)   письмо автору
 
   для: BinLaden   (24.07.2008 в 01:19)
 

внутри рекурсивной процедуры что дописывай LIMIT 5 в запрос, что не дописывай - эффект будет чисто эстетический
Точно также и с ORDER BY.:)

   
 
 автор: BinLaden   (24.07.2008 в 02:02)   письмо автору
 
   для: Trianon   (24.07.2008 в 01:37)
 

А я не увидел где тут есть какая-то рекурсия...Вижу только вызов какой-то функции.

   
 
 автор: sms-send   (24.07.2008 в 02:06)   письмо автору
 
   для: BinLaden   (24.07.2008 в 02:02)
 

В комменте что то написано про рекурсию.

   
 
 автор: Trianon   (24.07.2008 в 02:06)   письмо автору
 
   для: BinLaden   (24.07.2008 в 02:02)
 

Человек привел фрагмент функции putpost(), которая выводит сообщения в виде дерева. В частности в этом форуме. Заголовок привести постеснялся, видимо...

   
 
 автор: ols   (24.07.2008 в 02:09)   письмо автору
 
   для: BinLaden   (24.07.2008 в 02:02)
 

Рекурсия есть. Просто из utils.php вызывается функция putpost:

<?
function putpost($id_post,
                 
$id_theme,
                 
$indent,
                 
$last_time,
                 
$current_author,
                 
$id_forum,
                 
$lineforum,
                 
$lineforumdown,
                 
$skin,
                 
$themehide,
                 
$tbl_posts,
                 
$tbl_themes)
{
 
 
    
// Выводим сообщение с id_post == $id_post
    
$query "SELECT * FROM $tbl_posts
              WHERE id_theme = 
$id_theme AND
                    id_post = 
$id_post AND
                    hide != 'hide' ORDER BY 'id_posts' LIMIT 5"
;
    
$psts mysql_query($query);
    if (
$psts)
    {
      
$posts mysql_fetch_array($psts);
      
post_down($id_post,
                
$id_theme,
                
$indent,
                
$last_time,
                
$current_author,
                
$id_forum,
                
$posts['id_author'],
                
$posts['author'],
                
convertdate($posts['time'],0),
                
$posts['putfile'],
                
$posts['name'],
                
$posts['url'],
                
$skin,
                
$themehide,
                
$parent_author,
                
convertdate($parent_time,0),
                
$parent_id_author,
                
$tbl_posts,
                
$tbl_themes
                
);
      
// Выводим подчинённые сообщения
      
$query "SELECT * FROM $tbl_posts 
                WHERE id_theme = 
$id_theme AND
                      parent_post = 
$id_post AND
                      hide != 'hide' 
                 ORDER BY 'id_post' LIMIT 5"
;
      
$psts mysql_query($query);
      if (
$psts)
      {
     
        
$num_rows=mysql_num_rows($psts);
        
        while(
$posts mysql_fetch_array($psts))
        {
          
          
// Рекурсивно вызываем функцию putpost для обработки подчинённых постов
          
putpost($posts['id_post'],
                  
$id_theme,
                  
$temp,
                  
$last_time,
                  
$current_author,
                  
$id_forum,
                  
$lineforum,
                  
$lineforumdown,
                  
$skin,
                  
$themehide,
                  
$tbl_posts,
                  
$tbl_themes
                  
);
        }
      } else 
puterror("Ошибка при выборке сообщений темы...1");
    }
    else 
puterror("Ошибка при выборке сообщений темы...");
  }


?>


>Значения переменных $tbl_posts и $id_theme?
$tbl_posts = posts и $id_theme=themes
Прописал я сортировку все равно что-то я не так делаю. Как и прежде выводть все сообщения в теме

   
 
 автор: Trianon   (24.07.2008 в 02:13)   письмо автору
 
   для: ols   (24.07.2008 в 02:09)
 

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

   
 
 автор: ols   (24.07.2008 в 02:27)   письмо автору
 
   для: Trianon   (24.07.2008 в 02:13)
 

>Подумайте... может он и Вам не нужен?
Дело в том у меня вап сайт и данный форум переделал под себя, добавил вмл разметку страниц. Все работает отлично, движок лайтфорум просто меня спасает. Но дело в том что некоторые телефоны не смогут загржуть страницу больше 10-15 кб, да и вообще телефон и это не комппьютер все равно у него наряду с компьютером оперативка очеь мала

И что же тогда посоветуете сдлеать? переписать код по-другому, отказаться от рекурсии?

   
 
 автор: Trianon   (24.07.2008 в 02:40)   письмо автору
 
   для: ols   (24.07.2008 в 02:27)
 

Есть несколько способов.
1. изменить технологию хранения дерева на nested sets. Для отображения NS-дерева рекурсия не требуется. Вариант наиболее чистый, как мне представляется.
2. Вместо того чтоб рекурсивной процедурой выводить сообщения в поток браузера - сохранять их id и уровни вложенности в массив. Вывод постов по идентификаторам из массива уже можно сделать постраничным. Кстати, так можно изрядно сэкономить на запросах к БД. Вариант посерее, но тоже проходной.
3. Можно сохранять в массив не идентификаторы, а сами посты. Вариант довольно отвратный.... но зато с минимальными переделками кода. Я так понимаю, для Вас это более чем критично.

   
 
 автор: ols   (24.07.2008 в 02:52)   письмо автору
 
   для: Trianon   (24.07.2008 в 02:40)
 

>1. изменить технологию хранения дерева на nested sets. Для отображения NS-дерева рекурсия не требуется. Вариант наиболее чистый, как мне представляется.

Что-то я не догоняю. Объясните по подробнее пожалуйста, слова мне не знакомые.
В форуме у меня вывод постов выводится от старых к новым, а переключен ия вида я убрал.

   
 
 автор: Trianon   (24.07.2008 в 03:02)   письмо автору
 
   для: ols   (24.07.2008 в 02:52)
 

>>1. изменить технологию хранения дерева на nested sets. Для отображения NS-дерева рекурсия не требуется. Вариант наиболее чистый, как мне представляется.
>Что-то я не догоняю. Объясните по подробнее пожалуйста, слова мне не знакомые.
Незнакомые слова ищутся в поиске.
http://softtime.ru/forum/srch.php?id_forum=3&name=nested+sets&numberthemes=30&srchwhere=2&logic=1

>В форуме у меня вывод постов выводится от старых к новым, а переключен ия вида я убрал.

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

   
 
 автор: ols   (24.07.2008 в 04:14)   письмо автору
 
   для: Trianon   (24.07.2008 в 03:02)
 

-

   
 
 автор: ols   (24.07.2008 в 04:15)   письмо автору
 
   для: Trianon   (24.07.2008 в 03:02)
 

Объясните пожалуйста тогда следующее. Вот данный код

<?
 $query 
"SELECT * FROM posts 
                WHERE id_theme = 
$id_theme AND hide = 'hide'
              LIMIT 5"
;
      
$pst mysql_query($query);
      
$posts mysql_fetch_array($pst);
      
    if (
$posts) echo $posts['name'];

?>


Почему данный запрос выводит только первое сообщение?

   
 
 автор: sms-send   (24.07.2008 в 04:44)   письмо автору
 
   для: ols   (24.07.2008 в 04:15)
 

Запрос то может выбирает и больше, только вы выводите именно первое из выборки.

   
 
 автор: ols   (24.07.2008 в 06:35)   письмо автору
 
   для: sms-send   (24.07.2008 в 04:44)
 

хм. ну как тогда мне можно вывести первые 5 тем?

   
 
 автор: lirik   (24.07.2008 в 06:51)   письмо автору
 
   для: ols   (24.07.2008 в 06:35)
 

так :
"SELECT * FROM posts  WHERE id_theme = $id_theme AND hide = 'hide' LIMIT 0,5"

или так:
"select * from posts ORDER BY `posts`.`time` DESC limit 0,5"


<?
$vquery 
"SELECT * FROM posts  WHERE id_theme = $id_theme AND hide = 'hide' LIMIT 0,5";
$result mysql_query($vquery);
while (
$row mysql_fetch_array($result)) :
$row['Название столбца'];
endwhile;
?>

..наверное... ))

   
Rambler's Top100
вверх

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