Форма добавления комментариев к темам
Для развития своего сайта, рано или поздно Вам понадобится форма добавления комментариев к темам. Данная форма необходима как для обратной связи с администрацией, так и для обсуждения и оставления предложений по улучшению обсуждаемой темы.
Мы предлагаем Вам удобную форму добавления комментариев, позволяющую модерировать комментарии администрацией и оценивать пользователям каждый комментарий в отдельности. Для того чтобы добавить на свой сайт предлагаемую нами форму добавления комментариев к темам, необходимо убедиться, что Ваш хостинг поддерживает MySQL.
Для того чтобы понять о какой форме добавления комментариев к темам идет речь, прокрутите данную страничку до самого низа и там Вы увидите нашу форму добавления комментариев к темам.
Для начала в MySQL необходимо будет создать две таблицы: comment и ocenka_comment.
В таблице comment мы будем хранить тексты комментариев и информацию о них (дату и время оставления комментария, имя автора, тему, к которой оставлен комментарий).
При необходимости можно добавить дополнительные поля (например, для модерации).
В таблице ocenka_comment мы будем хранить дату и время оценки комментария, идентификатор комментария, IP адреса с которого был оценен комментарий и саму оценку.
Структура данных таблиц приведена на рисунках ниже:
Таблица comment.
Таблица ocenka_comment.
В обеих таблицах в поле id напротив AUTO_INCREMENT должна стоять галочка! При необходимости данные таблицы могут быть расширены для хранения дополнительной информации.
После того, как таблицы в MySQL были созданы, в самое начало Ваших страничек (выше тега <head>) поместите PHP код обработки отправленных сообщений:
<?php
session_start();
$link = mysql_connect("localhost", "Ваш_логин", "Ваш_пароль") or
die("Could not connect: " . mysql_error());
mysql_select_db("Имя_базы", $link);
$_SESSION[full_url]=mysql_real_escape_string(basename($_SERVER['REQUEST_URI']));
$_SESSION[mess_url]=strtok($_SESSION[full_url], '?');
if (isset($_POST[contr_cod])) {
$_SESSION[comment_mess_login]=$_POST[mess_login];
$_SESSION[comment_user_text]=$_POST[user_text];
if (get_magic_quotes_gpc()=="0") {
$_SESSION[comment_mess_login]=
mysql_real_escape_string($_SESSION[comment_mess_login]);
$_SESSION[comment_user_text]=
mysql_real_escape_string($_SESSION[comment_user_text]);
}
$_SESSION[comment_mess_login]=htmlspecialchars($_POST[mess_login]);
$_SESSION[comment_user_text]=htmlspecialchars($_POST[user_text]);
if (md5($_POST[contr_cod])==$_POST[prov_summa]) {
$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]."')");
$_SESSION[send]='Комментарий принят и ожидает модерации.';
$_SESSION[comment_mess_login]='';
$_SESSION[comment_user_text]='';
header("Location: $_SESSION[mess_url]#last");
exit;
}
else {
$_SESSION[send] = "Неверный проверочный код!";
header("Location: $_SESSION[mess_url]#last");
exit;
}
}
?>
Данный код осуществляет проверку правильности введения проверочного кода (это необходимо для защиты от ботов), экранирует введенные посетителями сообщения (для защиты от MySQL инъекций) и в случае если код верный, записывает комментарий в базу.
Не забудьте при подключении к Вашей MySQL базе в функции mysql_connect() указать Ваши логин, пароль и имя БД.
После добавления кода проверки правильности введения проверочного кода, в начало Ваших страничек поместите PHP код определения IP адреса посетителя:
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP']))
$ip=$_SERVER['HTTP_CLIENT_IP'];
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else $ip=$_SERVER['REMOTE_ADDR'];
$ip_position=strpos($ip,',');
if ($ip_position>0) $ip_short=substr($ip, 0, $ip_position);
else $ip_short=$ip;
?>
Если у Вас уже имеется переменная, содержащая IP адреса посетителя, то приведенный выше код можно не добавлять. Просто присвойте переменной $ip_short уже имеющийся IP адреса посетителя. Обращаем Ваше внимание на то, что переменная $ip_short должна содаржать только один IP адрес (без прокси через запятую).
Далее в том месте странички, где должны выводиться комментарии, добавляем следующий код:
<?php
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."'"); }
}
$result = mysql_query("SELECT * FROM comment
WHERE theme='".$_SESSION[mess_url]."' and moderation=1 ORDER BY id", $link);
$number = mysql_num_rows($result);
if ($number>0) {
echo '<hr><div align="center" style="padding:3px; border-radius:5px;">
<u><b>Последние комментарии посетителей:</b></u><br>';
for ($n=1; $n<=$number; $n++) {
$comments=mysql_fetch_array($result);
$result_minus = mysql_query("SELECT sum(ocenka=1), sum(ocenka=0) FROM ocenka_comment
WHERE comment_id='".$comments[id]."' LIMIT 1", $link);
$ocenka_com=mysql_fetch_array($result_minus);
echo '<br><table border="0" width="100%" style="border: 1px solid #4874a3;"><tr>';
echo '<td align="left">';
echo '<div id="m'.$comments[id].'"></div><b>'.$comments[login].'</b></td>';
echo '<td width="140">';
echo '<span style="font-size:12px;">('.$comments[date].')</span></td>';
echo '<td width="20">';
echo '<form method="POST" action="'.$_SESSION[mess_url].'#m'.$comments[id].'">';
echo '<input type="hidden" name="comment_id" value="'.$comments[id].'">';
echo '<input type="hidden" name="ocenka" value="1">';
echo '<input type="image" src="image/up.png" title="Хороший комментарий">';
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[mess_url].'#m'.$comments[id].'">';
echo '<input type="hidden" name="comment_id" value="'.$comments[id].'">';
echo '<input type="hidden" name="ocenka" value="0">';
echo '<input type="image" src="image/down.png" title="Плохой комментарий">';
echo '</form></td></tr></table>';
echo '<table border="0" width="100%" style="border: 1px solid #eeeeee;"
bgcolor="#eeeeee">';
echo '<tr><td colspan="5" align="justify">';
echo wordwrap(nl2br($comments[message]), 70, "\n", 1);
echo '</td></tr></table>';
}
echo '</div><br>';
}
else echo '<hr>';
?>
Данный код отвечает за вывод комментариев к соответствующей теме и за оценки комментариев посетителями.
Допускается только одна оценка для одного комментария с одного IP адреса. При повторной попытке выставлении оценки с IP адреса, который уже оценивал данный комментарий, происходит проверка на совпадение с предыдущей оценкой. Если текущая оценка совпадает с предыдущей оценкой, то ничего не произойдет. Если оценка отличается от выставленной ранее с этого же IP адреса, прошлая оценка будет аннулирована и заменена на новую.
Если модерация комментариев администрацией Вам не нужна, и Вы планируете публиковать все комментарии, то просто удалите and moderation=1 из выше приведенного кода. Но мы бы не рекомендовали показывать неотмодерированные комментарии, т.к. вероятнее всего произойдет захламление сайта СПАМ-ссылками. Если Вы решили модерировать комментарии то, для того чтобы разрешить вывод отмодерированных комментариев, необходимо изменить значение moderation в таблице comment с 0 на 1.
Более подробно о том, как следует модерировать оставленные посетителями комментарии можно посмотреть в теме Форма модерации комментариев к темам.
Далее необходимо создать саму форму для отправки комментариев и добавить ее на сайт. Делается это следующим образом:
<?php
echo '<div id="last" align="center">';
echo '<form method="POST" action="'.$_SESSION[mess_url].'#last">';
echo '<table border="0" style="border: 1px solid #4874a3;
border-radius:8px;" bgcolor="#7799ee" cellspacing="4" align="center">';
echo '<tr><td colspan="2" align="center">';
echo '<b>Добавить комментарий к теме:</b><br>';
$prov_cod=rand(1000,9980); $prov_cod_2=rand(1,19);
echo '<textarea cols="65" rows="5" name="user_text" required>'
.$_SESSION[comment_user_text].'</textarea><br>';
echo '</td></tr><tr><td width="300">';
echo '<b>Ваше имя: </b><input type="text" name="mess_login" maxlength="20"
value="'.$_SESSION[comment_mess_login].'" required>';
echo '</td><td align="right">';
echo '<b>'.$prov_cod.' + '.$prov_cod_2.' = </b>';
echo '<input type="hidden" name="prov_summa" value="'.md5($prov_cod+$prov_cod_2).'">';
echo '<input type="text" name="contr_cod" maxlength="4" size="4" required>';
echo '<input type="submit" value="Отправить"></td></tr></table></form>';
$_SESSION[comment_mess_login]='';
$_SESSION[comment_user_text]='';
if (isset($_SESSION[send])and($_SESSION[send]!="")) {
echo '<font color="red"><b>'.$_SESSION[send].'</b></font>';
$_SESSION[send]="";
}
echo '</div>';
?>
Данная форма отправки комментариев содержит специальное поле для защиты от ботов.
Обращаем Ваше внимание на то, что в выше приведенных кодах некоторые строчки кода были разорваны и перенесены из-за своей длинны. Данные строчки следует писать в одну строку.
После добавления на свой сайт всех выше приведенных PHP кодов у Вас должна получиться точно такая же форма для оставления комментариев к темам.
P.S. Данная тема была обновлена и доработана. Подробнее с новой темой можно ознакомиться по ссылке Добавление комментариев на сайт.
Перед публикацией все комментарии проходят обязательную модерацию!
Если Вы хотите задать какой-либо вопрос, то сделайте это на нашем форуме.
Таким образом, Вы сможете быстрее получить ответ на интересующий Вас вопрос.
Ссылка - http://usefulscript.ru/forum/showthread.php?tid=122
$result = mysql_query("SELECT * FROM comment WHERE message LIKE '%".$search_text."%'", $link);
где $search_text - искомый текст.
Дальнейшее обсуждение данного вопроса перенес на форум - Поиск на сайте по комментариям из БД
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/u391369400/public_html/index3.html:3) in /home/u391369400/public_html/index3.html on line 4
Как это исправить?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<?php
session_start();
...
Все равно те же ошибки.
<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
Тот код высвечивался в просмотре с компьютера, а когда закачал на хостинг вышло вот это:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by . . .
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent . . .
Warning: mysql_connect() [function.mysql-connect]: Access denied for user . . .
Could not connect: Access denied for user '. . .'@'localhost' (using password: YES)
P.S. Последняя ошибка означает, что Вы неправильно подключаетесь к MySQL. Проверьте, правильно ли Вы указали название базы данных, логин и пароль.
Для MySQL - $result = mysql_query("set names utf8", $link);
Для сайта - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Далее перед тем как добавлять комментарий в базу, делаем простой SELECT (SELECT date FROM comment WHERE ip='".$_SERVER['REMOTE_ADDR']."' ORDER BY id DESC) и получаем последнюю дату с данным IP адресом. Далее высчитываем разницу между текущим и полученным временем в секундах: time()-strtotime("полученное из базы время"). В зависимости от того превышен интервал или нет, решаем добавлять комментарий в базу или нет.
Подробнее на нашем форуме по ссылке.
Поделитесь, пожалуйста, как Вы оформляете коды скриптов в текстах Ваших статей. Спасибо.
вставить строку mysql_set_charset('utf8');
По поводу кнопки "Ответить" - на форуме в теме Построение дерева комментариев уже рассматривали, как это делается.
P.S. Добавление комментариев на сайт.
Так в форме вывода коммент. выводится:
Notice: Use of undefined constant comment_id - assumed 'comment_id' in /home/httpd/vhosts/домен.ru/httpdocs/akvapark_akvapolis.html on line 321
Notice: Undefined index: comment_id in /home/httpd/vhosts/домен.ru/httpdocs/akvapark_akvapolis.html on line 321
1) Убираем функцию error_reporting(); если таковая имеется, либо выключаем протоколирование ошибок - error_reporting(0); (устанавливаем уровень сообщения об ошибках PHP).
2) Все имена переменных в квадратных скобках берем в двойные кавычки ($_POST['comment_id']).
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/httpd/vhosts/домен/httpdocs/akvapark_akvapolis.html on line 27
Вот сама строчка 27: header("Location: $_SESSION['mess_url']#last");
А логин, хост и пароль должны быть в кавычках?
Для начала удалите из строки header("Location: $_SESSION['mess_url']#last"); одинарные кавычки.
Да. И имя базы тоже должно быть в кавычках.
Дальнейшее общение по поводу Вашей проблемы перенес на форум в тему Проблема с формой добавления комментариев.
P.S. Вы можете продолжать писать в комментариях, при необходимости я их перенесу на форум.
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\p\www\pg.php on line 97
Помогите разобраться.
Дальнейшее обсуждение Вашей проблемы перенес на наш форум в одну из тем.
Костя, Вы можете отвечать здесь, но комментарии будут перенесены на форум.
Не правильно записывается страница в theme. Записывается просто post.php вместо post.php?id=№страницы.
Как это подправить?
$_SESSION[full_url]=mysql_real_escape_string(basename($_SERVER['REQUEST_URI']));
$_SESSION[mess_url]=strtok($_SESSION[full_url], '?');
использовать $_SESSION[mess_url]=mysql_real_escape_string(basename($_SERVER['REQUEST_URI']));
Parse error: syntax error, unexpected T_STRING in .../comment/index.php on line 41 ???
P.S. Название домена из текста ошибки удалил, на форуме Ваш аккаунт активировал.
37\ $number = mysql_num_rows($result);
-----------------------------------------------------------------------
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in... on line 36
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in... on line 37
Форма есть, но общаться с mysql не хочет.
$link = mysql_connect("localhost", "Ваш_логин", "Ваш_пароль");
mysql_select_db("Имя_базы", $link);
Дальнейшее обсуждение перенес на форум - http://usefulscript.ru/forum/showthread.php?tid=297
Ваш текст:
После добавления кода проверки правильности введения проверочного кода, в начало Ваших страничек поместите PHP код определения IP адреса посетителя.
В начало страницы, точнее можно, куда именно?
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\mysite\mysite.php:3) in Z:\home\localhost\www\mysite\mysite.php on line 29
В строчке, в которой ошибка у меня: header("Location: $_SESSION[mess_url]#last");
добавьте функцию PHP - mail("Ваш почтовый ящик", "Заголовок сообщения", "Текст сообщения");
Если кликнуть по ссылке - "Хорошее сообщение" или "Плохое сообщение", появляется ошибка:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\WebServers\home\site.ru\www\php\comment_db.php on line 4,
где строчка 4: $number = mysql_fetch_array($result);
На странице имеется эта ошибка и 1 появляется, но если обновлять вручную, она продолжает добавляться автоматически, например я обновил страницу 5 раз и появилась цифра 5, как будто я кликнул 5 раз по ссылке "Хорошее сообщение". Если уйти со страницы и зайти снова, ошибка исчезает, но цифра 5 остается и если кликнуть ссылке снова все повторится, как описано выше. В базу данных заносится все.
Просьба разъяснить, где кроется ошибка.
Заранее благодарен за ответ.
Посмотрите, что у Вас в переменных $_POST[comment_id]) и $ip_short. Могу предположить, что отсутствует $ip_short.
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in Z:\home\recscompany\html\games\gamespage\game1.php on line 503
Статья отличная!
P.s. Какая именно строка в этом коде отвечает за запись id пользователя в бд?
Например: (записывает сейчас): index.php
А надо так: www.sait/stranica/index.php