Как сделать отзывы на сайте | PHP

Простейшее решение создания страницы отзывов/комментариев на сайте без базы данных. Все сообщения будут приходить на email. Чтобы отсеять спам, публиковаться будут только те, которые не содержат http://. Если в тексте присутствует http://, но оно не является спамом, то его можно будет вручную прописать в файле comments.txt.

В файле .htaccess закрыть служебную информацию comments.txt:

<Files "comments.txt">
Deny from all
</Files>

Создать файл comments.html, в самый верх которого без пробелов и отступов вставить скрипт PHP:

<?
// занести в массив значение полей
$z = array(
  1 => $_POST['name'],
  2 => $_POST['email'],
  3 => $_POST['content']
);
$dl = '';

if($z[1] && $z[2] && $z[3]){

  mail("name@yandex.ru", "заполнена форма site.ru", $z[1] . "\n" . $z[2] . "\n" . $z[3]); // сообщение на ваш email о новом отзыве

  if(strpos($z[3], 'http://') === false){ // если в тексте отзыва нет http://
    $fp = fopen("comments.txt", "a+"); // режим записи
    $mytext = "<dt><a href='" . $z[2] . "'>" . $z[1] . "</a><dd>" . $z[3] ;
    $save = fwrite($fp, $mytext); // запись в файл
    fclose($fp); // закрытие файла
    Header("Location: ".$_SERVER['PHP_SELF']); // обновить страницу; обновлённая версия содержит опубликованный комментарий
    exit;
  } else { // если в тексте есть http://
    $dl = '<b style="color: red;">Ваш отзыв будет опубликован после проверки автором сайта</b>'; // показан этот текст
  }

} else { 

  $fp = @fopen("comments.txt", "r"); // режим чтения
  if ($fp) {
    while (!feof($fp)) {
      $dl .= fgetss($fp, 8000, "<dl>,<dt>,<dd>"); // <dl>,<dt>,<dd> - это список тегов, разрешённых для публикации
    }
  }
  fclose($fp);

} 
?>

В удобном месте в comments.html добавить HTML код формы

<form method="post">
  <label>Как к Вам обращаться:</label>
  <input type='text' name='name' required/>
  <label>Email (не публикуется):</label>
  <input type='email' name='email' required/>
  <label>Oтзыв:</label>
  <textarea name='content' required rows="5"></textarea>
  <input type='submit' value='публикация'/>
</form>

<dl>
<? echo $dl; ?> <!-- PHP -->
</dl>

При первом сообщении создастся файл comments.txt. В него будут падать все оставленные отзывы. Их можно будет удалять, редактировать либо добавлять свои.

в f t
наверх ↑

66 комментариев:

виталий нестёркин
В файле .htaccess закрываем служебную информацию всех .txt файлов
а если такого файла вобше нету то делаем файл .htaccess.html и помешаем его на сервер да?
виталий нестёркин
а куда именно вписать

Deny from all

...........
# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

AddDefaultCharset utf-8
# END WordPress
виталий нестёркин
да уж зашел на блок почитать статью про оптимизацию сайта ...а зацепился за эту статью . 4 утра а так не чего и не добился
NMitra
Не
Deny from all
а
<Files *.txt>
Deny from all
</Files>
иначе все страницы закроете :( Пока не трогайте этот файл.

RewriteRule . /index.php [L] - у вас же нет этой страницы. У вас почему-то /index.html

Из-за того, что у вас файлы, а не база данных, это тоже не нужно
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
NMitra
Здесь упрощенный вариант http://www.cyberforum.ru/html/thread389569.html
виталий нестёркин

Deny from all
я это и имел ввиду просто не все скопировол и не все вставилось а я не заметил
виталий нестёркин
у меня на сервере где лежит сайт вобше нет ну или не нашел файл .htaccess а это то что нашел в интернете так сказать совет как сделать файл .htaccess

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

AddDefaultCharset utf-8
# END WordPress

пока не чего не куда не пихал пока не разберусь вечером почитаю ваш совет про упрошеннуцю схему может что получится (ну вечер у меня как заметили очень поздно наступает тогда же и в контакте напишу )
виталий нестёркин
чтобы работали скрипты на php нужно чтоб на сайте стоял что то вроде ворлд пресс или ему подобное так . Пытаюсь поставить на сервер где лежит сайт ворлд прес при установки пишут что установка cms удалит все файлы что находятся в директории получается надо сохранить все файлы потом поставить ворлд прес а потом опять сайт выгрузить на сервер так что ли
виталий нестёркин
а вот этот код он будет работать без всяких PHP если его просто вставить в HTML страницу

Ваш код HTML не может быть принят: Недопустимый тег: не разрешает эта форма код для просмотра вставить .


чего то не хватает отображается на странице нормально корректно
но комментарии написать не получается
http://xn--51-8kcfemaodkveyaqedoqejz1ao.xn--p1ai/comments.html
NMitra
"чтобы работали скрипты на php нужно чтоб на сайте стоял что то вроде ворлд пресс" - нужно чтобы у хостера была поддержка php, а таких 90%, если не выше.

Комментарии не пускают теги, воспользуйтесь формой http://shpargalkablog.ru/2010/12/napisat-kod-tekstom.html

HTML не может быть динамичным. Искл. тег details и marquee. Последний уже выведен из спецификации.
Анонимный
21
Анонимный
or
Анонимный
яяяяя
NMitra
Ребят, здесь отзывы строятся по другому принципу, это Blogger, бесплатная блогоплатформа Google.
Mishechka
Наташа, а в Blogger файл .htaccess можно чем-нибудь заменить? Или тут вообще такое невозможно?
NMitra
В Blogger нет к нему доступа
Mishechka
Жаль, я хотел настроить кэширование:

FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 month"
</filesmatch>
</ifmodule>
Анонимный
Гуд
Анонимный
фыв
Анонимный
српар
Dmitriatika
Чтобы работал HTML как PHP нужно прописать в .htaccess строки:

RemoveHandler .html .htm .shtml .shtm
AddType application/x-httpd-php .php .html .htm .shtml .shtm

Сам html файл должен содержать все основные разметки, а предлагаемый код должен помещаться между тегами body и /body и будет всё работать. Но не ожидайте чудес от такого примитивного скрипта. Он может неплохо дополнить страницу раздела сайта "Отзывы и предложения"...
Короче, я ради интереса попробовал - всё работает.
NMitra
Спасибо за дополнение! В службе поддержки хостинга мне в своё время предложили такое решение:

AddHandler fcgid-script .htm .html
Анонимный
Скажите, а как же быть с robots.txt, если в .htaccess закроется вся информация?
Или на ботов поисковых систем это не распространяется?
NMitra
Верно говорите, подправила статью. Отзывы делала для маленького сайта, для которого не нужен robots.txt. Спасибо за вопрос!
Александр
Вам спасибо - разобрался благодаря вашей статье со всем этим, всё сделал, всё отлично работает.
Мне вот только хотелось бы ещё как-нибудь выводить дату и время постинга - возможно ли такое без баз данных?
Еще один момент: в самом начале, когда еще нет ни одного коммента, у меня выдаёт вот такую ошибку:
Warning: fclose() expects parameter 1 to be resource, boolean given in ... on line 33
Отправишь первый коммент - всё пропадает.
Можно ли как-то это исправить?
Большое спасибо вам.
Александр
Вот ещё какой момент: в .htaccess мы закрываем comments.txt, но ведь функция нам создаёт при отправлении первого комментария файл комментарии.txt.
То есть в коде PHP надо просто "комментарии.txt" поменять на "comments.txt".
NMitra
Какая я не внимательная! Всё верно, если у вас рф домен, то меняете всё на комментарии.txt и комментарии.html, если ru или com, то на comments.txt и comments.html
NMitra
У меня не ругается. Попробуйте сразу сами создать пустой comments.txt. Предполагаю, что скрипт пытается его открыть и закрыть, но не находит.
NMitra
Вводим дату

<?
$z = array(
1 => $_POST['name'],
2 => $_POST['email'],
3 => $_POST['content'],
4 => date("m.d.Y H:i")
);
$dl = '';

if($z[1] && $z[2] && $z[3]){

mail("name@yandex.ru", "заполнена форма site.ru", $z[1] . "\n" . $z[2] . "\n" . $z[3]);

if(strpos($z[3], 'http://') === false){
$fp = fopen("comments.txt", "a+");
$mytext = "<dt><a href='" . $z[2] . "'>" . $z[1] . "</a><dd><span>" . $z[4] . "</span> " . $z[3] ;
$save = fwrite($fp, $mytext);
fclose($fp);
Header("Location: ".$_SERVER['PHP_SELF']);
exit;
} else {
$dl = '<b style="color: red;">Ваш отзыв будет опубликован после проверки автором сайта</b>';
}

} else {

$fp = @fopen("comments.txt", "r");
if ($fp) {
while (!feof($fp)) {
$dl .= fgetss($fp, 8000, "<dl>,<dt>,<dd>,<span>");
}
}
fclose($fp);
}
?>
NMitra
date("d.m.Y H:i")
Александр
Автор, вы просто душка!
Спасибо вам большое, во всём разобрался, вы мне очень помогли!
Я только для себя поменял вывод даты - поставил его перед именем комментатора.
Сейчас хочу ещё сделать определение по IP, чтобы нежелательных комментаторов ограничивать.
Плюс хочу сделать каптчу для отправления сообщения.
Не подскажете, в этих случаях уже точно без базы данных не обойтись?
Большое вам спасибо, Наталья, за блог и помощь.
NMitra
Добавить переменную

$z = array(
1 => $_POST['name'],
2 => $_POST['email'],
3 => $_POST['content'],
4 => date("m.d.Y H:i"),
5 => $_SERVER["REMOTE_ADDR"]
);

Чтобы сохранять IP
$mytext = "<dt><a href='" . $z[2] . "' title='" . $z[5] . "'>" . $z[1] . "</a><dd><span>" . $z[4] . "</span>" . $z[3] ;

Чтобы ограничить IP (вроде так, правильность не проверяла)
if($z[1] && $z[2] && $z[3] && ($z[5] != 0.000.000.000)){

Капчу тоже можно сделать, но я не хочу этим заниматься. Добавляете поле, если то, что в поле удовлетворяет условию, то форма отправляется, иначе нет.
Александр
Спасибо вам большое!
IP прописывает отлично, но как ограничивать по IP, пока не разобрался. Но теперь уже знаю, что это должно быть не сложно.
Огромное вам спасибо, за несколько дней много интересного прочитал на вашем блоге!
Александр
Столкнулся вот с какой проблемой: когда скрипт сам по себе в файле с расширением .html, то всё отлично работает, хотя некоторые видят не кириллицу, а крокозябры (разные кодировки ставил, ANSI видит правильно большинство).
Стоит вставить скрипт в обычный файл, в то место, где, собственно, и нужны комментарии или отзывы, то видят кириллицу все, скрипт работает, но после отправления комментария пропадает всё, что есть на странице ниже этого скрипта, не происходит автоматическое обновление...
Скажите, можно ли как-то это исправить без привлечения JS или JQery?
А то так был доволен простотой, но в итоге скрипт не вполне подходит, печально...
Александр
Ой, неожиданно разобрался с этой проблемой, когда снова прочитал вашу статью =))
Надо просто PHP-скрипт вставлять в документ до DOCTYPE.
Тогда всё работает, как и должно работать.
NMitra
:)) Только хотела написать, что код везде работает одинаково, искл. если один скрипт перебивает другой. Но код в любом случае один и тот же будет.

По поводу кириллицы, на HTML странице должен быть мета-тег
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
Если проблемы в письме email, то нужно прописывать заголовок http://shpargalkablog.ru/2014/01/feedback-form.html
Александр
Спасибо вам большое!
Максим
Замечательный скрипт, то, что надо как раз. Но вот одна проблема. После написания комментария, страница должна обновляться, но обновляться она не хочет. Соответственн, приходитс обновлять ее вручную. В чем может быть пролема не подскажите?
Максим
И еще вопрос такой: комментарии выводятся обычным текстом. Как к ним прописать стиль я разобрался. Но хотелось бы подключить разные стили к имени, комментарию. Возможно ли это?
NMitra
Вот это Header("Location: ".$_SERVER['PHP_SELF']); должно обновлять страницу.

dd {
white-space: pre-line;
margin: 0;
border: solid;
}
dt {
margin-top: 1.5%;
font-weight:bold;
}
Анонимный
На блоге этот скрипт работает?
NMitra
Этот блог на бесплатном Blogger от Google, тут нет поддержки PHP
Анонимный
ghjgj
Анонимный
Не могу разобраться почему не отправляет письмо на почту. Выводит Ваш отзыв будет опубликован после проверки автором сайта но письмо не приходит. проверяю локально на OpenServer
NMitra
Попробуйте загрузить на хостинг
Анонимный
OpenServer не отправляет письма заглушка стоит) Здесь сам разобрался))
Анонимный
Здраствуйте. Подскажите пожалуйста, как разделить комментарии между собой с помощью тега hr.
Анонимный
аяяй забывал новый коментарий написать))Растяпа)
NMitra
Здравствуйте, я бы стилями сделала

dd {
margin: 0;
border-top: 1px solid red;
}
Анонимный
добавил в сам код тег hr все довольно таки красиво получилось. Но за посказку спасибо!
Анонимный
Как сделать такой комментарий у себя!
NMitra
Не поняла вопроса, это форма комментариев Blogger - бесплатного блогохостинга.
Анонимный
проверка связи
GermaCook
Как сделать такой комментарий у себя!
GermaCook
Как сделать такой комментарий у себя!
NMitra
Это форма связи Blogger. Понятие не имею как она сделана.
Анонимный
Выводит ошибку с этого места $_POST['name'], 2 => $_POST['email'], 3 => $_POST['content'] ); $dl = ''; if($z[1] && $z[2] && $z[3]){ mail("
Анонимный
Как сделать такие же комментарии
NMitra
Комментарий 57: у вас нет поддержки php на html странице. Попробуйте заменить comments.html на comments.php
Комментарий 58: см. комментарий 56
Анонимный
213
Анонимный
Здраствуйте! Данная разборка занимается разводом, запчасти не соответвует фотографиям, оскорбляют, отзывы на сайте запчасти самостоятельно удаляют, после чего я звоню они говорят все на своего напарника (который звонил и оскорблял меня). Как было? Заказал я бампер на Каен, бампер пришел поврежденный, без креплений, молдинг погнутый, хотя бампер на фото идеальный, я много раз переспрашивал, мне говорили что все как на фото, после того как на почте я увидел бампер, я был шокирован, отказавшись от товара на телефон поступило пару звонков с разборки 6062(http://razborka6062.com.ua/) Я думал что у такой серьезной на первый взгляд разборки должно быть все обосновано, позвонив туда я ничего нового не услышал, отзывы на сайте котором они продают запчасти они самостоятельно удаляют отзывы, это уже о многом говорит. Советую обходить стороной, это еще хорошо что я предоплату отказался сбрасывать.
0503116062
0673206062
Лариса Волынкина
Добрый день. У меня код если вставлять все в html не работает. Вставляю первую часть в php, вторую в html. Работает отправка отзыва, но потом белый экран, и на страницу ничего не добавляется.
Не срабатывает вот эта часть:
дл
ечо
дл (по другому комментарий не отправляется)
При добавлении ее в конце в html появляется ошибка, что мол неожидаемый символ. Подскажите в чем может быть дело. Куда и как правильнее добавить эту строчку?
NMitra
Добрый день, я поняла в чём проблема. Попробуйте comments.html заменить на comments.php. По хорошему нужно php в отдельный файл выносить. Чтобы перезагрузки не было, применять XMLHttpRequest(). Код смогу доработать не раньше чем через неделю.
Лариса Волынкина
Буду ждать! Если перенести все в php файл форма работает, но перенести ее на cms сайта в html страницу не получается
Анонимный
Здравствуйте. А как сделать вывод комментариев так, чтобы не съезжал дизайн страницы, в некую область, что-ли, но без использования CSS, у меня чистый хтмл, и при написании длинного комментария он съезжает за край страницы, одной длинной строкой, нет переноса. Возможно ли такое? Спасибо!
NMitra
Измените dl, dt, dd на другие теги, например, так

<article>
<cite><a href="http://shpargalkablog.ru/">NMitra</a></cite>
<time datetime="2014-09-19">19 сентября 2014 год</time>
<p>Так может быть оформлен комментарий на блоге.</p>
</article>