Создать ответ 
Построение дерева иерархии или дерева комментариев
Автор Сообщение
Kenpack Не на форуме
Сержант
*

Сообщений: 37
У нас с: Jan 2014
Сообщение: #151
RE: Построение дерева иерархии или дерева комментариев
Спасибо, всё работает как нужно, вроде. У меня возникла ещё одна проблема, в adminka.php у меня отображается только текст первого комментария, а у остальных всё пусто, однако численность комментариев правильно выводит. Не знаете, как это решить?
12.02.2014 10:56:06
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #152
RE: Построение дерева иерархии или дерева комментариев
У Вас пересекаются две переменные $result (одна затирает другую, т.к. один запрос находится внутри цикла другого).
Замените в строчках:
PHP код:
$result=mysql_query("SELECT message FROM comment WHERE id='".$comments[parent_id]."' ORDER BY id"$link);
$parent=mysql_fetch_array($result); 
имя переменной $result на любое другое (хоть $result2).
12.02.2014 19:44:57
Найти все сообщения Цитировать это сообщение
Kenpack Не на форуме
Сержант
*

Сообщений: 37
У нас с: Jan 2014
Сообщение: #153
RE: Построение дерева иерархии или дерева комментариев
Спасибо, теперь нормально работает.
13.02.2014 11:10:55
Найти все сообщения Цитировать это сообщение
Kenpack Не на форуме
Сержант
*

Сообщений: 37
У нас с: Jan 2014
Сообщение: #154
RE: Построение дерева иерархии или дерева комментариев
Здравствуйте.
Помогите мне ещё пожалуйста решить проблему(ы), возможно не связанные с темой, простите если это так.

1) У меня в файле index.php есть таблица, сортировка, и постраничная навигация в ней. Суть проблемы такая, как сделать на подобие этого: "Комментариев: ( количество комментариев в этой статье)" в каждом столбике. Код этого файла не мой, я взял с одного сайта и делаю под себя.

2) Как сделать в моём постраничном навигации проверку страниц, то есть, например: у меня 15 статьей и постраничная навигация делит по 5 статьей в каждую страницу, получается всего 3, а если пользователь вздумает поменять в GET значение 3 на 4, то очевидно что статьей больше нету и вывести на экран например:"Такой страницы не существует".
И как сделать чтобы постраничная навигация понимала что site.ru или site.ru/index.php это 1 страница, а то у меня $i++ не так работает как хотелось бы.

Вот файл index.php
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<?php
include("config.php");
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Таблица</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript' src="jquery.cookies.js"></script>
<script type='text/javascript' src="jquery_vote.js"></script>
</head>
<body>
<?php

$query = "SELECT COUNT(*) FROM entries";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );
    
if ( isset($_GET['page']) ) {
  $page = (int)$_GET['page'];
  if ( $page < 1 ) $page = 1;
} else {
  $page = 1;
}

$uri = $_SERVER['PHP_SELF'].'?';
if ( $_SERVER['QUERY_STRING'] != '' ) {
  foreach( $_GET as $key => $value ) {
    if ( $key != 'page' ) $uri = $uri.$key.'='.urlencode($value).'&';
  }  
}

$cnt_pages = ceil( $total / ITEMS_PER_PAGE );
if ( $page > $cnt_pages ) $page = $cnt_pages;
$start = ( $page - 1 ) * ITEMS_PER_PAGE;


$orderby = 'votes_up';
$sort = 'DESC';
if ( isset( $_GET['orderby'] ) and isset( $_GET['sort'] ) ) {
  if ( in_array( $_GET['orderby'], array( 'mesto', 'title', 'votes_up', 'view' ) ) ) $orderby = $_GET['orderby'];
  if ( in_array( $_GET['sort'], array( 'ASC', 'DESC' ) ) ) $sort = $_GET['sort'];
}

$query = 'SELECT *
          FROM entries
          ORDER BY '.$orderby.' '.$sort.'
          LIMIT '.$start.', '.ITEMS_PER_PAGE;
$res = mysql_query( $query );


