Скрипт древовидных комментариев PHP

index.php

<?
$conf['db'] = array(
  "server"=>"localhost",
  "user"=>"root",
  "pass"=>"",
  "base"=>"superbase"
);

mysql_connect($conf['db']['server'], $conf['db']['user'], $conf['db']['pass'])or die("Could not connect: ".mysql_error());
mysql_select_db($conf['db']['base'])or die("Could not select: ".mysql_error());
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

if($_GET['op'] === 'clear-all'){
  mysql_query("DELETE FROM les_comments");
  header("Location: index.php");
}

$time = time();
  
if(isset($_POST['uname'])){
  $uname = mysql_real_escape_string($_POST['uname']);
  setcookie("unamecom", $uname, $time + 1209600);   // время существования куки две недели
}elseif(isset($_COOKIE["unamecom"])){
  $uname = mysql_real_escape_string($_COOKIE["unamecom"]);
}else{
  $uname = "Аноним";
}

if(!empty($_POST['uname']) && !empty($_POST['message']) && $_POST['op'] == 'add-comment') {


  $comment = mysql_real_escape_string(strip_tags($_POST['message'], "<p><b><i><font><img>")); // удалим левые теги
  $ip = $_SERVER['REMOTE_ADDR'];
  $client = $_SERVER['HTTP_USER_AGENT'];
  $content_id = intval($_POST['content']);
  $parent_id = intval($_POST['parent']);

  mysql_query("INSERT INTO les_comments (`id`, `name`, `ip`, `client`, `comment`, `content_id`, `parent_id`, `time`) VALUES (NULL, '$uname', '$ip', '$client', '$comment', '$content_id', '$parent_id', '$time')");
}

/*
*/

$content_id = 0;  // это ключевой идентификатор от конкретной статьи(комменты то разные в каждой статье, помним?)

// выводим комменты
$msg = array();
$result = mysql_query("SELECT * FROM les_comments WHERE content_id='$id'");
while($row = mysql_fetch_assoc($result)){
  $msg[] = $row;
}
$count = count($msg);

$parent = 0;
$form = "<div class='editor'>
<form id='comment-form' autocomplete='off' method='post'>
<input type='hidden' name='op' value='add-comment'>
<input type='hidden' name='content' value='{$id}'>
<input type='hidden' name='parent' value='{$parent}'>
<table border='0'><tr><td><input id='uname' name='uname' type='text' value='{$uname}' maxlength='20' size='25' /></td><td>Ваше имя*</td></tr></table>
<textarea name='message' rows='5' cols='65'></textarea><br><input id='submit' name='signup' type='submit' value='Добавить' /></div>
</form>";

$i = 0;
if($count){
  $comments = "<div class='comments-all'><span style='float:left'>Всего комментариев: {$count}</span><span class='add-comment'>Написать комментарий</span></div>".$form;
  
  $msg = crazysort($msg);
  while($i<$count){
    $margin = $msg[$i]['level'] * 20;
    $date = date("d.m.Y в H:i",$msg[$i]['time']);
    $comments .= "<div id='msg{$msg[$i]['id']}' style='margin-left: {$margin}px'><div class='comment-title'><span style='float:left'><b>{$msg[$i]['name']}</b> <small>({$date})</small></span><span class='comment-ans' id={$msg[$i]['id']}>ответить</span></div><div class='comment-message'>{$msg[$i]['comment']}</div></div>";
    $i++;
  }  
}else{
  $comments = "<div class='comments-all'><span style='float:left'>Эту новость ещё не комментировали</span><span class='add-comment'>Написать комментарий</span></div>".$form;
}

