Урок 5. Комментарии на сайте. Пишем гостевую книгу на PHP.

Введение

При создании сайта зачастую преследуется одна основная цель. Эта цель – донесение до посетителя нужной информации. Когда ваш сайт станет достаточно посещаем и информации становиться все больше, вам необходимо отсеять нужную, и знать какая наиболее интересна пользователю.

Чтобы узнать рейтинг какой либо статьи мы можем использовать предыдущий урок, который описывает принцип сбора статистики на сайте, но сейчас вопрос стоит в том , чтобы дать пользователю выразить свое мнение, написать комментарий или просто дать возможность оставить отзыв в гостевой книге.

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

Детали

В предыдущих уроках мы рассмотрели работу с файлами(счетчики) и авторизацию на сайте. Все это нам пригодиться в этом уроке. Чтобы написать скрипт нам необходимо освоить:

  • циклы в PHP
  • массивы в PHP
  • функции работы с файлами
  • БД MySQL

Вариант 1.Гостевая книга на PHP с использованием текстовых файлов

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>

<head>
  <title>Гостевуха</title>
</head>
<body>
<?php include("read.php"); ?>
<br/>
<form name="" action="add.php" method="post">
Имя:<input name="data[0]" type="text" value=""><br/>
e-mail:<input name="data[1]" type="text" value=""> <br/>
<textarea name="data[2]" rows=5 cols=20 wrap="off"></textarea>
<br/>
<input type="submit" name="add" value="добавить"> <br/>
</form>
</body>
</html>

Что делает этот файл? Сперва подключаем скрипт, который получает из файла данные и выводит их в браузер. Далее следует форма для ввода данных, традиционно это будет Имя, e-mail и сам комментарий. Все данные передаем единым массивом, которые впоследствие будем извлекать из суперглобала – $_POST[]. В нем передаются данные , которые мы ввели в форме.

Конкретно данные буду содержаться в массиве $_POST['data'],
где:

  • $_POST['data']['0'] – это имя;
  • $_POST['data']['1'] – e-mail;
  • $_POST['data']['2'] – комментраий;
  • $_POST['add'] – переменная , которая будет сообщать скрипту что кнопка была нажата.

Рассмотрим следующий шаг – это добавление записи.

add.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
$url="data.txt";
$name = strip_tags(stripslashes(substr($_POST['data']['0'],0,20)));
$mail = strip_tags(stripslashes(substr($_POST['data']['1'],0,30)));
$text = strip_tags(stripslashes(substr($_POST['data']['2'],0,300)));

if($_POST['add'] != '') {
    if($name != '') {
        if($mail !='') {
            if($text != '') {
            if(!file_exists($url)) {

   //Если файла не существует, создаем его, и записываем нулевое значение
$data = implode("::",$_POST['data']);

$handle = fopen($url,"a");
fwrite($handle,$data."\n");
fclose($handle);
 echo "<a href=\"index.php\">посмотреть комментарий</a>";
}
else {
 //Если файл существует, то работаем с ним
$data = implode("::",$_POST['data']);
$handle = fopen($url,"a");
fwrite($handle,$data."\n");
fclose($handle);
 echo "<a href=\"index.php\">посмотреть комментарий</a>";
 }
 }
 else {echo "Введите коментарий";}
 }
 else {echo "Введите мэйл";}
 }
 else { echo "Введите имя"; }
 }
 else {echo "<a href=\"index.php\">назад</a>";  };
?>

Сначала мы очищаем и обрезаем все данные от разного рода символов, тэгов, которые могут помешать работе нашего срипта. Далее приведу строковые функции, которые нам в этом помогут:

  • striptags(); вырезает html и php тэги.
  • stripslashes Удаляет экранирование символов, произведенное функцией addslashes()
  • substr – обрезает строку до нужной длины.

Далее идут условия, которые проверяют введены ли данные. После того как все проверено нам надо объединить все данные в строку, и разделить их каким нибудь знаком(сепаратором).

Смотрите в документации как работает функция implode();. В качестве сепаратора в нашем примере учавствуют «::», а разбиваемым массивом становится $data. В итоге строка приобретает вид имя::e-mail::комментарий, и ещё необходимо добавить специальный флаг, который указывает переход на новую строку «\n». После этого нам необходимо открыть файл , запереть его и записать туда нашу строку. Закрываем файл и сообщаем об успешном добавление комментария.

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

