Комментарии к новостям php

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

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

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

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

В таблице 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 были уже созданы, в начало Ваших страничек, на которых будет присутствовать форма добавления комментариев (выше тега ) поместите следующий 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;
>
>

Не забудьте при подключении к Вашей MySQL базе в функции mysqli_connect() указать Ваши логин, пароль и имя БД.

Хотим обратить Ваше внимание на еще один важный момент — получение id идентификатора текущей темы. Т.к. нам неизвестно, какая структура БД у Вас на сайте, то Вам этот момент придется доделать самим, а именно получить id темы и поместить его в переменную $theme_id. В коде id мы получаем запросом после комментария «//получаем id текущей темы».

Далее, для нормального отображения комментариев и формы добавления комментариев к темам сайта нам понадобятся CSS стили. Для этого добавьте себе следующий CSS код:

Теперь, после того, как БД создана, и стили прописаны, можно приступать к коду, отвечающему за вывод и добавление комментариев.

В том месте странички, где должны выводиться оставленные посетителями комментарии, добавляем следующий PHP код:

for ( $i = 0 ; $i //Можно выделять цветом указанные логины
if ( $tag [ $up ][ $i ][ 2 ]== ‘Admin’ ) $tag [ $up ][ $i ][ 2 ]= ‘Admin‘ ;
if ( $tag [ $up ][ $i ][ 6 ]== 0 ) $tag [ $up ][ $i ][ 6 ]= $tag [ $up ][ $i ][ 0 ];
//Высчитываем рейтинг комментария
$sum = $tag [ $up ][ $i ][ 4 ]- $tag [ $up ][ $i ][ 5 ];

if (isset( $tag [ $tag [ $up ][ $i ][ 0 ] ])) parents ( $tag [ $up ][ $i ][ 0 ], 20 );
echo ‘

‘ ;
>
>

$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 ‘

‘ ;
echo ‘Последние комментарии:
‘ ;
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 (). ‘

‘ ;
>
?>

Если Вы не планируете модерацию оставленных комментариев (чего бы мы Вам не советовали), то просто удалите and moderation=1 из последнего SQL запроса выше приведенного кода. Таким образом, все оставленные посетителями комментарии будут незамедлительно опубликованы.

Если Вы все-таки решили оставить модерацию комментариев, то Вам необходимо перейти в тему модерация комментариев на сайте, в которой приведен PHP код, который позволит Вам быстро изменять, удалять и публиковать оставленные посетителями комментарии.

Теперь Вам необходимо добавить форму для того чтобы посетители сайта могли оставлять комментарии. Для этого Вам понадобится добавить на сайт следующий PHP код:

Как Вы могли заметить, мы используем две практически одинаковые формы для отправки комментариев. Не стоит пугаться, т.к. одна форма постоянно видна, и предназначена для обычного добавления комментариев, в то время как вторая форма скрыта и появляется только при клике по кнопке «Ответить» и предназначена для ответов на уже имеющиеся комментарии.

Для добавления плавности при появлении и исчезновении формы ответа на уже существующие комментарии, а также для оценивания комментариев без перезагрузки странички, Вам потребуется подключить библиотеку jQuery. Делается это так:

Библиотека jQuery требуется для работы JavaScript кода, который и отвечает за все выше перечисленные функции. Оговоренный JavaScript код необходимо добавить на Ваш сайт, желательно где-нибудь в конце странички после приведенных PHP кодов и подключения библиотеки jQuery.

< 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 );
>);
>
>);

Теперь Вам остается только добавить на свой сайт файл rating_comm.php, на который мы запросом jQuery.post() отсылаем оценки, поставленные комментариям. Файл rating_comm.php будет получать и обрабатывать поставленные (отправленные) оценки комментариям и высчитывать рейтинг комментариев. Файл rating_comm.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 > . $obj . «‘ LIMIT 1» );
else $res = mysqli_query ( $db , «UPDATE comment SET plus=(plus+1)
WHERE > . $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 > . $obj . «‘ LIMIT 1» );
else $res = mysqli_query ( $db , «UPDATE comment SET plus=(plus+1), minus=(minus-1)
WHERE > . $obj . «‘ LIMIT 1» );
>

$res = mysqli_query ( $db , «SELECT plus,minus FROM comment WHERE > . $obj . «‘ LIMIT 1» );
$rating = mysqli_fetch_array ( $res );
echo ‘‘ .( $rating [ «plus» ]- $rating [ «minus» ]). ‘‘ ;
mysqli_close ( $db );
>
?>

Данный скрипт позволяет оставлять только одну оценку к одному комментарию. Для того чтобы через некоторое время было возможно повторно оценить комментарий, необходимо удалять старые оценки из таблицы ocenka_comment. Для этого используйте следующий PHP код, который удаляет все оценки старше 30 дней:

$del_date = $time — 2592000 ; //время в секундах (2592000 сек. = 30 дней)
$res = mysqli_query ( $db , «DELETE FROM ocenka_comment WHERE date ?>

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

Источник

Читайте также:  font-weight
Оцените статью