// функция сортирует массив по деревьям
function crazysort(&$comments, $parentComment = 0, $level = 0, $count = null){
  if (is_array($comments) && count($comments)){
    $return = array();
    if (is_null($count)){
      $c = count($comments);
    }else{
      $c = $count;
    }
    for($i=0;$i<$c;$i++){
      if (!isset($comments[$i])) continue;
      $comment = $comments[$i];
      $parentId = $comment['parent_id'];
      if ($parentId == $parentComment){
        $comment['level'] = $level;
        $commentId = $comment['id'];
        $return[] = $comment;
        unset($comments[$i]);
        while ($nextReturn = crazysort($comments, $commentId, $level+1, $c)){
          $return = array_merge($return, $nextReturn);
        }
      }
    }
    return $return;
  }
  return false;
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/reset/reset-min.css"/>
<title>Древовидные комментарии для Вашего сайта</title>
<meta name="keywords" content="http://amatar.by комменты"/>
<link rel='stylesheet' type='text/css' href='css/style.css'/>
<script type='text/javascript' src='js/jquery-1.5.2.min.js'></script>
<body>
<div style='margin:0 auto; width:780px'>
<?
echo $comments;
echo "<center><a href='?op=clear-all'>очистить все комменты</a></center>";
?>
</div>
<script>
$(function () {
  $('.add-comment').click(function(){
    var editor = $('.editor');
    if (editor.is(":hidden")){
      editor.slideDown();
    }else{
      editor.slideUp();
    }
    return false;
  });
  
  $('.comment-ans').click(function(){
    var $editor = $('.editor');
    $editor.hide();
    var mid = $(this).attr("id");
    var clone = $editor.clone();
    $editor.remove();
    setTimeout(function(){
      $(clone).css("margin", "5px 0 5px 20px");
      $(clone).insertAfter("div#msg"+mid).slideDown();
      $("input[name=parent]").val(mid);
    }, 200);
  });
    
});
</script>
</body>
</html>

sql

CREATE TABLE IF NOT EXISTS `les_comments` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  `ip` VARCHAR(15) NOT NULL,
  `client` VARCHAR(250) NOT NULL,
  `comment` TEXT NOT NULL,
  `content_id` INT(11) NOT NULL DEFAULT '0',
  `parent_id` INT(11) NOT NULL DEFAULT '0',
  `time` INT(10) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`id`)
) ENGINE=MYISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

style.css

html,body{background-color:#C9CCCD;color:#000000;height:100%;font:normal 14px/20px arial}

.clear{clear:both}

.comments-all{font-size:12px;background-color:#E4E6E6; background-image:url('/images/h-rule.gif');background-repeat:no-repeat;margin-top:30px;margin-bottom:20px;padding:10px 20px; height:20px}
.add-comment{border-bottom:1px dashed #000; cursor:pointer; float:right}
.comment-title{font-size:12px; background-color:#EAEBEB; margin-top:20px; padding:5px 20px;height:20px}
.comment-message{font-size:12px; background-color:#F1F2F2; padding:5px 20px}

.comment{padding:40px 50px}
.editor{display:none; margin-top:1px;padding-top:20px; padding-left:20px;background-color:#F3F5F5}
.comment-ans{float:right; border-bottom:1px dashed #444; cursor:pointer}
#uname{font-size:16px; font-weight:bold;padding:5px;margin:10px 10px 10px 0}
#submit{padding:10px;margin:15px 0;font-weight:bold}
13 comments
  1. Влад
    Влад
    02.07.2013 at 17:46

    Проверка комментирования

    Reply
  2. SpasUser
    SpasUser
    23.07.2013 at 14:36

    Спасибо за статью!

    Reply
  3. Дмитрий Бородин
    Дмитрий Бородин
    26.07.2013 at 22:03

    а где js файлы?

    Reply
  4. utz0r2
    utz0r2
    26.07.2013 at 22:08

    в index.php

    Reply
  5. Дмитрий Бородин
    Дмитрий Бородин
    26.07.2013 at 22:38

    Спасибо огромное! Теперь нужно url,email реализовать.

    Reply
  6. иртпн
    иртпн
    09.06.2014 at 11:15

    Цитата: Влад
    Проверка комментирования

    Reply
  7. Александр
    Александр
    20.06.2014 at 11:42

    интересно, спасибо

    Reply
  8. саша
    саша
    02.05.2015 at 16:01

    примет

    Reply
  9. Аноним
    Аноним
    15.08.2017 at 20:32

    а где js файлы?

    Reply
  10. TheNukerBombs
    TheNukerBombs
    17.08.2017 at 12:10

    Спасибо за js исходники!

    Reply
  11. noname
    noname
    09.03.2019 at 15:00

    и как отвечать на другие комменты

    Reply
    • Name
      Name
      17.02.2021 at 05:28

      Пробую ответить на ваш коммент.

      Reply
  12. ThomasSnori
    ThomasSnori
    19.08.2019 at 04:55

    Приветик всем, я тут новенький "352"

    Reply
Оставить комментарий

Ваш электронный адрес не будет опубликован. Обязательные поля помечены *