программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 5. Комментарии на сайте. Пишем гостевую книгу на PHP.

    Июнь 28th, 2008 Александр 149 Комментариев

    Введение

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

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

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

    Детали

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

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

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

    index.php
    [cc lang="php"]





    Имя:


    e-mail:








    [/cc]

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

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

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

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

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

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

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

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

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

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

    read.php
    [cc lang="php"]

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

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

    $text

    “;//Выводим информацию в браузер
    }

    ?>
    [/cc]

    Данный скрипт читает файл при помощи функции 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
    [cc lang="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 "Запись
    добавлена“;}
    else {echo “Ошибка записи”;};
    }
    else {echo “Введите коментарий”;}
    }
    else {echo “Введите мэйл”;}
    }
    else {
    echo “Введите имя”;

    }
    }
    else {echo “назад“; };
    ?>
    [/cc]

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

    • $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.

    Далее создаем условие:
    [cc lang="php"]
    if(mysql_query($query)) { echo “Запись
    добавлена“;}
    [/cc]

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

    read.php

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

    [cc lang="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 "$r[name]
    $r[text]

    “;
    }
    ?>
    [/cc]
    Для начала подключаемся и выбираем нужную БД. После этого составляем запрос:

    • 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, впереди много интересного.

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

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

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

    2. 2
      LightNo Gravatar Says:

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

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

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