|
|
|
| добрый день!
Прошу подсказать как реализовать для этого кода возможность модерации сообщений и поставить проверку от спама.
<h1>Оставить свой комментарий:</h1>
<div id='cerror'></div>
<div align="center"><form action="#" method="POST" enctype="multipart/form-data" name="addcom" id="addcom" onSubmit="return false">
Ваше имя:<br>
<input name="author" type="text" size="30" class="pole" id="author"><br><br>
Текст комментария:<br>
<textarea name="text" rows="5" cols="50" class="text"></textarea><br>
<br>
<input name="id" type="hidden" value="<?php echo $id; ?>">
<input class="adscom" name="button" type="button" value='Добавить комментарий' onclick="doLoad(document.getElementById('addcom'))">
</form>
</div>
|
<?
// Запрет на кэширование
header("Expires: Mon, 23 May 1995 02:00:00 GTM");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GTM");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
//****
$log =="";
$error="no"; //флаг наличия ошибки
require_once 'JsHttpRequest.php';
$JsHttpRequest =& new JsHttpRequest("windows-1251");
//Короткие имена переменных и обрезка пробелов img_title
$text = trim($_POST['text']);
$author = trim($_POST['author']);
$id = trim($_POST['id']);
//Проверка email адреса
if($author == ''){
$log .= "Пожалуйста, введите Ваше имя<br>";
$error = "yes";
}
//Проверка наличия введенного текста комментария
if (empty($text)){
$log .= "Необходимо указать текст сообщения!<br>";
$error = "yes";
}
else{
//Должнен быть хоть один символ на русском языке
$spam=1;
for($i=0;$i<strlen($text);$i++){
if((ord($text[$i])>=192) && (ord($text[$i])<=255)){$spam=0;break;}
}
if ($spam == 1) {
$log .= "Ваше сообщение не содержит ни одной русской буквы.<br>";
$error = "yes";
}
}
//Проверка длины текста комментария
if(strlen($text)>1000){
$log .= "Слишком длинный текст, в вашем распоряжении 1000 символов!<br>";
$error = "yes";
}
//Проверка на наличие длинных слов
$mas = preg_split("/[\s]+/",$text);
foreach($mas as $index => $val){
if (strlen($val)>40) {
$log .= "Слишком длинные слова (более 40 символов) в тексте записи!<br>";
$error = "yes";
break;
}
}
//Экранирование и преобразование опасных символов
if (!get_magic_quotes_gpc()){
$text = addslashes($text);
$author = addslashes($author);
$cod = addslashes($cod);
}
$text = htmlspecialchars($text);
$author = htmlspecialchars($author);
$cod = htmlspecialchars($cod);
//Если нет ошибок добавляем в базу
if($error=="no"){
$date = date("d-m-Y в H:i");
$result2 = mysql_query("INSERT INTO com (post,author,text,date) VALUES ('" . mysql_real_escape_string($id) . "','" . mysql_real_escape_string($author) . "','" . mysql_real_escape_string($text) . "','$date')");
//****
$id_pu = $_REQUEST['id'];
$address = "my@mail.ru";
$subject = "Новый комментарий на сайте";
$post_title = $myrow3["title"];
$message = "Появился комментарий к заметке - ".$post_title."<br>Комментарий добавил(а): ".$author."<br>Текст комментария:
".$text."<br>Ссылка на заметку:<a href='www.site.ru/view.php?id=".$_REQUEST['id']."'>this is link</a>";
$headers = 'Content-Type: text/html;charset=windows-1251';
mail($address,$subject,$message,$headers);
$ok="<div><strong>".$author."</strong><br>Добавлено: ".$date."<br>".$text."</div>";
//Помещаем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'no',
'ok' => $ok
);
}
else {//если ошибки есть
$log = "<div><strong><font color='red'> Ошибка! </font></strong><br>".$log."</div>";
//Отправляем результат в массив
$GLOBALS['_RESULT'] = array(
'error' => 'yes',
'er_mess' => $log);
}
?>
|
| |
|
|
|
|
|
|
|
для: usa
(10.12.2011 в 20:32)
| | Для модерации создаешь еще одно поле в таблице с комментарии, на пример moderator и потом в запросе mysql_query, когда выводишь все комментарии, указываешь WHERE moderator=1
mysql_query("SELECT * FROM comments WHERE moderator=1").
Сделай так, чтоб при вставке инфы в таблицу, поле moderator не заполнялось. Потом просто вручную изменяешь это поле(вместо пустоты ставишь 1) и комментарий автоматом на сайте появляется.
А от спама я так полагаю капча подойдет. Знал бы как она делается, помог :) Самое простое - это в форме сделать простой пример, ответ которого лежит в базе(в отдельной табличке) и потом сравнить значение из базы с тем, что ввел пользователь.
Например, в форме есть картинка, на ней нарисовано "198756", в базе этот ответ уже есть. Если человек введет эти цифры и сравнение будет истиной, то все ок. | |
|
|
|
|
|
|
|
для: ladan
(11.12.2011 в 01:42)
| | Сделай так, чтоб при вставке инфы в таблицу, поле moderator не заполнялось. Потом просто вручную изменяешь это поле(вместо пустоты ставишь 1) и комментарий автоматом на сайте появляется.
Поле moderator - varchar или int?
Что ставить по умолчанию - null или неопределенно?
И как узнать что появился коммент? | |
|
|
|
|
|
|
|
для: usa
(11.12.2011 в 04:48)
| | Поставивь varchar, а длину значения 255(но неменьше 1) и сохрани это поле
Как узнать? Легко :) Заходишь в табличку с комментариями и смотришь на записи, и если в какой-то записи поле moderator равно пустоте, то значит кто-то добавил коммент + можно ориентироваться по дате добавления.
А еще после того как коммент добавился в базу, можно в том же обработчик прописать функцию mail, чтоб письма тебе приходили
$mail = admin@site.ru;
$subject = 'Новый комментарий на сайте mysite.ru';
$message = "Автор: $author \n Дата добавления: \n $date \n Сообщение: $text \n Ссылка на заметку:<a href='www.site.ru/view.php?id=$id'>this is link</a>";
$headers .= 'From: mysite.ru <admin@site.ru>' . "\r\n"."content-type:text/plain; charset=utf-8\r\n";
mail($mail, $subject, $message, $headers); | |
|
|
|
|
|
|
|
для: ladan
(11.12.2011 в 11:56)
| | спасибо. очень доходчиво. получается.
Только сообщение на почту о появлении нового коммента я получаю только тогда когда значение moderatora = 1.
Т.е. кто-то добавляет коммент, значение moderatora - пустое, оно соотственно не появляется на сайте и я не получаю уведомление по почте. | |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 09:14)
| | ну так сделайте отправку писем когда вам нужно | |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 09:14)
| | вот в кратце как должно быть:
1. выводятся все комменты со значением moderator=1
2. ниже выводится формочка с добавлением нового.
3. после добавления, идет запись в базу и отправляется письмо админу
<?
$a = mysql_query("SELECT * FROM comments WHERE moderator=1"); /*вытаскиваются все комменты с полем moderator=1*/
if(mysql_num_rows($a) < 1) {exit("<p>Комментариев пока никто не оставил</p>");} /*когда в базе нет комментов с полем moderator=1*/
$b = mysql_fetch_array($a); /*формируем массив*/
do
{
printf("<div>%s<br>%s<br>%s</div><br>", $b['author'], $b['date'], $b['text'] );
}
while($b = mysql_fetch_array($a));/*выводим все комментарии в цикле, удовлетворяющие запросу*/
?>
<form action="comments.php" method="post">
Ваше имя: <input type="text" name="author">
Текст: <textarea name='text' cols='45' rows='5'></textarea>
<input type='submit' value='Отправить'>
</form>
|
теперь код обработчика(comments.php)
<?
/*Небольшая проверка*/
if(empty($_POST['author']) or empty($_POST['text'])) {exit("<p>Заполните все необходимые поля!</p>");}
$date = date("Y-m-d");
/*Добавляем комментарий*/
$b = mysql_query("INSERT INTO comments (author,text, date) VALUES ('$_POST['author']')','$_POST['text']')','$date',");
if($b) {echo "<p>Ваш комментарий успешно добавился в базу и отправлен на модерацию администратору!</p>";}
else {exit("<p>По каким-то причинам комментарий не смог добавиться, попробуйте позже!</p>");}
/*Отправляем письмо админу*/
$mail = "admin@site.ru";
$subject = "Новый комментарий на сайте";
$text = "Пишет: $_POST['author'] \n Текст: $_POST['text']";
$utf = "content-type:text/plain; charset=utf-8\r\n";
mail($mail,$subject,$text,$utf);
?>
|
Все! Теперь чтоб комментарий показывался на сайте, нужно зайти в базу, найти комментарий с полем moderator = "" и испавить на moderator = "1". А письмо прийдет только тогда, когда произойдет запись в таблицу | |
|
|
|
|
|
|
|
для: ladan
(12.12.2011 в 10:59)
| | Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/klassn/public_html/comment_pu.php on line 8
вот она 8 строка
$b = mysql_query("INSERT INTO comment_pu (author,text, date) VALUES
|
привожу код целиком
<?
/*Небольшая проверка*/
if(empty($_POST['author']) or empty($_POST['text'])) {exit("<p>Заполните все необходимые поля!</p>");}
$date = date("Y-m-d");
/*Добавляем комментарий*/
$b = mysql_query("INSERT INTO comment_pu (author,text, date) VALUES ('$_POST['author']')','$_POST['text']')','$date',");
if($b) {echo "<p>Ваш комментарий успешно добавился в базу и отправлен на модерацию администратору!</p>";}
else {exit("<p>По каким-то причинам комментарий не смог добавиться, попробуйте позже!</p>");}
/*Отправляем письмо админу*/
$mail = "11klass@mail.ru";
$subject = "Новый комментарий на сайте";
$text = "Пишет: $_POST['author'] \n Текст: $_POST['text']";
$utf = "content-type:text/plain; charset=utf-8\r\n";
mail($mail,$subject,$text,$utf);
?>
|
там каждый коммент нужно привязать id_pu
$result = mysql_query("SELECT * FROM comment_pu WHERE moderator=1 and post='" . mysql_real_escape_string($id_pu) . "' ORDER BY id", $db);
|
| |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 15:56)
| | отредактировал код
первая часть
<?
mysql_connect("localhost", "user", "password");
mysql_select_db("anapa");
mysql_query("SET NAMES utf8");
$a = mysql_query("SELECT * FROM coment WHERE moderator=1"); /*вытаскиваются все комменты с полем moderator=1*/
if(@mysql_num_rows($a) < 1) {echo "<p>Комментариев пока никто не оставил</p>";} /*когда в базе нет комментов с полем moderator=1*/
$b = mysql_fetch_array($a); /*формируем массив*/
do
{
printf("<div>%s<br>%s<br>%s</div><br>", $b['author'], $b['date'], $b['text'] );
}
while($b = mysql_fetch_array($a));/*выводим все комментарии в цикле, удовлетворяющие запросу*/
?>
<form action="table2.php" method="post">
Ваше имя: <input type="text" name="author"> <br>
Текст: <textarea name='text' cols='45' rows='5'></textarea> <br>
<input type='submit' value='Отправить'>
</form>
|
вторая часть - обработчик
<?
mysql_connect("localhost", "user", "password");
mysql_select_db("anapa");
mysql_query("SET NAMES utf8");
/*Небольшая проверка*/
if(empty($_POST['author']) or empty($_POST['text'])) {exit("<p>Заполните все необходимые поля!</p>");}
$author = $_POST['author'];
$text = $_POST['text'];
$date = date("Y-m-d");
/*Добавляем комментарий*/
$b = mysql_query("INSERT INTO coment (author,text, date) VALUES('$author','$text','$date')");
if($b) {echo "<p>Ваш комментарий успешно добавился в базу и отправлен на модерацию администратору!</p>";}
else {exit("<p>По каким-то причинам комментарий не смог добавиться, попробуйте позже!</p>");}
/*Отправляем письмо админу*/
$mail = "11klass@mail.ru";
$subject = "Новый комментарий на сайте";
$text = "Пишет: $author \n Текст: $text";
$utf = "content-type:text/plain; charset=utf-8\r\n";
mail($mail,$subject,$text,$utf);
?>
|
заработать должно 100%, если все же не получится, я вам скину по почте исходники
Если вам нужно выводить все комментарии к определенным заметкам:
загружается заметка, вытаскиваем из нее id и передаем в запрос
$a = mysql_query("SELECT * FROM coment WHERE moderator=1 AND zametka='$id'"); /*вытаскиваются все комменты с полем moderator=1 и id нужно заметки*/
В таблице с комментами нужно еще одно поле создать- zametka
передаем скрытому элементу в форме <input type="hidden" name="<? echo $id ?>">
потом как человек жмет "комментировать", в обработчик уже должен быть другой запрос $b = mysql_query("INSERT INTO coment (author,text, date, zametka) VALUES('$author','$text','$date','$id')"); | |
|
|
|
|
|
|
|
для: ladan
(12.12.2011 в 17:09)
| | Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in... on line 218
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /... line 223
218 строчка
$b = mysql_fetch_array($a); /*формируем массив*/
|
223 строчка
while($b = mysql_fetch_array($a));/*выводим все комментарии в цикле, удовлетворяющие запросу*/
|
| |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 18:15)
| | вообще беспонятия как такое может быть :) Скажите вашу почту я отправлю исходники, установите и посмотрите где у вас были ошибки | |
|
|
|
|
|
|
|
для: ladan
(12.12.2011 в 18:38)
| | какие исходники? :)
они уже приведены выше. | |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 18:52)
| | кажется ясно почему у вас ошибка, пропишите
$a = mysql_query("SELECT * FROM coment WHERE moderator=1"); /*вытаскиваются все комменты с полем moderator=1*/
/* проверка */
if($a) {echo "Выборка из таблицы прошла успешно!";} else {exit("Выборка не прошла, косяк в запросе");}
/* конец проверки */
if(@mysql_num_rows($a) < 1) {echo "<p>Комментариев пока никто не оставил</p>";} /*когда в базе нет комментов с полем moderator=1*/
$b = mysql_fetch_array($a); /*формируем массив*/
|
если выведется, что выборка прошла успешно, то ошибок быть не должно, а иначе надо... запрос поменять, наверняка у вас где-то косячок :) У меня все работает. Исходники- два файла + бд | |
|
|
|
|
|
|
|
для: ladan
(12.12.2011 в 18:56)
| | так где косяк то? | |
|
|
|
|
|
|
|
для: usa
(12.12.2011 в 19:40)
| | а вы Денвером пользуетесь? Быть может еще из-за этого. У меня phpmyadmin. Ошибок быть не должно.
программа думает, что $a = mysql_query("SELECT * FROM coment WHERE moderator=1") не удовлетворяет запросу, вот и ошибка. Либо у вас таблица не создана или название не то, либо у вас поле moderator отсутствует в таблице | |
|
|
|
|