Gud°форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Gud°форум » PHP ★ MySQL » Добавление комментариев на сайт


Добавление комментариев на сайт

Сообщений 1 страница 3 из 3

1

В данной теме мы хотим предложить Вам скрипт для создания на своем сайте формы для добавления комментариев к темам сайта. Данная форма нужна для того, чтобы посетители Вашего сайта могли оставлять отзывы и пожелания к темам сайта, а так же задавать вопросы и получать на них ответы от администрации и других посетителей сайта.

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

Для полноценной работы скрипта, приведенного в данной теме, Вам понадобиться в MySQL создать две таблицы: comment и ocenka_comment.

В таблице comment будут храниться комментарии посетителей и вся необходимая информацию о данных комментариях. В таблице ocenka_comment будут храниться последние оценки к комментариям, поставленные посетителями. Структура данных таблиц приведена на рисунках ниже:
http://sh.uploads.ru/t/7wyiW.png

Для быстрого создания таблиц 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">&nbsp;';
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">&nbsp;';
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 кодов, у Вас должна получиться полноценная форма для оставления комментариев к темам сайта.

0

2

Нифига непонятно :crazy:

0

3

Татьяна
Что именно тебе непонятно? :dontknow:

0


Вы здесь » Gud°форум » PHP ★ MySQL » Добавление комментариев на сайт


создать форум