echo '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; style="width:690px" width="690px"; empty-cells: show;">'."\n";
echo '<tr>';
if ( $sort == 'ASC' ) {
  $tmp = 'DESC';
  $image = 'down.gif';
} else {
  $tmp = 'ASC';
  $image = 'up.gif';
}
if ( $orderby == 'mesto' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=mesto&sort='.$tmp.'&page='.$page.'">место</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=mesto&sort=ASC&page='.$page.'">место</a></th>';
if ( $orderby == 'title' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort='.$tmp.'&page='.$page.'">Наименование</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=title&sort=ASC&page='.$page.'">Наименование</a></th>';
if ( $orderby == 'votes_up' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=votes_up&sort='.$tmp.'&page='.$page.'">Голоса</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=votes_up&sort=ASC&page='.$page.'">Голоса</a></th>';
  if ( $orderby == 'view' )
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=view&sort='.$tmp.'&page='.$page.'">Просмотры</a>&nbsp;<img src="'.$image.'" alt="" /></th>';
else
  echo '<th><a href="'.$_SERVER['PHP_SELF'].'?orderby=view&sort=ASC&page='.$page.'">просмотры</a></th>';
echo '</tr>'."\n";

$res = mysql_query($query);
$i = 1+4*($_GET['page']-1);
while($prd = mysql_fetch_array($res))
{  
    printf("<div class='textserv'>
    <table width='690' border='1px solid' cellpadding='0' cellspacing='0' style='max-width:690px;background-color:#FFF;'>
      <tr>
        <td width='46' height='30' style='text-align:center'>%s</td>
        <div><td width='494'><div class='toptext'><a href='title.php?id=%s'>%s</a></div><div><a href='javascript:;' class='vote_up' id='%s'><div class='votes_count' id='votes_count %s' <div class='num_vote'>%s<img src='images/thumb_up.png' height='25px' class='imagevote'><div class='imagetext'></a></div>
        </td>
        <td width='142'><div><div class='imageglas'><div class='textglas'>%s</div>Просмотры:</div></div></td>
      </tr>
      <table class='textleftserv'  height='100' border='1px solid' cellspacing='0' cellpadding='0' align='center'>
      <tr>
        
        <td class='tableright' style='vertical-align:top; background-color:#FFF; max-width:530px;'><div>%s</div></td>
        </tr>
      </table>
    </table>
    </div>", $i++,$prd['id'],$prd['title'],$prd['id'],$prd['id'],$prd['votes_up'],$prd['view'],$prd['title']);
}
echo '</table>'."\n";

// постраничная навигация
if ( $cnt_pages > 1 )
{
    echo '<div style="margin:1em 0">&nbsp;Страницы: ';
    if ( $page > 3 )
        $startpage = '<a href="'.$uri.'page=1"><<</a> ... ';
    else
        $startpage = '';
    if ( $page < ($cnt_pages - 2) )
        $endpage = ' ... <a href="'.$uri.'page='.$cnt_pages.'">>></a>';
    else
        $endpage = '';
    if ( $page - 2 > 0 )
        $page2left = ' <a href="'.$uri.'page='.($page - 2).'">'.($page - 2).'</a> | ';
    else
        $page2left = '';
    if ( $page - 1 > 0 )
        $page1left = ' <a href="'.$uri.'page='.($page - 1).'">'.($page - 1).'</a> | ';
    else
        $page1left = '';
    if ( $page + 2 <= $cnt_pages )

        $page2right = ' | <a href="'.$uri.'page='.($page + 2).'">'.($page + 2).'</a>';
    else
        $page2right = '';
    if ( $page + 1 <= $cnt_pages )
        $page1right = ' | <a href="'.$uri.'page='.($page + 1).'">'.($page + 1).'</a>';
    else
        $page1right = '';
    echo $startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.$page1right.$page2right.$endpage."\n";

    echo '</div>'."\n";
}
?>
</body>
</html>

А вот config.php если понадобиться.
Код:
<?php
$dblocation = "localhost";   // Имя сервера
$dbuser     = "Danil";        // Имя пользователя
$dbpswrd    = "1234561";            // Пароль
$dbname     = "entries";    // Имя базы данных

DEFINE('ITEMS_PER_PAGE', 4);

// Соединение с сервером базы данных
$dbpower = mysql_connect( $dblocation, $dbuser, $dbpswrd);
mysql_query( 'SET NAMES cp1251' );
mysql_query('SET NAMES utf8');
// Выбираем базу данных
mysql_select_db( $dbname, $dbpower );


?>
15.02.2014 14:27:46
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #155
RE: Построение дерева иерархии или дерева комментариев
По первому вопросу многое зависит от конкретной структуры таблиц и т.д.
Простым (не оптимальным) решением может быть простое добавление внутри цикла while SQL запроса, который будет находить количество комментариев для конкретной темы.

По второму вопросу... Проверка страниц у Вас в строчке if ( $page > $cnt_pages ) $page = $cnt_pages;
Можно сделать, например, так:
if ( $page > $cnt_pages ) { echo 'Такой страницы не существует'; die(); }

Чтобы объединить site.ru и site.ru/index.php, используйте директивы в файле .htaccess. Вот, например, как сделано у нас:
Код:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://usefulscript.ru/ [R=301,L]
15.02.2014 15:40:36
Найти все сообщения Цитировать это сообщение
Kenpack Не на форуме
Сержант
*

Сообщений: 37
У нас с: Jan 2014
Сообщение: #156
RE: Построение дерева иерархии или дерева комментариев
По самому последнему вроде бы не то получилось, или может я сам неправильно сделал...
Мне нужно чтобы например: http://localhost/test1/ или http://localhost/test1/index.php имел параметр ?page=1, но незаметный в url.
15.02.2014 16:55:38
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #157
RE: Построение дерева иерархии или дерева комментариев
Так это у Вас уже сделано:
PHP код:
if ( isset($_GET['page']) ) {
   
$page = (int)$_GET['page'];
   if ( 
$page $page 1;
 } else {
   
$page 1;
 } 
15.02.2014 16:59:09
Найти все сообщения Цитировать это сообщение
Kenpack Не на форуме
Сержант
*

Сообщений: 37
У нас с: Jan 2014
Сообщение: #158
RE: Построение дерева иерархии или дерева комментариев
Это почему-то не работает.
15.02.2014 17:02:36
Найти все сообщения Цитировать это сообщение
ale10ey Не на форуме
Генерал-лейтенант
*

Сообщений: 352
У нас с: Nov 2014
Сообщение: #159
RE: Построение дерева иерархии или дерева комментариев
(20.07.2012 16:25:00)Admin писал(а):  Все так и должно быть.

Далее необходимо сформировать MySQL запрос на выборку нужного количества родительских комментариев и всех их потомков.

Для этого изменяем наш MySQL запрос:

Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 ORDER BY id", $link);
$number = mysql_num_rows($result);

на такой:

Код:
$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and first_parent=0 ORDER BY id LIMIT ".($number_theme*5-5).",5", $link);
$number = mysql_num_rows($result);
$zapros='';
for ($n=1; $n<=$number; $n++) {
    $parents[$n]=mysql_fetch_array($result);
    $zapros.=$parents[$n][id].','.$parents[$n][id].',';
}
$zapros=substr($zapros, 0, -1);

$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[mess_url]."' and moderation=1 and (id IN(".$zapros.") or first_parent IN(".$zapros."))", $link);
$number = mysql_num_rows($result);

Видимых изменений пока тоже не должно быть т.к. у нас пока все комментарии - родительские.

Доброе время суток,
Ранее я вам задавал вопрос, но не постарался сам решить проблему, поэтому и было много вопросов насчет кнопки "Ответить" с которой я разобрался как реализовать, а вот с деревом не получается, хотя вроде все правильно, но думаю, что упустил кое-что, что отвечает за формирование дерева.

В коде обработки отправленных сообщений меняю строку:
$result = mysql_query("insert into comment (date,theme,login,message)
values ('".date("Y-m-d H:i:s")."','".$_SESSION[mess_url]."',
'".$_SESSION[comment_mess_login]."','".$_SESSION[comment_user_text]."')");

на:
if (isset($_POST[parent_id])) $result = mysql_query("insert into comment (parent_id,first_parent,date,theme,login,message) values ('".$_POST[parent_id]."','".$_POST[first_parent]."','".date("Y-m-d H:i:s")."','".$_SESSION[mess_url]."','".$_SESSION[comment_mess_login]."','".$_SESSION[comment_user_text]."')");
else $result = mysql_query("insert into comment (date,theme,login,message) values ('".date("Y-m-d H:i:s")."','".$_SESSION[mess_url]."','".$_SESSION[comment_mess_login]."','".$_SESSION[comment_user_text]."')");


Код для вывода комментариев выглядит так:

<?php

function parents($parent=0,$left=0) {
global $tags;

for ($i=0;$i<=count($tags[$parent])-1;$i++) {

$result_minus = mysql_query("SELECT sum(ocenka=1), sum(ocenka=0) FROM ocenka_comment WHERE comment_id='".$tags[$parent][$i][0]."' LIMIT 1");
$ocenka_com=mysql_fetch_array($result_minus);

if ($tags[$parent][$i][2]=='Администратор') $tags[$parent][$i][2]='<font color="#cc1111">Администратор</font>';
echo '<div align="right" style="margin:0px 0px 0px '.$left.'px;">';

//Тут блок вывода комментариев
echo '<br><table border="0" width="95%" style="border: 1px solid #4874a3;" bgcolor="#fffabc"><tr>';
echo '<td align="left" style="padding:5px 5px 5px 5px;">';
echo '<div id="m'.$tags[$parent][$i][0].'"></div><b>'.$tags[$parent][$i][2].'</b></td>';
echo '<td width="140">';
echo '<span style="font-size:12px;">('.$tags[$parent][$i][3].')</span></td>';
echo '<td width="20" >';
echo '<form method="POST" action="'.$_SESSION[full_url].'#m'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="comment_id" value="'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="ocenka" value="1">';
echo '<input type="image" src="comm_up.gif" title="Хороший комментарий" align="middle">';
echo '</form></td>';
echo '<td width="5"><b>'.($ocenka_com[0]-$ocenka_com[1]).'</b></td>';
echo '<td width="20">';
echo '<form method="POST" action="'.$_SESSION[full_url].'#m'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="comment_id" value="'.$tags[$parent][$i][0].'">';
echo '<input type="hidden" name="ocenka" value="0">';
echo '<input type="image" src="comm_down.gif" title="Плохой комментарий" align="middle">';
echo '</form></td></tr></table>';
echo '<table border="0" width="95%" style="border: 1px solid #eeeeee;"bgcolor="#f0fff0">';
echo '<tr><td width="100"><img src="'.$ava_user[$tags[$parent][$i][2]].'">';
echo '<td>';
if (($ocenka_com[0]-$ocenka_com[1])<0)
echo '<div><a href="javscript://" class="spoiler_links">Показать</a><div class="spoiler_body">'.wordwrap(nl2br($tags[$parent][$i][1]), 70, "\n", 1).'</div></div>';
else echo wordwrap(nl2br($tags[$parent][$i][1]), 70, "\n", 1);
echo '</td></tr></table>';
echo '<div align="center" id="close_hint" class="open_hint" onClick="comm_on('.$tags[$parent][$i][0].','.$tags[$parent][$i][6].')">Ответить</div>';
if (isset($tags[ $tags[$parent][$i][0] ])) parents($tags[$parent][$i][0],20);
echo '</div>';
}
}


$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[full_url]."' and moderation=1 and first_parent=0 ORDER BY id".($number_theme*5-5).",5", $link);
$number = mysql_num_rows($result);
$zapros='';
for ($n=1; $n<=$number; $n++) {
$parents[$n]=mysql_fetch_array($result);
$zapros.=$parents[$n][id].','.$parents[$n][id].',';
}
$zapros=substr($zapros, 0, -1);

$result = mysql_query("SELECT * FROM comment WHERE theme='".$_SESSION[full_url]."' and moderation=1 and (id IN(".$zapros.") or first_parent IN(".$zapros."))", $link);
$number = mysql_num_rows($result);



if ($number>0) {
while ($comments=mysql_fetch_assoc($result)) $tags[(int)$comments['parent_id']][]=array((int)$comments['id'], $comments['message'], $comments['login'], $comments['date'], $comments['plus'], $comments['minus'], $comments['first_parent']);
echo parents().'</div>';
echo '<div style="padding:3px;margin-top:10px; border-top:3px solid #09C;">
<p align="center"><strong>Последние комментарии посетителей:</strong></p><br></div>';
}


if (is_numeric($_POST[comment_id])and($_POST[ocenka]=='0' or $_POST[ocenka]=='1')){
$result = mysql_query("SELECT count(id),ocenka FROM ocenka_comment WHERE comment_id='".$_POST[comment_id]."' and ip='".$ip_short."'", $link);
$number = mysql_fetch_array($result);
if ($number[0]==0) {
$result = mysql_query("insert into ocenka_comment (date,comment_id,ip,ocenka) values ('".date("Y-m-d H:i:s")."','".$_POST[comment_id]."','".$ip_short."','".$_POST[ocenka]."')"); }
elseif ($number[ocenka]!=$_POST[ocenka]) {
$result = mysql_query("UPDATE ocenka_comment SET date='".date("Y-m-d H:i:s")."',ocenka='".$_POST[ocenka]."' WHERE comment_id='".$_POST[comment_id]."' and ip='".$ip_short."'"); }
}
?>

Пробелы сделал, чтобы было наглядней и наличие возможной ошибки и на скриншоте, как форма выглядит сейчас:
[Изображение: tid_135_the_form.png]

Знаю, что для вас давнишняя тема, но буду признателен, если уделите немного своего времени. С уважением и заранее благодарен.
15.04.2015 00:45:12
Найти все сообщения Цитировать это сообщение
Admin Не на форуме
Верховный
Главнокомандующий
(Administrator)
*

Сообщений: 2,431
У нас с: Aug 2011
Сообщение: #160
RE: Построение дерева иерархии или дерева комментариев
Код скопировал, проверил, и он вполне рабочий (смещение комментариев присутствует).

Проверьте, при использовании кнопки "ответить", пишутся ли у Вас какие-либо значения в базу в столбцы parent_id и first_parent.

P.S. Просто сейчас из-за работы на сайт времени практически нет, в интернете появляюсь редко, но тему с добавлением комментариев уже давно планировал серьезно обновить.
15.04.2015 21:52:08
Найти все сообщения Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)


LiveInternet
© Copyright 2011-2024 by UsefulScript.ru