|
|
|
| Всем привет. Пишу на сайте форум. Решил сделать по аналогии как на софттайме, но что-то типа демо версии. Уже сделал рабочую часть, но получилось так, что темы создаются в одной таблице, а ответы к конкретным темам в другой.. Сейчас обратил внимание, что на этом форуме и темы и ответы видимо все в одной таблице находятся? | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 09:40)
| | почему Вы так решили? | |
|
|
|
|
|
|
|
для: Slo_Nik
(17.01.2012 в 11:50)
| | http://softtime.ru/forum/pstadd.php?id_forum=1&id_theme=84460&id_post=502263
Последняя переменная, она одинакова что для ответов, что и для основного сообщения в теме
В своей версии "форума", когда жму ответить для первого сообщения темы, идет поиск по таблице и ищет тему с передаваемым параметром id. А чтобы ответить на уже существубщий ответ, я запоминаю этот id в сессию и делаю ссылку на ответ с параметром, например id_reply, и ищу в уже другой таблице тот ответ, которому соответсвует ссылка. Может непонятно написал... но ведь правильно, что темы хранят в одной таблице, а ответы на них в другой? | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 12:13)
| | имя переменной одинаково, но вот значение разное | |
|
|
|
|
|
|
|
для: Slo_Nik
(17.01.2012 в 12:22)
| | А мой вопрос: "но ведь правильно, что темы хранят в одной таблице, а ответы на них в другой?" ? :)
Попробую все переделать и сделать в одной таблице. Или получается, что основное сообщение из темы, дублируется в другую таблицу ответов и отсюда одинаковый параметр и разными значениями, я так подумал. | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 12:31)
| | я бы сделал чтобы темы были в одной таблице, а ответы в другой.... | |
|
|
|
|
|
|
|
для: Slo_Nik
(17.01.2012 в 12:34)
| | спасибо за подсказку :) Да и проблем тогда не будет с перемещением тем.. | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 09:40)
| | Тут вот как сделано - есть темы, которые могут содержать один или более сообщений. Темы и сообщения хранятся каждые в свой собственной таблице. | |
|
|
|
|
|
|
|
для: cheops
(17.01.2012 в 14:07)
| | Спасибо, все ясно :) | |
|
|
|
|
|
|
|
для: cheops
(17.01.2012 в 14:07)
| | А вот человек создает тему, вся информация(кто автор темы, дата создания, название темы) находятся в одной таблице, а самое первое сообщение тоже в ней же или уже в другой? | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 18:33)
| | В другой. Смысл в том, что все сообщения хранятся в своей таблице, а заголовочная информация тем - в своей. При этом вам нужно продублировать время и автора сообщения в обеих таблицах, но это, как правило, меньший объем, чем дублирование текста сообщения. Зато сообщения вы можете обрабатывать одни запросом, без дополнительного обращения к таблице тем с целью узнать, что же там было в самом первом сообщении. | |
|
|
|
|
|
|
|
для: cheops
(17.01.2012 в 20:37)
| | спасибо! | |
|
|
|
|
|
|
|
для: ladan
(17.01.2012 в 20:54)
| | захотелось тоже реализовать древовидные комменты как здесь, читал тему http://softtime.ru/forum/read.php?id_forum=3&id_theme=83287,
был приведен скрипт
<?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);
}
}
}
?>
|
для
таблицы
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
|
Можно пожалуйста поподробней. Получается, что сначала берем первый комментарий с parent=0, далее идет цикл, выводим его как обычно и идет вызов самой функции(с id основного комментария и +5px). И потом выбираем уже комментарий с parent от основного коммента и опять идет цикл и так далее. Вроде все понятно, но я воспроизвел эту таблицу, приведенная в той теме и этот скрипт и один и получается так, что основной комментарий(где parent=0) выводится на экран до бесконечности... Не подскажите где тут проблема ? :) | |
|
|
|
|
|
|
|
для: ladan
(18.01.2012 в 01:56)
| | Если зацикливания нет, то не должно быть бесконечности, рано или поздно должен появиться пост, у которого не будет ответов и рекурсия должна развернуться в обратную сторону. | |
|
|
|
|
|
|
|
для: cheops
(18.01.2012 в 02:12)
| | таблица
CREATE TABLE `comment` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`comment` tinytext NOT NULL,
`parent` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
|
в ней 1 запись с parent=0
Получается, что я как бы сделал пост, на который еще никто ответов не давал, а функция все равно зацикливается и выводит бесконечность этого первого поста.. | |
|
|
|
|
|
|
|
для: ladan
(18.01.2012 в 10:38)
| | все, вроде разобрался, недоглядел скрипт :)
Все супер, работает как надо :) | |
|
|
|
|
|
|
|
для: ladan
(18.01.2012 в 12:03)
| | а как реализовать фишку с редактированием. Когда ответов нет на сообщение, то можно его отредактировать...
Сделал так
<?
function tree_comment($id = 0, $intent = 0)
{
$id = intval($id);
$query = "SELECT * FROM comment
WHERE id_parent = $id";
$com = mysql_query($query);
if(!$com) exit("Ошибка извлечения комментариев");
if(mysql_num_rows($com))
{
while($comment = mysql_fetch_array($com))
{
$edit_post = mysql_query("SELECT * FROM comment");
while($edit_post_row = mysql_fetch_array($edit_post)) /* делаем проверку на ссылки редактирования */
{
if($comment['id'] == $edit_post_row['id_parent']) {$edit_post = "<span style='display:none;'>%s%s</span>"; }/* если текущий id будет найден в id_parent других постов, то редактирование запрещаем :) */
else {$edit_post = "<a href='edit_post.php?id_theme=%s&id=%s'>Редактировать</a>";}
}
// Вывод комментария
printf("
<table>
<tr>
<td style='padding-left: {$intent}px'>%s%s</td>
</tr>
<tr>
<td style='padding-left: {$intent}px'>%s</td>
</tr>
<tr>
<td>$edit_post </td>
</tr>
</table>
", $comment[author],$comment['date'],$comment ['message'],$_GET['id_theme'],$comment ['id'] );
// Рекурсивный вызов
tree_comment($comment['Id'], $intent + 5);
}
}
}
?>
|
Если отвечать на первое сообщение, то ссылка редактирования у первого поста пропадает(что нормально), а если отвечать уже на 2 сообщение, то ссылка у второго поста остается
Подскажите пожалуйста, на что обратить внимание следует... | |
|
|
|
|
|
|
|
для: ladan
(18.01.2012 в 19:39)
| | все, разобрался | |
|
|
|
|
|
|
|
для: ladan
(19.01.2012 в 10:39)
| | В таблице есть ячейка tema(тип text) с FULLTEXT, и есть 1 запись, где в ячейке tema указано число "11111". Пробую найти совпадения, но всегда выводит, что ничего не найдено... С этим дело никогда не имел, не поможете разобраться? Немного погуглив, сделал запрос такого типа, как ниже..
<?
<form action="" method="post">
<input name="search" type="text"><input name="" type="submit" value="Искать">
</form>
<?
$search = mysql_query("SELECT * FROM forum WHERE MATCH(tema) AGAINST('".$_POST['search']."')");
if(mysql_num_rows($search) > 0)
{echo "Найдено";}
else {echo "Ничего не найдено";}
?>
|
| |
|
|
|
|
|
|
|
для: ladan
(20.01.2012 в 02:16)
| | Хелп плииз
if(!$search) echo mysql_error(); /* тоже ошибок никаких не выдает */
|
| |
|
|
|
|
|
|
|
для: ladan
(20.01.2012 в 12:09)
| | разобрался! | |
|
|
|