Уроки PHP для начинающих


Скрипт для добавление комментариев на сайте: используем переменную окружения (продолжение)

Продолжаем совершенствовать наш скрипт для вывода комментариев на страницу сайта. И продолжаем знакомиться с переменной окружения $PHP_SELF, применять которую мы начали в статье Скрипт для добавление комментариев на сайте: используем переменную окружения.

Там мы отредактировали индексный файл.

Теперь внесём соответствующие изменения в скрипт-обработчик формы.

Что нам нужно сделать?

Во-первых, полученный благодаря переменной окружения $PHP_SELF абсолютный путь ($url) к комментируемой странице, надо записать в файл-базу.

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

Добавляем в код файла comments.php новые фрагменты (зелёным):

<?php
error_reporting (0);
$gbpath = "gb/gb.dat"; //путь к файлу-базе теперь можно прописать в самом скрипте-обработчике, так как эта база будет одна для всех страниц сайта
// проверяем, если метод запроса POST
if(getenv("REQUEST_METHOD Скрипт для добавление комментариев на сайте. Переменные окружения. Уроки php для начинающих.

Уроки PHP для начинающих


Скрипт для добавление комментариев на сайте: используем переменную окружения (продолжение)

Продолжаем совершенствовать наш скрипт для вывода комментариев на страницу сайта. И продолжаем знакомиться с переменной окружения $PHP_SELF, применять которую мы начали в статье Скрипт для добавление комментариев на сайте: используем переменную окружения.

Там мы отредактировали индексный файл.

Теперь внесём соответствующие изменения в скрипт-обработчик формы.

Что нам нужно сделать?

Во-первых, полученный благодаря переменной окружения $PHP_SELF абсолютный путь ($url) к комментируемой странице, надо записать в файл-базу.

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

Добавляем в код файла comments.php новые фрагменты (зелёным):

<?php
error_reporting (0);
$gbpath = "gb/gb.dat"; //путь к файлу-базе теперь можно прописать в самом скрипте-обработчике, так как эта база будет одна для всех страниц сайта
// проверяем, если метод запроса POST
if(getenv("REQUEST_METHOD")=="POST")
//то выполняем следующее
{
// страховка от хостингов, не поддерживающих глобальные переменные
if (isset ($_POST['name'])) //если существует глобальная переменная $_POST['name'], то
{
$name = $_POST['name']; //заменяем её на обычную переменную $name
}

if (isset ($_POST['email']))
{
$email = $_POST['email'];
}

if (isset ($_POST['text']))
{
$text = $_POST['text'];
}

if (isset ($_POST['summa']))
{
$summa = $_POST['summa'];
}

if (empty ($name) or empty ($email) or empty ($text))//если перечисленные переменные отсутствуют
//выводим следующее сообщение

{
echo "Форма заполнена не полностью!";
exit ();//и останавливаем выполнение программы
}
if ($summa != 17)
{
echo "Сумма чисел с картинки указана не правильно!";
exit ();//и останавливаем выполнение программы
}
else
{
/*удаляем лишние пробелы из формы*/
$name = trim ($name);
$email = trim ($email);
$text = trim ($text);
// ставим запрет на html-теги
$text = strip_tags ($text);
$email = strip_tags ($email);
$name = strip_tags ($name);
// заменяем все специальные символы их html-эквивалентом
$text = htmlspecialchars ($text);
$email = htmlspecialchars ($email);
$name = htmlspecialchars ($name);

if(!file_exists($gbpath)) // проверяем есть ли файл $gbpath 
{
// если отсутствует, то создаем его
$f=fopen($gbpath,"w") or die ("Не могу создать файл"); // создание файла
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
fwrite ($f,"",0); // имитация записи в него
@chmod($f, 0664); // установка прав на запись
fclose($f); // Закрытие созданного файла
}

// то значит скрипт вызван формой записи сообщения
$f=fopen($gbpath,"r") or die("Не могу открыть файл"); // Открываем файл для чтения
$oldData = fread($f, filesize ($gbpath)); // считываем данные
fclose($f); // закрываем файл

$f=fopen($gbpath,"w+") or die("Не могу открыть файл"); // открываем файл для дозаписи
flock($f,2) or die("Невозможно заблокировать файл"); // блокируем файл
//определяем время и дату добавления сообщения, чтобы записать их тоже
$date = date("d-m-Y");
$time = time ();
$H = date ('H', $time); //определяем часы
$i = date ('i', $time); //определяем минуты
fputs($f, "$url\n"); // записываем адрес страницы, на которой был добавлен комментарий
fputs($f,"$name\n"); // записываем имя автора
fputs($f,"$email\n"); // его e-mail
$text=ereg_replace("\n"," ",$text);// убираем возвраты каретки из сообщения
fputs($f,"$text\n"); // записываем сообщение
fputs ($f, "$date\n"); // записали дату
fputs ($f, "$H\n"); //записали часы добавления сообщения
fputs ($f, "$i\n"); //записали минуты
// далее реализуем отправку нового комментария на адрес админа сайта
$address = "адрес вашей почты"; //сюда полетит сообщение о новом комментарии

//заголовок письма, по которому вы определите, что это именно комментарий с сайта
$subject = "Новый комментарий на сайте";

//сообщение, которое будет в письме
$message = "Появился комментарий на странице - " .$url. "\nКомментарий добавил(а): ".$name."\nАдрес почты: " .$email. "\nТекст комментария: ".$text."\nСсылка на заметку: ".$url;

//далее прописываем функцию для отправки сообщения
mail ($address, $subject, $message, "Content-type:text/plain; Charset=windows-1251\r\n");

fwrite($f,$oldData); // записываем прежние данные
fclose($f); // закрываем файл
}
}
if(file_exists($gbpath))
{
$f=fopen($gbpath,"r") or die("Не могу открыть файл");// открываем файл с записями
while(1){// вырожденный цикл, для чтения записей из файла

$url = fgets($f, 1000); // считываем адрес страницы из БД
$tmp = trim(str_replace("\n", "", $url)); //убираем возврат каретки из считанного адреса. Обратите на это внимание: если возврат каретки из адреса не убрать, скрипт не будет находить страницу, так как возврат каретки будет прибавляться к адресу страницы! Кроме того, убираем функцией trim() возможные лишние пробелы. Результат помещаем в переменную $tmp

$name=fgets($f,1000);// считываем имя автора
$email=fgets($f,1000);// его e-mail
$text=fgets($f,1000);// сообщение
$date = fgets($f, 1000); //дату
$H = fgets($f, 1000); //часы
$i = fgets($f, 1000); //минуты
if(feof($f)) break; // если записей больше нет выходим из цикла
// Выводим данные
//сравниваем переменную $tmp из файла-базы с абсолютным путём к странице, полученным при помощи переменной окружения $PHP_SELF
if ($tmp == "http://comment" .$PHP_SELF)
{


echo "<hr>Автор:<a href=mailto:$email>$name</a><br>";
echo $date. "<br>";
echo $H. " час. " .$i. " мин.<br / >";
echo "Сообщение:<br>$text<br>";
} //проверка закончена
}
fclose($f);// закрываем файл
}
?>

Вот такой получился скрипт.

Внимание! Если Вы сделали всё, как в этой статье, залили сайт на хостинг, а скрипт на заработал (не определяется $PHP_SELF), тогда замените её на $_SERVER ['PHP_SELF'].

То есть, на Вашем сайте должно быть следующее.

В коде страницы сайта:

...
$url = "http://название сайта" .$_SERVER['PHP_SELF'];
...

В коде скрипта:

...
if ($tmp == "http://название сайта" .$_SERVER['PHP_SELF'])
...

Важно! Когда закачаете скрипт и файл-базу на хостинг, обязательно проверьте и установите права доступа на эти файлы.атрибуты файлов должны быть следующие:

0664 - на файл-базу;

0711 - на сам скрипт.

Ну а если Вы подзабыли, что есть права доступа и как с ними "бороться", то можно освежить память в статье Права доступа и изменение атрибутов файла

Как я уже говорил, это не всё, что можно изменить, улучшить - всему своё время.

А ещё хочу обратить внимание на то, что даже на примере всего лишь одного скрипта можно научиться очень многому.

В данном скрипте мы применяем в качестве базы данных текстовый файл. Наверное, пока в нём сообщений не много, всё будет работать быстро и идеально. Однако, когда сайт большой, посещаемый многими людьми, которые оставляют много комментариев... в этом случае лучше использовать базы данных MySQL, о чём смотрите в курсе "PHP + MySQL для начинающих" - да и управлять таким сайтом гораздо, гораздо удобней.

Успехов. И поговорим о том, Как сделать и установить каптчу с произвольно генерируемым кодом.

Автор: Андрей Чернобай

P. S. Подпишитесь на безплатную рассылку Вокруг Сайта и получайте на свой электронный адрес новые уроки по созданию сайта.

Оставьте свой отзыв о статье:



Введите цифровой код с картинки*:


Комментарий добавил(а): Николай
15-02-2012
19 час. 19 мин.

Комментарий:
Не выводит комментарий на страницу

Ответ: Здравствуйте, Николай. А у меня выводит. Это тот же самый скрипт, которым выводятся эти вот самые комментарии на этой вот самой странице. Чтобы разобраться в проблеме, мне нужно видеть ваш код. Если не трудно, пришлите в прикреплённых файлах мне на e-mail: kapitansg@yandex.ru. Или же сначала внимательно проверьте правильность путей к файлу-базе - вероятно, на вашем сайте они будут другими, чем в примере.


Комментарий добавил(а): Евгений
29-07-2012
09 час. 54 мин.

Комментарий:
Здравствуйте. Подскажите в чем проблема? Warning: fopen(gb/gb.dat) [function.fopen]: failed to open stream: No such file or directory in z:\home\test\www\comments.php on line 62Не могу создать файл

Ответ: Здравствуйте, Евгений. Проверьте внимательно путь к папке с файлом-базой, есть ли вообще папка gb? Правильно ли указали путь в самом скрипте? Если не разберётесь, шлите код скрипта и формы мне на e-mail, с указанием, в какой папке файл-база.


Комментарий добавил(а): Variuzz
20-09-2012
04 час. 42 мин.

Комментарий:
Здравствуйте, Андрей. ПЕРВЫЙ ВОПРОС: комментарии появляются только на странице, к которой первой применил скрипты, причём когда отправляешь комментарий, кнопка

Ответ: Здравствуйте, Variuzz. Во-первых, войдите в файл-базу и посмотрите, правильно ли прошла запись. Лучше всего проверить в программе Notepad++, там строки пронумерованы. Если где-то ошибка, исправьте вручную и обновите страницы, на которых должны выводиться комментарии. Если проблема исчезла, то есть, всё вывелось как надо, то проблема где-то с записью. Ищите ошибку. Возможно, действительно проблема с возвратом каретки. Попробуйте добавить в скрипт ниже строки $text=ereg_replace(^\n^,^^,$text); строку такую: $text=ereg_replace(^\r^,^^,$text); - проверьте, как на этот раз будет идти запись. Если всё по-прежнему, пишите. Если будет работать исправно, тоже пишите - вдруг да кому-то это пригодится.


Комментарий добавил(а): Variuzz
20-09-2012
04 час. 50 мин.

Комментарий:
я так понял, что не разобрался с возвратом каретки)) действительно, что-то не могу понять.

Ответ: В предыдущем ответе вместо ^ разумеется кавычки.


Комментарий добавил(а): Variuzz
20-09-2012
16 час. 47 мин.

Комментарий:
объясните пожалуйста


Комментарий добавил(а): Артём
20-09-2012
18 час. 08 мин.

Комментарий:
Variuzz, ты забыл проследить за формой в строке - на другой форме комментария должен быть прописан другой файл, например ))

Новое на сайте

Видеокурсы

Рассылки

"Вокруг Сайта"
подпишитесь и получайте на свой e-mail уроки, книги, статьи, скрипты, а также подарки и скидки на товары, продаваемые с сайта

SmartResponder.ru
Ваше имя: *
Ваш e-mail: *

"PHP-песочница"
- PHP для начинающих: уроки с подробным анализом скриптов, необходимых для вашего сайта:

PHP-песочница
Подписаться письмом

Разделы Сайта