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

Форум PHP

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

 

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

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

тема: Проектирование форума
 
 автор: ladan   (17.01.2012 в 09:40)   письмо автору
 
 

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

  Ответить  
 
 автор: Slo_Nik   (17.01.2012 в 11:50)   письмо автору
 
   для: ladan   (17.01.2012 в 09:40)
 

почему Вы так решили?

  Ответить  
 
 автор: ladan   (17.01.2012 в 12:13)   письмо автору
 
   для: 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, и ищу в уже другой таблице тот ответ, которому соответсвует ссылка. Может непонятно написал... но ведь правильно, что темы хранят в одной таблице, а ответы на них в другой?

  Ответить  
 
 автор: Slo_Nik   (17.01.2012 в 12:22)   письмо автору
 
   для: ladan   (17.01.2012 в 12:13)
 

имя переменной одинаково, но вот значение разное

  Ответить  
 
 автор: ladan   (17.01.2012 в 12:31)   письмо автору
 
   для: Slo_Nik   (17.01.2012 в 12:22)
 

А мой вопрос: "но ведь правильно, что темы хранят в одной таблице, а ответы на них в другой?" ? :)

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

  Ответить  
 
 автор: Slo_Nik   (17.01.2012 в 12:34)   письмо автору
 
   для: ladan   (17.01.2012 в 12:31)
 

я бы сделал чтобы темы были в одной таблице, а ответы в другой....

  Ответить  
 
 автор: ladan   (17.01.2012 в 12:35)   письмо автору
 
   для: Slo_Nik   (17.01.2012 в 12:34)
 

спасибо за подсказку :) Да и проблем тогда не будет с перемещением тем..

  Ответить  
 
 автор: cheops   (17.01.2012 в 14:07)   письмо автору
 
   для: ladan   (17.01.2012 в 09:40)
 

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

  Ответить  
 
 автор: ladan   (17.01.2012 в 17:53)   письмо автору
 
   для: cheops   (17.01.2012 в 14:07)
 

Спасибо, все ясно :)

  Ответить  
 
 автор: ladan   (17.01.2012 в 18:33)   письмо автору
 
   для: cheops   (17.01.2012 в 14:07)
 

А вот человек создает тему, вся информация(кто автор темы, дата создания, название темы) находятся в одной таблице, а самое первое сообщение тоже в ней же или уже в другой?

  Ответить  
 
 автор: cheops   (17.01.2012 в 20:37)   письмо автору
 
   для: ladan   (17.01.2012 в 18:33)
 

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

  Ответить  
 
 автор: ladan   (17.01.2012 в 20:54)   письмо автору
 
   для: cheops   (17.01.2012 в 20:37)
 

спасибо!

  Ответить  
 
 автор: ladan   (18.01.2012 в 01:56)   письмо автору
 
   для: 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) выводится на экран до бесконечности... Не подскажите где тут проблема ? :)

  Ответить  
 
 автор: cheops   (18.01.2012 в 02:12)   письмо автору
 
   для: ladan   (18.01.2012 в 01:56)
 

Если зацикливания нет, то не должно быть бесконечности, рано или поздно должен появиться пост, у которого не будет ответов и рекурсия должна развернуться в обратную сторону.

  Ответить  
 
 автор: ladan   (18.01.2012 в 10:38)   письмо автору
 
   для: 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 в 12:03)   письмо автору
 
   для: ladan   (18.01.2012 в 10:38)
 

все, вроде разобрался, недоглядел скрипт :)

Все супер, работает как надо :)

  Ответить  
 
 автор: ladan   (18.01.2012 в 19:39)   письмо автору
 
   для: 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   (19.01.2012 в 10:39)   письмо автору
 
   для: ladan   (18.01.2012 в 19:39)
 

все, разобрался

  Ответить  
 
 автор: ladan   (20.01.2012 в 02:16)   письмо автору
 
   для: 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 в 12:09)   письмо автору
 
   для: ladan   (20.01.2012 в 02:16)
 

Хелп плииз

if(!$search) echo mysql_error(); /* тоже ошибок никаких не выдает */

  Ответить  
 
 автор: ladan   (20.01.2012 в 14:51)   письмо автору
 
   для: ladan   (20.01.2012 в 12:09)
 

разобрался!

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

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