read.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php

$url="data.txt"; //путь до файл
$content = file($url);//Получаем массив строк

    for($i=0;$i<=count($content)-1;$i++) {//запускаем цикл
    list($name,$mail,$text) = explode("::",$content[$i]);//Разбиваем строку на нужные нам данные
    echo "<a href=\"mailto:$mail\">$name</a>
    <br/>$text<br/><br/>"
;//Выводим информацию в браузер
                                      }

?>

Данный скрипт читает файл при помощи функции file(); В итоге мы получаем массив, у которого элементами являются строки. Например $content[0] – первая строка (имя::e-mail::комментарий). Т.к. в файле в итоге строк будет много, нам необходимо посчитать количество элементов в массиве (строк), чтобы знать сколько раз будет работать цикл. Сделаем это при помощи функции count(); Далее запускаем цикл for и внутри цикла производим нужные нам действия.

Разбиваем строку на переменные list($name,$mail,$text) = explode(«::»,$content[$i]); В итоге получаем $name=имя, $mail=e-mail , $text=комментарий. Далее выводим данные в браузер при помощи echo «»;

Пример можно посмотреть тут.
Это пожалуй самый простой скрипт гостевой книги, который можно доработать самому .

Вариант 2. Гостевая книга на PHP с использование MySQL.

