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

Форум MySQL

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

 

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

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

тема: Древовидные комментарии.
 
 автор: Aidaho   (08.11.2011 в 16:01)   письмо автору
 
 

ДД.
Подскажите пожалуйста, как можно реализовать сабжевое? Например как тут.
Я даже не представляю, как это можно сделать :(

  Ответить  
 
 автор: cheops   (08.11.2011 в 16:11)   письмо автору
 
   для: Aidaho   (08.11.2011 в 16:01)
 

На самом деле это не сложно, все комментарии нумеруются уникальными идентификаторами id_post. При построении древовидной структуры вам нужно просто указывать идентификатора родительского комментария в специальном поле id_parent. Для корневого сообщения это поле будет принимать значение 0, так вы сможете быстро найти первое сообщение, чтобы получить ответы на него, вам нужно будет выбрать сообщения у которых id_parent равен id_post корневого сообщения и далее рекурсивно повторять эту операция до тех пор, пока не закончатся сообщения в теме.

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

  Ответить  
 
 автор: Aidaho   (08.11.2011 в 16:33)   письмо автору
 
   для: cheops   (08.11.2011 в 16:11)
 

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

Про базу значит правильно подумал, но вот как сделать логику на php?

Я почти понимаю, но до конца не доходит. Сейчас сделал вот так:

function commentShow($id) {
    $q = "select * from comment where post_id = '".$id."' and parent = '0' order by Id desc";
    $res = mysql_query($q) or die(mysql_error());
    while($comment = mysql_fetch_array($res)) {
        echo '<div class="comment-show">';
                <span class="comment-user">'.$comment['user_name'].'</span>
        $query = "select * from comment where parent = '".$comment['Id']."'";
        $resul = mysql_query($query) or die(mysql_error());
        while($commentAns = mysql_fetch_array($resul)) {
            echo '<div class="comment-show">';
                <span class="comment-user">'.$comment['user_name'].'</span>
            }
        echo '</div>';
        }
    }


Но в таком случаи выводит только на 1 вложенность... т.е. ответ на ответ уже не показывается :)

  Ответить  
 
 автор: cheops   (08.11.2011 в 16:38)   письмо автору
 
   для: Aidaho   (08.11.2011 в 16:33)
 

Функция нужно сделать рекурсивной, т.е. в цикле while добавить вызов этой же самой функции commentShow() для новых позиций. Кроме этого неплохо бы завести второй параметр, через который передавать степень вложенности, увеличивая его на каждом уровне. Пример можно посмотреть по ссылке http://softtime.ru/forum/read.php?id_forum=3&id_theme=79277.

  Ответить  
 
 автор: Aidaho   (08.11.2011 в 17:07)   письмо автору
 
   для: cheops   (08.11.2011 в 16:38)
 

Чего то не до конца понял по примеру.
А как цикл поймет, что закончились комментарии?
И каким образом лучше реализовать параметр со степенью вложенности?

  Ответить  
 
 автор: cheops   (09.11.2011 в 13:57)   письмо автору
 
   для: Aidaho   (08.11.2011 в 17:07)
 

>А как цикл поймет, что закончились комментарии?
Если записей нет, то не будет выполнения цикла while() новых рекурсивных вызовов.

>И каким образом лучше реализовать параметр со степенью вложенности?
Это зависит от того, как вы это хотите оформить, в случае выпадающих списков можно просто добавлять пробелы, в случае блоков или таблиц можно передавать отступ в процентах или пикселах, увеличивая это значение на какую-то фиксированную или переменную величину.

  Ответить  
 
 автор: Aidaho   (10.11.2011 в 14:58)   письмо автору
 
   для: cheops   (09.11.2011 в 13:57)
 

>Это зависит от того, как вы это хотите оформить, в случае выпадающих списков можно просто добавлять пробелы, в случае блоков или таблиц можно передавать отступ в процентах или пикселах, увеличивая это значение на какую-то фиксированную или переменную величину.
Меня интересует именно в базе можно сделать.

