-
Урок 5. Комментарии на сайте. Пишем гостевую книгу на PHP.
Июнь 28th, 2008 149 КомментариевВведение
При создании сайта зачастую преследуется одна основная цель. Эта цель – донесение до посетителя нужной информации. Когда ваш сайт станет достаточно посещаем и информации становиться все больше, вам необходимо отсеять нужную, и знать какая наиболее интересна пользователю.
Чтобы узнать рейтинг какой либо статьи мы можем использовать предыдущий урок, который описывает принцип сбора статистики на сайте, но сейчас вопрос стоит в том , чтобы дать пользователю выразить свое мнение, написать комментарий или просто дать возможность оставить отзыв в гостевой книге.
В этом уроке мы рассмотрим скрипт гостевой книги , которая в принципе подойдет и для скрипта добавления комментария. В качестве примера будет приведен пример гостевой книги на текстовых файлах и с использование БД MySQL. Также это будет маленький урок по MySQL.
Детали
В предыдущих уроках мы рассмотрели работу с файлами(счетчики) и авторизацию на сайте. Все это нам пригодиться в этом уроке. Чтобы написать скрипт нам необходимо освоить:
- циклы в PHP
- массивы в PHP
- функции работы с файлами
- БД MySQL
Вариант 1.Гостевая книга на PHP с использованием текстовых файлов
index.php
[cc lang="php"]
[/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 поля:
- id – индетификатор записи
- name – имя посетителя
- email – адрес электронной почты
- 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 - в архиве два варианта.
Заключение
Оба вариант не претендуют на то чтобы вы их сразу же устанавливали к себе на сайт, т.к. их необходимо доработать. Оба варианта несут главный смысл – понять как работает механизмы чтения и записи, будь то файл или база данных. При изучении урока не торопитесь, лучше проверьте все на несколько раз. Если возникнут вопросы по работе с базами данных, пишите в комментариях.
Подпишись на RSS, впереди много интересного.149 Responses to “Урок 5. Комментарии на сайте. Пишем гостевую книгу на PHP.”
Страницы: « 15 … 14 13 12 11 10 [9] 8 7 6 5 4 … 1 » Show All
Страницы: « 15 … 14 13 12 11 10 [9] 8 7 6 5 4 … 1 » Show All
Leave a Reply








Июнь 15th, 2009 at 15:59
Спасибо за уроки!
Александр, подскажите пожалуйста, как после добавления комментария автоматически перейти на начальную (и вообще на другую) страницу?
Июнь 12th, 2009 at 16:02
Здравствуйте, подскажите пожалуйста, при удачном добавлении записи в таблицу открывается страница /add.php, если обновить эту страницу, то в таблице появится запись идентичная предыдущей, как этого избежать? Зарание благодарен за ответ, и с праздником!
Июнь 8th, 2009 at 20:31
Ну вы попробуйте сделать защиту самостоятельно, для начала попробуйте такие функции как addslashes, trim, htmlspecialchars,strip_tags . Используйте документацию и у вас все получиться.
Июнь 7th, 2009 at 21:11
http://freshcoder.ru/example/5/index.php – теперь не пашет(((
Кривым кодом убились комментарии…. Надо что-то делать!
Май 23rd, 2009 at 03:09
Здравствуйте. я не знаю php, поэтому использую скрипт представленный в этом уроке (5). Он конечно очень удобный (очень долго я искал в инете что нить такое), но в нём есть большая проблема – он не фильтрует содержание на предмет
- ссылок (желательно чтоб они были не кликабельными)
- скриптов
- слешей
и всяких других хитростей.
Вы написали дополнение для $text, но я не понял куда его вставлять, в моих вариантах вставки разницы с ним и без него я не заметил.
обновите пожалуйста листинг (уже с работающей фильтрацией) по ссылке “http://www.freshcoder.ru/example/5/gbook_freshcoder.ru.zip”
спасибо.
(помогите пожалуйста, а то меня замучали спамить и вставлять скрипты)
Май 17th, 2009 at 22:35
Спасибо…по двум урокам уже сделала две полезные штукоины-гостевую и вывод таблицы из MySQL…мне очень помогло!!!
Май 12th, 2009 at 15:49
if (mysql_query(“INSERT INTO clients VALUES (NULL, ‘”.$mail.”‘, ‘”.$login.”,’”.$pass.”‘)”)) {echo “You’ve successfuly registred!”;}
else {echo “Can’t registrate”;};
Почему то не удается исполнить этот запрос. подскажите. что здесь не так
Апрель 19th, 2009 at 15:41
Как сделать так что бы комментарии отображались сразу на той же странице где размещена форма(как здесь), а не открывались на новой странице?
Апрель 16th, 2009 at 07:04
Да, Вы на правильном пути. Для того чтобы выбрать запись начиная с определенного ряда используйте в запросе LIMIT
Апрель 14th, 2009 at 18:46
Моя идея:
Кол-во записей на странице=10.
Поделить общее кол-во записей в базе на 10, получим кол-во страниц всего.
И в цикле сформировать ссылки на данные страницы. При нажатии на ссылку передается 1 параметр (условия отбора из базы): номер первой для этой страницы записи.
На правильном пути?