Данный вариант в качестве хранения записей будет использовать базу данных MySQL. Чтобы начать работать, нам необходимо создать таблицу, в которой будут храниться наши записи. Открываем phpmyadmin (http://127.0.0.1/phpmyadmin). В левом столбце по умолчанию мы видим список баз данных, среди них есть test (если конечно все тестируется на локальном сервере):

Если Вы хотите использовать скрипт уже на хостинге, то для начала убедитесь, есть ли поддержка MySQL в Вашем тарифном плане. Обычно при покупке хостинга Вам выдают данные от панели управления. В ней есть возможность создать базу данных. Если у Вас уже имеется какая то база данных, то просто при помощи phpmyadmin создайте в ней таблицу.

Теперь вернемся к локальному серверу. После выбора базы данных test, у вас появиться следующее окно:

Мы переходим во вкладку SQL, и вставляем в поле следующий запрос:

CREATE TABLE `test`.`gbook` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 20 ) NOT NULL ,
`email` VARCHAR( 40 ) NOT NULL ,
`text` VARCHAR( 300 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci

Нажимаем на кнопку Ок, и результат этого запроса будет следующий:

В левом столбце у нас появилась таблица gbook, в ней мы создали 4 поля:

  1. id – индетификатор записи
  2. name – имя посетителя
  3. email – адрес электронной почты
  4. text – текст комментария

Если вы работает с хостингом, то запрос для вас будет такой:

CREATE TABLE `gbook` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 20 ) NOT NULL ,
`email` VARCHAR( 40 ) NOT NULL ,
`text` VARCHAR( 300 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci

Создавая таблицу обязательно смотрите в какой БД вы её создаете. В локальной версии у нас БД – test , таблица с данными – gbook.

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

index.php

Оставляем без изменений

add.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$name = strip_tags(stripslashes(substr($_POST['data']['0'],0,20)));
$mail = strip_tags(stripslashes(substr($_POST['data']['1'],0,30)));
$text = strip_tags(stripslashes(substr($_POST['data']['2'],0,300)));

if($_POST['add'] != '') {
    if($name != '') {
        if($mail !='') {
            if($text != '') {

//Подключаемся к БД.
$db=@mysql_connect("localhost", "root", "pass") or die("Ошибка подключения");
@mysql_select_db("test", $db) or die("Не могу выбрать БД");
@mysql_query("SET NAMES UTF-8");

$query = "INSERT INTO gbook VALUES (NULL,
'"
.$name."',
'"
.$mail."',
'"
.$text."')";
if(mysql_query($query)) { echo "Запись <br/><a href=\"index.php\">добавлена</a>";}
 else {echo "Ошибка записи";};
 }
 else {echo "Введите коментарий";}
 }
 else {echo "Введите мэйл";}
 }
 else {
 echo "Введите имя";

 }
 }
 else {echo "<a href=\"index.php\">назад</a>";  };
?>

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

  • $db=@mysql_connect(«localhost», «root», «pass») or die(«Ошибка подключения»);- создает подключение к серверу баз данных mysql, если не получается то выводит сообщение об ошибке и останавливает программу.
  • @mysql_select_db(«test», $db) or die(«Не могу выбрать БД»); – выбирает нужную нам базу данных, в случае тестирования на локальном сервере, мы выбираем test, если не получается
    то выводим сообщение об ошибке и останавливает программу.
  • @mysql_query(«SET NAMES UTF-8″); - указываем кодировку

Далее следует запрос, при помощи которого помещаются данные в базу.

  • INSERT INTO gbook VALUES() – вставить в таблицу gbook значения;

Все значения пишуться через запятую. Первое значение NULL , оно соответствует первому полю нашей таблицы – id. Почему NULL? Потому что, когда мы создавали таблицу, то полю id дополнительно указали auto_increment, это позволит нам автоматически увеличивать значение в поле на одну единицу с появлением новой записи в таблице. Далее через запятую идут наши значения – имя, e-mail и текст комментария. Обратите что весь этот запрос мы присваемваем переменной $query.

Далее создаем условие:

1
2
if(mysql_query($query)) { echo "Запись
<a href="
\">добавлена</a>";}

Если запрос выполнен – выводим сообщение об успешном добавлении, иначе сообщение об ошибке.

read.php

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

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//Подключаемся к БД.
$db=mysql_connect("localhost", "root", "pass") or die("Ошибка подключения");
mysql_select_db("test", $db) or die("Не могу выбрать БД");
@mysql_query("SET NAMES UTF-8");
$q = mysql_query("SELECT * FROM gbook");

while($r = mysql_fetch_array($q)) {

echo "<a href=\"mailto:$r[email]\">$r[name]</a><br/> $r[text]<br/><br/>";
}
?>

Для начала подключаемся и выбираем нужную БД. После этого составляем запрос:

  • mysql_query(«SELECT * FROM gbook») – запрос («ВЫБРАТЬ * ИЗ gbook»), символ «*» означает полную выборку значений из таблицы.

Далее следует цикл while, внутри которого мы выводим всю информацию в браузер. Функция mysql_fetch_array(запрос), создает массив, ключами которого будут имена полей таблицы. В итоге мы получаем массив $r , в котором:
$r[id] – идентификатор
$r[name] – имя
$r[email] – адрес эл.почты
$r[text] – текст комментария

Теперь попробуйте протестировать этот вариант на локальном сервере.

Исходники

gbook.zip - в архиве два варианта.

Заключение

Оба вариант не претендуют на то чтобы вы их сразу же устанавливали к себе на сайт, т.к. их необходимо доработать. Оба варианта несут главный смысл – понять как работает механизмы чтения и записи, будь то файл или база данных. При изучении урока не торопитесь, лучше  проверьте все на несколько раз. Если возникнут вопросы по работе с базами данных, пишите в комментариях.

Google Bookmarks БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong
rss-лентаПодпишись на RSS, впереди много интересного.
Рубрика: уроки | Отзывов: 150

150 Responses to “Урок 5. Комментарии на сайте. Пишем гостевую книгу на PHP.”

Страниц: « 15 … 11 10 9 8 7 6 5 4 3 2 [1] Show All

  1. 10
    GlamNo Gravatar Says:

    НА хорошем и качественном хостинге есть всё! Ну как минимум MySQL ;)

  2. 9
    АлександрNo Gravatar Says:

    Сделаем, ожидайте в конце августа ;)

  3. 8
    ВсеволодNo Gravatar Says:

    2 Александр, а можете сделать урок, что-то на подобие «Регестрация и авторизация пользователей». И что-бы с mfpjq и без базы. Потому-что лично я пользуюсь удобным, качественным хостингом.. НО без MySql. Заранее спасибо.

  4. 7
    LightNo Gravatar Says:

    Не знаю, что делал, куда смотрел, но когда писал, забыл вставить тег перевода строки. Имел в виду вот так:

    1
    $text = ereg_replace("(\r?\n)+", "<br/>", $text);
  5. 6
    Урок 12. Спам фильтр. Фильтрация сообщений и комментариев. | Freshcoder.ru - уроки PHP Says:

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

  6. 5
    АлександрNo Gravatar Says:

    2 Light

    Спасибо вам за материал, кстати насчет str_replace() я в курсе, но почему то привел этот пример. За введение регулярного выражения вам огромный плюс =)

    Насчет бб-кода ничего немогу сказать, сам же использую плагин codecolorer для подсветки синтаксиса, чтобы подсветить код необходимо его оформит тэгами(я напишу по русски, а вы просто транслируйте на латиницу, т.к. парсер сьедает эти тэги)
    [цц ланг="пхп"]
    ваш код
    [/цц]

  7. 4
    LightNo Gravatar Says:

    Под авторизацией я имел в виду и админку, и запоминание в кукис данных пользователя…, но это уже навороты, так как рабочая гостевая может обойтись и без них.

    Теперь по поводу неудалённых тегов и другой обработки входящих данных. На самом деле, всё что с ними делается в add.php делается правильно, а вот в файл при таком коде, как сейчас, записываются необработанные данные полученные из суперглобальной переменной $_POST. А всё, что мы сделали при обработке, так и остаётся не востребованным в переменных $name, $mail и $text, поэтому после обработки, но до объединения через implode, надо записать в $data:
    $data = array($name,$mail,$text);
    А потом уже в $data можно записывать склейку $data = implode(«::»,$data);

    Совсем удалять \n и \r как то некрасиво в смысле форматирования текста, а оставить нельзя, так как у нас одна строка – одна запись, поэтому я сперва сделал две строчки $text = str_replace(«\r», «», $text); и то же самое для \n. В вашем совете стоит ereg_replace, но в спецификации пишется, что str_replace предпочтительнее, так как намного быстрее, а ereg_replace есть смысл применять только если используются регулярные выражения.
    Но в этом случае появляется два переноса, что тоже некрасиво. Можно заменять только \n, который присутствует и в Unix и в Windows, а \r удалять.
    В конце концов я остановился на ещё более лаконичном способе:
    $text = ereg_replace(«\r?\n», «», $text);
    (В регулярных выражениях, к которым я решил вернуться, «?» говорит, что предыдущий символ присутствует 1 или 0 раз)
    Через время разобрался чуть больше в этих регулярных выражениях и немного усовершенствовал конструкцию:
    $text = ereg_replace(«(\r?\n)+», «», $text);
    В таком виде серия из разрывов строк заменяется только на один

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

    P.S. заодно мелкий оффтоп. У вас в ответе пример красивый, с оформлением… Тут можно использовать bbcode или разрешены некоторые html теги?

  8. 3
    АлександрNo Gravatar Says:

    Да, я знаю. Спасибо за совет. Просто делал достаточно простой скрипт для примера, чтобы человек освоил этот материал. А для того чтобы резать символы можно сделать кое что интересное =), текст сообщения прогоняем через несколько функций ereg_replace(), а потом его пишем в файл

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Режем слеши
     $text = stripslashes($text);
    //Режем хтмл
     $text = htmlspecialchars($text);
    //Убираем символ новой строки
     $text = ereg_replace("\n", " ", $text);
    //Убираем символ новой строки (windows-формат)
     $text = ereg_replace("\r", "", $text);
    //Убираем символы открывающие любые тэги
     $text = ereg_replace("<", "", $text);
     $text = ereg_replace(">", "", $text);
    //Убираем символы похожие на сепаратор =)
     $text = ereg_replace("::", "", $text);

    Вот так можно избавиться от лишнего в тексте.

    P.S. Что вы имели ввиду под авторизацией? В админке или где?)

  9. 2
    LightNo Gravatar Says:

    Неплохая основа, но дорабатывать надо основательно и я не имею в виду дизайн или авторизацию.
    В первую очередь сделать удаление разделителей из собщений. Иначе простое совпадение может всё покорёжить.
    Потом, комментарии из текстового файла читаются построчно. Значит и сохранять их надо также, а сейчас перевод строки не удаляется и одно сообщение из нескольких строк превращается в несколько сообщений.
    В связи с этим вопрос. Какой функцией можно удалять произвольные символы?

    Что-то не работает удаление тегов. Думал, что у меня эта функция не поддерживается, создал простой пример, проверил – работает.
    У вас на сайте, кстати, тоже не работает. Посмотрите http://freshcoder.ru/example/5/index.php
    В последнем сообщении теги не были удалены.

  10. 1
    Урок 7. Массивы в PHP. | Freshcoder.ru - уроки PHP Says:

    [...] уроках мы уже сталкивались с массивами, это была гостевая книга, которая читала строки файла в массив, после чего [...]

Страниц: « 15 … 11 10 9 8 7 6 5 4 3 2 [1] Show All

Leave a Reply