Все таки не могу понять, нет ли у вас примеров?

  Ответить  
 
 автор: cheops   (10.11.2011 в 15:01)   письмо автору
 
   для: Aidaho   (10.11.2011 в 14:58)
 

А, имеется в виду как организовать таблицу базы данных? У вас сейчас таблица какой вид имеет?

PS Пример лучше адаптировать к вашим названиям, если не сложно выполните запрос SHOW CREATE TABLE применительно к вашей таблице, чтобы можно было воспроизвести ситуацию.

  Ответить  
 
 автор: Aidaho   (10.11.2011 в 15:46)   письмо автору
 
   для: cheops   (10.11.2011 в 15:01)
 

Вот:

CREATE TABLE `comment` (
  `Id` int(11) NOT NULL auto_increment,
  `post_id` int(11) NOT NULL default '0',
  `user_name` varchar(255) NOT NULL default '',
  `comment` tinytext NOT NULL,
  `mail` varchar(255) NOT NULL default '',
  `day` int(2) NOT NULL default '0',
  `month` int(2) NOT NULL default '0',
  `year` int(4) NOT NULL default '0',
  `time` varchar(255) NOT NULL default '',
  `vote` int(11) NOT NULL default '0',
  `parent` int(11) NOT NULL default '0',
  PRIMARY KEY  (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

  Ответить  
 
 автор: Aidaho   (15.11.2011 в 07:31)   письмо автору
 
   для: cheops   (10.11.2011 в 15:01)
 

Подскажите? :)

  Ответить  
 
 автор: cheops   (15.11.2011 в 13:43)   письмо автору
 
   для: Aidaho   (15.11.2011 в 07:31)
 

Попробуйте следующий скрипт
<?php
  
// Устанавливаем соединение с базой данных
  
require_once("config.php");

  
// Использование
  
echo tree_comment(0);
  
// Реализация
  
function tree_comment($id 0$intent 0
  { 
    
$id intval($id); 

    
$query "SELECT * FROM comment
              WHERE parent = 
$id 
              ORDER BY year, month, day, `time`"

    
$com mysql_query($query); 
    if(!
$com) exit("Ошибка извлечения комментариев"); 
    if(
mysql_num_rows($com)) 
    { 
      while(
$comment mysql_fetch_array($com)) 
      { 
        
// Вывод комментария
        
echo "<p style='margin-left: {$intent}px'>{$comment['comment']}</p>"
        
// Рекурсивный вызов
        
tree_comment($catalog['Id'], $intent 5); 
      } 
    } 
  } 
?>

  Ответить  
 
 автор: Aidaho   (15.11.2011 в 14:02)   письмо автору
 
   для: cheops   (15.11.2011 в 13:43)
 

Спасибо :)
Сегодня утром подумав пришел примерно к такому же решению, только без рекурсивного вызова функции.
Если кому-то будет интересно то сделал так:
function commentShow($id) {
    $q = "select * from comment where post_id = '".$id."' and parent = '0' order by Id desc";
    $res = mysql_query($q) or die(mysql_error());
    while($comment = mysql_fetch_array($res)) {
        echo '<div class="comment-show">';
                <span class="comment-user">'.$comment['user_name'].'</span>
        $query = "select * from comment where parent = '".$comment['Id']."'";
        $resul = mysql_query($query) or die(mysql_error());
        while($commentAns = mysql_fetch_array($resul)) {
            if($commentAns['legacy'] >= 1) {
                $padding = 15 * $commentAns['legacy'].'px';
                $paddingStyle = 'style="padding-left: '.$padding.'"';
                } else {
                    $paddingStyle = '';
                    }
            echo '<div class="comment-show-ans" '.$paddingStyle.'>';
                <span class="comment-user">'.$comment['user_name'].'</span>
            }
        echo '</div>';
        }
    }

  Ответить  
 
 автор: cheops   (15.11.2011 в 14:07)   письмо автору
 
   для: Aidaho   (15.11.2011 в 14:02)
 

Хм... а если еще один уровень вложения добавится?

  Ответить  
Rambler's Top100
вверх

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