Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: комменты с модерацией
 
 автор: usa   (10.12.2011 в 20:32)   письмо автору
 
 

добрый день!
Прошу подсказать как реализовать для этого кода возможность модерации сообщений и поставить проверку от спама.
<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);
}  
?>

  Ответить  
 
 автор: ladan   (11.12.2011 в 01:42)   письмо автору
 
   для: usa   (10.12.2011 в 20:32)
 

Для модерации создаешь еще одно поле в таблице с комментарии, на пример moderator и потом в запросе mysql_query, когда выводишь все комментарии, указываешь WHERE moderator=1

mysql_query("SELECT * FROM comments WHERE moderator=1").

Сделай так, чтоб при вставке инфы в таблицу, поле moderator не заполнялось. Потом просто вручную изменяешь это поле(вместо пустоты ставишь 1) и комментарий автоматом на сайте появляется.

А от спама я так полагаю капча подойдет. Знал бы как она делается, помог :) Самое простое - это в форме сделать простой пример, ответ которого лежит в базе(в отдельной табличке) и потом сравнить значение из базы с тем, что ввел пользователь.

Например, в форме есть картинка, на ней нарисовано "198756", в базе этот ответ уже есть. Если человек введет эти цифры и сравнение будет истиной, то все ок.

  Ответить  
 
 автор: usa   (11.12.2011 в 04:48)   письмо автору
 
   для: ladan   (11.12.2011 в 01:42)
 

Сделай так, чтоб при вставке инфы в таблицу, поле moderator не заполнялось. Потом просто вручную изменяешь это поле(вместо пустоты ставишь 1) и комментарий автоматом на сайте появляется.

Поле moderator - varchar или int?
Что ставить по умолчанию - null или неопределенно?
И как узнать что появился коммент?

  Ответить  
 
 автор: ladan   (11.12.2011 в 11:56)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: usa   (12.12.2011 в 09:14)   письмо автору
 
   для: ladan   (11.12.2011 в 11:56)
 

спасибо. очень доходчиво. получается.
Только сообщение на почту о появлении нового коммента я получаю только тогда когда значение moderatora = 1.
Т.е. кто-то добавляет коммент, значение moderatora - пустое, оно соотственно не появляется на сайте и я не получаю уведомление по почте.

  Ответить  
 
 автор: Lotanaen   (12.12.2011 в 09:48)   письмо автору
 
   для: usa   (12.12.2011 в 09:14)
 

ну так сделайте отправку писем когда вам нужно

  Ответить  
 
 автор: ladan   (12.12.2011 в 10:59)   письмо автору
 
   для: 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". А письмо прийдет только тогда, когда произойдет запись в таблицу

  Ответить  
 
 автор: usa   (12.12.2011 в 15:56)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: ladan   (12.12.2011 в 17:09)   письмо автору
 
   для: 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')");

  Ответить  
 
 автор: usa   (12.12.2011 в 18:15)   письмо автору
 
   для: 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));/*выводим все комментарии в цикле, удовлетворяющие запросу*/

  Ответить  
 
 автор: ladan   (12.12.2011 в 18:38)   письмо автору
 
   для: usa   (12.12.2011 в 18:15)
 

вообще беспонятия как такое может быть :) Скажите вашу почту я отправлю исходники, установите и посмотрите где у вас были ошибки

  Ответить  
 
 автор: usa   (12.12.2011 в 18:52)   письмо автору
 
   для: ladan   (12.12.2011 в 18:38)
 

какие исходники? :)
они уже приведены выше.

  Ответить  
 
 автор: ladan   (12.12.2011 в 18:56)   письмо автору
 
   для: 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); /*формируем массив*/ 



если выведется, что выборка прошла успешно, то ошибок быть не должно, а иначе надо... запрос поменять, наверняка у вас где-то косячок :) У меня все работает. Исходники- два файла + бд

  Ответить  
 
 автор: usa   (12.12.2011 в 19:40)   письмо автору
 
   для: ladan   (12.12.2011 в 18:56)
 

так где косяк то?

  Ответить  
 
 автор: ladan   (12.12.2011 в 19:56)   письмо автору
 
   для: usa   (12.12.2011 в 19:40)
 

а вы Денвером пользуетесь? Быть может еще из-за этого. У меня phpmyadmin. Ошибок быть не должно.

программа думает, что $a = mysql_query("SELECT * FROM coment WHERE moderator=1") не удовлетворяет запросу, вот и ошибка. Либо у вас таблица не создана или название не то, либо у вас поле moderator отсутствует в таблице

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования