поле для комментариев с использованием php
7989
19
Недавно возникла сложность с написанием скрипта поля для комментариев. Сложность в том что мне нужно чтобы все когда либо введенные тексты сохранялись отдельном текстовом файле, а у меня текст выводится просто в новой вкладке. Вот сам скрипт с формой отправки комментария (скажите пожалуйста что надо добавить или изменить):

<?php
if (isset($_GET['name'])) {
echo '' . $_GET['name'];

$name = fopen("comment.php", "w");
fwrite($name, "");
$var = fopen("comment.php", "r");
echo fgets($name);
fclose($name);
}
else {
echo '<p>введите ваш отзыв</p><br>';
echo '<form class="form1" action="' . $_SERVER['SCRIPT_NAME'] . '">';
echo '<textarea name="name" ></textarea>';
echo '<input type="submit" value="OK" >';
echo '</form><br>';
}
?>
Mihail2002
$name = fopen("comment.php", "w");
fwrite($name, "");
Я не понял, вы хотите сохранять комментарии в файл comment.php??
KSergey
Нет, я случайно написал "php". Вообще я хочу чтобы комментарии сохранялись в текстовом файле comment.txt
Mihail2002
На сколько я понимаю, надо что-то вроде такого написать (в синтаксисе могу приврать, с php общаюсь редко)

<?php
if (isset($_GET['name'])) {
$name = fopen("comment.txt", "w");
fwrite($name, $_GET['name']);
fclose($name);
}
else {
KSergey
Спасибо за скрипт, очень помогло!
KSergey
Я попробовал внедрить скрипт в сайт расположенный на моем компе (открываю с помощью денвера) - работает нормально. Но как только я выложил его на просторы интернета, то комментарии в отдельный файл начали сохраняться через раз, или вовсе, не сохраняться.
Mihail2002
Пора смотреть на ошибки записи в файл, проставить верные атрибуты (доступен для записи) на comment.txt
KSergey
А какого рода могут быть ошибки и к какому тегу атрибуты?
Mihail2002
Ошибки дешевле смотреть по месту, зачем гадать?
KSergey
вот сам скрипт (а сам а файл куда все должно сохраняться называется comment.txt):
<?php
if (isset($_GET['name'])) {
$name = fopen("comment.txt", "w");
fwrite($name, $_GET['name']);
fclose($name);
}
else {

echo '<form class="form1" action="' . $_SERVER['SCRIPT_NAME'] . '">';
echo '<textarea name="name" placeholder="введите ваш отзыв о сайте"></textarea>';
echo '<input type="submit" value="отправить" class="sub">';
echo '</form>';}
?>
Mihail2002
В гугле вбиваем:
"как узнать ошибки записи файл php"
"как включить отображение ошибок php"
KSergey
Я попробовал добавить в скрипт несколько другой атрибут вместо:
$name = fopen("comment.txt", "w");
fwrite($name, $_GET['name']);
я написал :
$name = fopen("comment.txt", "a-");
fwrite($name, $_GET['name']);
и все равно не получается нормально сохранить коммент
Mihail2002
Есть хороший анекдот на эту тему. И не один.
Я вам уже посоветовал правильный путь, более мне, увы, сказать нечего.
KSergey
Насчет проблемы по поводу сохранения - все решено! Только все сохраняется в php-файле. Одна проблема, как расположить каждый новый комментарий на новой строке (они располагаются все в одну строку)? Вот например
в html это <br>, но в php я не знаю какой скрипт переносит текст на новою строку. Подскажите пожалуйста этот скрипт.
Mihail2002
гугль "php перенос строки"
Вы как вообще жить собираетесь при таком подходе? скоро деньги требовать начну, сугубо в воспитательных целях!

fwrite($name, $_GET['name'] . "\n");
KSergey
Спасибо! У меня комментарии хранятся в блоках (div), но каждый новый новый комментарий выводится под предыдущим. Что мне исправить в том скрипте чтобы каждый новый комментарий выводился над каждым предыдущим (то есть самы последний комментарий в самом верху, а самый первый комментарий внизу веб страницы). Или мне вообще мыслить в другом направлении? Подскажите пожалуйста, что мне надо сделать чтобы реализовать сказанное мной выше!
Mihail2002
порядок вывода блоков в скрипте изменить следует.
Ваш КО

Зы
Можете привести sql скрипт, которым выборка комментариев из базы осуществляется?
KSergey
Sql к сожалению не знаю, поэтому решил проблему без баз данных.
date_default_timezone_set('Asia/Almaty');
$month = date("F");
switch ($month) {
case "January": $month = "Января"; break;
case "February": $month = "Февраля"; break;
case "March": $month = "Марта"; break;
case "April": $month = "Апреля"; break;
case "May": $month = "Мая"; break;
case "June": $month = "Июня"; break;
case "July": $month = "Июля"; break;
case "August": $month = "Августа"; break;
case "September": $month = "Сентября"; break;
case "October": $month = "Октября"; break;
case "November": $month = "Ноября"; break;
case "December": $month = "Декабря"; break;
}$date = date('j ') . $month . date(' Y ');

$time = date(' H:i ');
if (isset($_GET['name']).($_GET['family']).($_GET['text'])) {


file_put_contents("comment.php", "<div><p>" . $date . "года" . $time . "<br>от:<span> </span>" . $_GET['name'] . "<span> </span>" . $_GET['family'] . "<br><br>" . $_GET['text'] . "</p></div>".file_get_contents("comment.php"));
echo "<script>alert('Ваше сообщение отправлено!');</script><meta http-equiv='refresh' content='0; url=http://webdisaignmikhail.besaba.com/mishashni.php'>";
}
else {
echo '<form class="form1" action="' . $_SERVER['SCRIPT_NAME'] . '">';
echo '<p class="super">ваше имя:</p>';
echo '<input type="name" name="name" placeholder="ввведите ваше имя" required>';
echo '<br><br><br><br><p class="super">ваша фамилия:</p>';
echo '<input type="name" name="family" placeholder="ввведите вашу фамилию" style="margin-top:2px;" required>';
echo '<br><br><br><br><p class="super">текст сообщения:</p>';
echo '<textarea name="text" id="js" style="word-wrap: break-word;z-index:2;" maxlength="1600" class="text" placeholder="введите ваш отзыв о сайте и заинтересовали ли вас мои услуги " required></textarea>';
echo '<input type="submit" value="отправить" class="sub"">';

echo '</form><br>';}
?>
KSergey
Скажите пожалуйста, что надо изменить в следещем скрипте, чтобы он нормально функционировал:
$new_data = strip_tags($_POST['text'], '<ol><ul><li><em><u><b>');
if(mb_strlen($_POST['text']) !== strlen($new_data)){
return exit("<p class='links'><span style='color:red;'>Не используйте запрещенный html!</span><br>Можно использовать как теги только: <br> <b>, <u>, <em>, <ul>, <li>, <ol>. <br>Вернитесь и исправьте свою ошибку <a href='javascript:history.go(-1)'>здесь</a>.</p>");
}

function closing_html($html){
preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[ 1 ];
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[ 1 ];
$lenOpened = count($openedtags);
if (count($closedtags) == $lenOpened)
return true;
$openedtags = array_reverse($openedtags);
$countTags = 0;
for ($i = 0; $i < $lenOpened; $i++)
if (!in_array($openedtags[$i], $closedtags))
$countTags++;
return ($countTags) ? false : true;
}

$html = $text;

if (!closing_html($html)) {
return exit("<p class='links'><span style='color:red;'>Вы не закрыли один или несколько html тегов!</span><br>Вернитесь и исправьте свою ошибку <a href='javascript:history.go(-1)'>здесь</a>.</p>");
}

function closing_html_html($html_html) {
preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html_html, $result);
$closedtags = $result[ 1 ];
preg_match_all('#</([a-z]+)>#iU', $html_html, $result);
$openedtags = $result[ 1 ];
$lenOpened = count($openedtags);
if (count($closedtags) == $lenOpened)
return true;
$openedtags = array_reverse($openedtags);
$countTags = 0;
for ($i = 0; $i < $lenOpened; $i++)
if (!in_array($openedtags[$i], $closedtags))
$countTags++;
return ($countTags) ? false : true;
}

$html_html = $text;

if (!closing_html_html($html_html)) {
return exit("<p class='links'><span style='color:red;'>Вы не закрыли один или несколько html тегов!</span><br>Вернитесь и исправьте свою ошибку <a href='javascript:history.go(-1)'>здесь</a>.</p>");
}
Проблема в том, что пользователь откроет один тег, и закроет другим, и сообщение отправляется (то бишь откроет в textarea b, а закроет em). Скажите пожалуйста, в чем проблема, как ее исправить, или есть альтернатива функциям приведенным мной ниже.
P.S. Метод не гет - как было раньше, а пост.
Mihail2002
попробуйте задать вопрос здесь http://www.cyberforum.ru/php-beginners/

- обязательно используйте таг code, что бы код был форматированным и его можно было легко читать, иначе вам отвечать никто не будет.