В данной теме мы хотим предложить Вам скрипт для создания на своем сайте формы для добавления комментариев к темам сайта. Данная форма нужна для того, чтобы посетители Вашего сайта могли оставлять отзывы и пожелания к темам сайта, а так же задавать вопросы и получать на них ответы от администрации и других посетителей сайта.
Ранее на нашем сайте уже была создана подобная тема, в которой мы рассказывали о том, как создать на своем сайте форму добавления комментариев к темам, но с момента ее создания прошло много времени и уже многое изменилось. В данной темы мы хотим показать улучшенную и оптимизированную версию той формы добавления комментариев для сайта.
Для полноценной работы скрипта, приведенного в данной теме, Вам понадобиться в MySQL создать две таблицы: comment и ocenka_comment.
В таблице comment будут храниться комментарии посетителей и вся необходимая информацию о данных комментариях. В таблице ocenka_comment будут храниться последние оценки к комментариям, поставленные посетителями. Структура данных таблиц приведена на рисунках ниже:
Для быстрого создания таблиц comment и ocenka_comment, воспользуйтесь следующими SQL запросами, приведенными ниже. Для создания таблицы comment используйте код:
Цитата:
CREATE TABLE IF NOT EXISTS `comment` ( `id` int(9) unsigned NOT NULL auto_increment, `parent_id` mediumint(9) unsigned NOT NULL default '0', `first_parent` mediumint(9) unsigned NOT NULL default '0', `date` int(10) unsigned NOT NULL, `theme_id` smallint(6) unsigned NOT NULL, `login` varchar(30) collate utf8_unicode_ci NOT NULL, `message` varchar(9999) collate utf8_unicode_ci NOT NULL, `moderation` tinyint(3) unsigned NOT NULL default '0', `plus` mediumint(9) NOT NULL default '0', `minus` mediumint(9) NOT NULL default '0', PRIMARY KEY (`id`), KEY `theme_id` (`theme_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
А для создания таблицы ocenka_comment воспользуйтесь кодом:
Цитата:
CREATE TABLE IF NOT EXISTS `ocenka_comment` ( `id` int(10) unsigned NOT NULL auto_increment, `date` int(10) unsigned NOT NULL, `comment_id` mediumint(8) unsigned NOT NULL, `ip` int(10) unsigned NOT NULL, `ocenka` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
В результате выполнения приведенных выше SQL запросов у Вас в MySQL должны появиться таблицы, как на скриншотах выше.
После того, как необходимые таблицы в MySQL были уже созданы, в начало Ваших страничек, на которых будет присутствовать форма добавления комментариев (выше тега <head>) поместите следующий PHP код, предназначенный для обработки отправленных сообщений:
PHP код:
<?php $time=time(); if (session_id()=='') session_start(); $db=mysqli_connect("localhost","Ваш_логин","Ваш_пароль","Имя_базы") or die(); $res=mysqli_query($db,"set names utf8"); $mess_url=mysqli_real_escape_string($db,basename($_SERVER['SCRIPT_FILENAME'])); //получаем id текущей темы $res=mysqli_query($db,"SELECT id FROM таблица WHERE file_name='".$mess_url."'"); $res=mysqli_fetch_array($res); $theme_id=$res["id"]; if (isset($_POST["contr_cod"])){ //отправлен комментарий $mess_login=htmlspecialchars($_POST["mess_login"]); $user_text=htmlspecialchars($_POST["user_text"]); if (md5($_POST["contr_cod"])==$_POST["prov_summa"]){ //код правильный if ($mess_login!='' and $user_text!=''){ if (is_numeric($_POST["parent_id"]) and is_numeric($_POST["f_parent"])) $res=mysqli_query($db,"insert into comment (parent_id, first_parent, date, theme_id, login, message) values ('".$_POST["parent_id"]."','".$_POST["f_parent"]."', '".$time."','".$theme_id."','".$mess_login."','".$user_text."')"); else $res=mysqli_query($db,"insert into comment (date, theme_id, login, message) values ('".$time."','".$theme_id."','".$mess_login."','".$user_text."')"); $_SESSION["send"]="Комментарий принят!"; header("Location: $mess_url#last"); exit; } else { $_SESSION["send"]="Не все поля заполнены!"; header("Location: $mess_url#last"); exit; } } else { $_SESSION["send"]="Неверный проверочный код!"; header("Location: $mess_url#last"); exit; } } if (isset($_SESSION["send"]) and $_SESSION["send"]!="") { //вывод сообщения echo '<script type="text/javascript">alert("'.$_SESSION["send"].'");</script>'; $_SESSION["send"]=""; } ?>
Не забудьте при подключении к Вашей MySQL базе в функции mysqli_connect() указать Ваши логин, пароль и имя БД.
Так же хотим обратить Ваше внимание на еще один важный момент - получение id идентификатора текущей темы. Т.к. нам неизвестно, какая структура БД у Вас на сайте, то Вам этот момент придется доделать самим, а именно получить id темы и поместить его в переменную $theme_id. В коде id мы получаем запросом после комментария "//получаем id текущей темы".
Далее, для нормального отображения комментариев и формы добавления комментариев к темам сайта нам понадобятся CSS стили. Для этого добавьте себе следующий CSS код:
HTML код:
<style type="text/css"> .add_comment { display: table; width: 580px; border: 1px solid #000; background-color: #6AF; } .close_hint, .open_hint { float: right; border: 1px solid #77A; background: #6e6; width: 100px; text-align: center; cursor: pointer; } .close_hint { margin: 5px; color: #F00; } .comm_body { padding: 0 5px; background-color:#EEE; text-align:left; } .comm_head { padding: 3px; border: 1px solid #77A; background-color: #DFD; } .comm_minus { background: url('image/minus.png') no-repeat; } .comm_plus { background: url('image/plus.png') no-repeat; } .comm_minus, .comm_plus { float: right; width: 19px; height: 18px; cursor: pointer; } .comm_text { display:none; } .sp_link { color: #F33; cursor: pointer; } .strelka { background: url(image/strelka.png) no-repeat; border-left: 2px solid #000; } .strelka_2 { background: url(image/strelka_2.png) no-repeat; } #hint { position: absolute; display: none; z-index: 100; } </style>
Теперь, после того, как БД создана, и стили прописаны, можно приступать к коду, отвечающему за вывод и добавление комментариев.
В том месте странички, где должны выводиться оставленные посетителями комментарии, добавляем следующий PHP код:
PHP код:
<?php function parents($up=0, $left=0) { //Строим иерархическое дерево комментариев global $tag,$mess_url; for ($i=0; $i<=count($tag[$up])-1; $i++) { //Можно выделять цветом указанные логины if ($tag[$up][$i][2]=='Admin') $tag[$up][$i][2]='<font color="#C00">Admin</font>'; if ($tag[$up][$i][6]==0) $tag[$up][$i][6]=$tag[$up][$i][0]; //Высчитываем рейтинг комментария $sum=$tag[$up][$i][4]-$tag[$up][$i][5]; if ($up==0) echo '<div style="padding:5px 0 0 0;">'; else { if (count($tag[$up])-1!=$i) echo '<div class="strelka" style="padding:5px 0 0 '.($left-2).'px;">'; else echo '<div class="strelka_2" style="padding:5px 0 0 '.$left.'px;">'; } echo '<div class="comm_head" id="m'.$tag[$up][$i][0].'">'; echo '<div style="float:left;"><b>'.$tag[$up][$i][2].'</b></div>'; echo '<div class="comm_minus"></div>'; echo '<div style="float:right; width:30px;" id="rating_comm'.$tag[$up][$i][0].'">'; echo '<b>'.$sum.'</b></div><div class="comm_plus"></div>'; echo '<a style="float:right; width:70px;" href="'.$mess_url.'#m'; echo $tag[$up][$i][0].'"># '.$tag[$up][$i][0].'</a>'; echo '<div style="float:right; width:170px;">'; echo '('.date("H:i:s d.m.Y", $tag[$up][$i][3]).' г.)</div>'; echo '<div style="clear:both;"></div></div>'; echo '<div class="comm_body">'; if ($sum<0) echo '<u class="sp_link">Показать/скрыть</u><div class="comm_text">'; else echo '<div style="word-wrap:break-word;">'; echo str_replace("<br />","<br>",nl2br($tag[$up][$i][1])).'</div>'; echo '<div class="open_hint" onClick="comm_on('.$tag[$up][$i][0].', '.$tag[$up][$i][6].')">Ответить</div><div style="clear:both;"></div></div>'; if (isset($tag[ $tag[$up][$i][0] ])) parents($tag[$up][$i][0],20); echo '</div>'; } } $res=mysqli_query($db,"SELECT * FROM comment WHERE theme_id='".$theme_id."' and moderation=1 ORDER BY id"); $number=mysqli_num_rows($res); if ($number>0) { echo '<div style="border:1px solid #000000;padding:5px;text-align:center;">'; echo '<b>Последние комментарии:</b><br>'; while ($com=mysqli_fetch_assoc($res)) $tag[(int)$com["parent_id"]][] = array((int)$com["id"], $com["message"], $com["login"], $com["date"], $com["plus"], $com["minus"], $com["first_parent"]); echo parents().'</div><br>'; } ?>
Если Вы не планируете модерацию оставленных комментариев (чего бы мы Вам не советовали), то просто удалите and moderation=1 из последнего SQL запроса выше приведенного кода. Таким образом, все оставленные посетителями комментарии будут незамедлительно опубликованы.
Если Вы все-таки решили оставить модерацию комментариев, то Вам необходимо перейти в тему модерация комментариев на сайте, в которой приведен PHP код, который позволит Вам быстро изменять, удалять и публиковать оставленные посетителями комментарии.
Теперь Вам необходимо добавить форму для того чтобы посетители сайта могли оставлять комментарии. Для этого Вам понадобится добавить на сайт следующий PHP код:
PHP код:
<?php $cod=rand(100,900); $cod2=rand(1,99); echo '<div id="last" align="center">'; echo '<form method="POST" action="'.$mess_url.'#last" class="add_comment"'; echo 'name="add_comment" id="hint"><div class="close_hint">Закрыть</div>'; echo '<textarea cols="68" rows="5" name="user_text"></textarea>'; echo '<div style="margin:5px; float:left;">'; echo 'Имя: <input type="text" name="mess_login" maxlength="20" value=""></div>'; echo '<div style="margin:5px; float:right;">'.$cod.' + '.$cod2.' = '; echo '<input type="hidden" name="prov_summa" value="'.md5($cod+$cod2).'">'; echo '<input type="hidden" name="parent_id" value="0">'; echo '<input type="hidden" name="f_parent" value="0">'; echo '<input type="text" name="contr_cod" maxlength="4" size="4"> '; echo '<input type="submit" value="Отправить"></div>'; echo '</form>'; echo '<form method="POST" action="'.$mess_url.'#last" class="add_comment">'; echo 'Добавить комментарий:'; echo '<textarea cols="68" rows="5" name="user_text"></textarea>'; echo '<div style="margin:5px; float:left;">'; echo 'Имя: <input type="text" name="mess_login" maxlength="20" value=""></div>'; echo '<div style="margin:5px; float:right;">'.$cod.' + '.$cod2.' = '; echo '<input type="hidden" name="prov_summa" value="'.md5($cod+$cod2).'">'; echo '<input type="text" name="contr_cod" maxlength="4" size="4"> '; echo '<input type="submit" value="Отправить"></div>'; echo '</form></div>'; ?>
Как Вы могли заметить, мы используем две практически одинаковые формы для отправки комментариев. Не стоит пугаться, т.к. одна форма постоянно видна, и предназначена для обычного добавления комментариев, в то время как вторая форма скрыта и появляется только при клике по кнопке "Ответить" и предназначена для ответов на уже имеющиеся комментарии.
Для того чтобы добавить плавности при появлении и исчезновении формы ответа на уже существующие комментарии, а так же для оценивания комментариев без перезагрузки странички, Вам потребуется подключить библиотеку jQuery. Делается это так:
JavaScript код:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"> </script>
Библиотека jQuery требуется для работы JavaScript кода, который и отвечает за все выше перечисленные функции. Оговоренный JavaScript код необходимо добавить на Ваш сайт, желательно где-нибудь в конце странички после приведенных PHP кодов и подключения библиотеки jQuery.
JavaScript код:
<script type="text/javascript"> //Добавление в форму отправки комментария значений id родительских комментариев function comm_on(p_id,first_p){ document.add_comment.parent_id.value=p_id; document.add_comment.f_parent.value=first_p; } $(document).ready(function(){ //Показать скрытое под спойлером сообщение $(".sp_link").click(function(){ $(this).parent().children(".comm_text").toggle("normal"); }); //Показать форму ответа на имеющийся комментарий $(".open_hint").click(function(){ $("#hint").animate({ top: $(this).offset().top + 25, left: $(document).width()/2 - $("#hint").width()/2 }, 400).fadeIn(800); }); //Скрыть форму ответа на имеющийся комментарий $(".close_hint").click(function(){ $("#hint").fadeOut(1200); }); //Получение id оцененного комментария $(".comm_plus,.comm_minus").click(function(){ id_comm=$(this).parents(".comm_head").attr("id").substr(1); }); //Отправление оценки комментария в файл rating_comm.php $(".comm_plus").click(function(){ jQuery.post("rating_comm.php",{comm_id:id_comm,ocenka:1},rating_comm); }); $(".comm_minus").click(function(){ jQuery.post("rating_comm.php",{comm_id:id_comm,ocenka:0},rating_comm); }); //Возврат рейтинга комментария и его обновление function rating_comm(data){ $("#rating_comm"+id_comm).fadeOut(800,function(){ $(this).html(data).fadeIn(800); }); } }); </script>
Теперь Вам остается только добавить на свой сайт файл rating_comm.php, на который мы запросом jQuery.post() отсылаем оценки, поставленные комментариям. Файл rating_comm.php будет получать и обрабатывать поставленные (отправленные) оценки комментариям и высчитывать рейтинг комментариев. Файл rating_comm.php включает в себя следующий PHP код:
PHP код:
<?php if (isset($_POST["comm_id"]) and is_numeric($_POST["comm_id"])) $obj=$_POST["comm_id"]; else $obj=''; if (isset($_POST["ocenka"]) and ($_POST["ocenka"]==0 or $_POST["ocenka"]==1)) $ocenka=$_POST["ocenka"]; else $ocenka=''; if ($ocenka!='' and $obj>0) { $ip=$_SERVER['REMOTE_ADDR']; $db=mysqli_connect("localhost","Ваш_логин","Ваш_пароль","Имя_базы") or die(); $res=mysqli_query($db,"SELECT count(id),ocenka FROM ocenka_comment WHERE comment_id='".$obj."' and ip=INET_ATON('".$ip."')"); $number=mysqli_fetch_array($res); if ($number[0]==0) { $res=mysqli_query($db,"INSERT INTO ocenka_comment (date,comment_id,ip,ocenka) values ('".time()."','".$obj."',INET_ATON('".$ip."'),'".$ocenka."')"); if ($ocenka==0) $res=mysqli_query($db,"UPDATE comment SET minus=(minus+1) WHERE id='".$obj."' LIMIT 1"); else $res=mysqli_query($db,"UPDATE comment SET plus=(plus+1) WHERE id='".$obj."' LIMIT 1"); } elseif ($number["ocenka"]!=$ocenka) { $res=mysqli_query($db,"UPDATE ocenka_comment SET date='".time()."', ocenka='".$ocenka."' WHERE comment_id='".$obj."' and ip=INET_ATON('".$ip."')"); if ($ocenka==0) $res=mysqli_query($db,"UPDATE comment SET minus=(minus+1), plus=(plus-1) WHERE id='".$obj."' LIMIT 1"); else $res=mysqli_query($db,"UPDATE comment SET plus=(plus+1), minus=(minus-1) WHERE id='".$obj."' LIMIT 1"); } $res=mysqli_query($db,"SELECT plus,minus FROM comment WHERE id='".$obj."' LIMIT 1"); $rating=mysqli_fetch_array($res); echo '<b>'.( $rating["plus"]-$rating["minus"]).'</b>'; mysqli_close($db); } ?>
Данный скрипт позволяет оставлять только одну оценку к одному комментарию. Для того чтобы через некоторое время было возможно повторно оценить комментарий, необходимо удалять старые оценки из таблицы ocenka_comment. Для этого используйте следующий PHP код, который удаляет все оценки старше 30 дней
PHP код:
<?php $del_date=$time-2592000; //время в секундах (2592000 сек. = 30 дней) $res=mysqli_query($db,"DELETE FROM ocenka_comment WHERE date<".$del_date.""); ?>
После создания в MySQL указанных таблиц и добавления на свой сайт всех выше приведенных PHP и JavaScript кодов, у Вас должна получиться полноценная форма для оставления комментариев к темам сайта.