|
|
|
| ДД.
Подскажите пожалуйста, как можно реализовать сабжевое? Например как тут.
Я даже не представляю, как это можно сделать :( | |
|
|
|
|
|
|
|
для: Aidaho
(08.11.2011 в 16:01)
| | На самом деле это не сложно, все комментарии нумеруются уникальными идентификаторами id_post. При построении древовидной структуры вам нужно просто указывать идентификатора родительского комментария в специальном поле id_parent. Для корневого сообщения это поле будет принимать значение 0, так вы сможете быстро найти первое сообщение, чтобы получить ответы на него, вам нужно будет выбрать сообщения у которых id_parent равен id_post корневого сообщения и далее рекурсивно повторять эту операция до тех пор, пока не закончатся сообщения в теме.
Чтобы не дергать базу данных на каждой итерации, как правило, все сообщения извлекают в массив или в пару массивов и рекурсивный спуск осуществляют, оперируя данными в оперативной памяти. | |
|
|
|
|
|
|
|
для: 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 вложенность... т.е. ответ на ответ уже не показывается :) | |
|
|
|
|
|
|
|
для: Aidaho
(08.11.2011 в 16:33)
| | Функция нужно сделать рекурсивной, т.е. в цикле while добавить вызов этой же самой функции commentShow() для новых позиций. Кроме этого неплохо бы завести второй параметр, через который передавать степень вложенности, увеличивая его на каждом уровне. Пример можно посмотреть по ссылке http://softtime.ru/forum/read.php?id_forum=3&id_theme=79277. | |
|
|
|
|
|
|
|
для: cheops
(08.11.2011 в 16:38)
| | Чего то не до конца понял по примеру.
А как цикл поймет, что закончились комментарии?
И каким образом лучше реализовать параметр со степенью вложенности? | |
|
|
|
|
|
|
|
для: Aidaho
(08.11.2011 в 17:07)
| | >А как цикл поймет, что закончились комментарии?
Если записей нет, то не будет выполнения цикла while() новых рекурсивных вызовов.
>И каким образом лучше реализовать параметр со степенью вложенности?
Это зависит от того, как вы это хотите оформить, в случае выпадающих списков можно просто добавлять пробелы, в случае блоков или таблиц можно передавать отступ в процентах или пикселах, увеличивая это значение на какую-то фиксированную или переменную величину. | |
|
|
|
|
|
|
|
для: cheops
(09.11.2011 в 13:57)
| | >Это зависит от того, как вы это хотите оформить, в случае выпадающих списков можно просто добавлять пробелы, в случае блоков или таблиц можно передавать отступ в процентах или пикселах, увеличивая это значение на какую-то фиксированную или переменную величину.
Меня интересует именно в базе можно сделать.
Все таки не могу понять, нет ли у вас примеров? | |
|
|
|
|
|
|
|
для: Aidaho
(10.11.2011 в 14:58)
| | А, имеется в виду как организовать таблицу базы данных? У вас сейчас таблица какой вид имеет?
PS Пример лучше адаптировать к вашим названиям, если не сложно выполните запрос SHOW CREATE TABLE применительно к вашей таблице, чтобы можно было воспроизвести ситуацию. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(10.11.2011 в 15:01)
| | Подскажите? :) | |
|
|
|
|
|
|
|
для: 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);
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: 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>';
}
}
|
| |
|
|
|
|
|
|
|
для: Aidaho
(15.11.2011 в 14:02)
| | Хм... а если еще один уровень вложения добавится? | |
|
|
|