Сегодня расскажу вам о том, как написать гостевую книгу на PHP и MySQL. Ничего сложного в этом нет, да и возможности данной гостевой не самые большие: постраничный вывод записей, проверка вводимых данных, возможность удалять записи.
Допустим, что у вас уже есть PHP, MySQL и веб-сервер. Вы всё установили и настроили.
Начнём с создания таблицы, в которой будут храниться данные нашей гостевой книги. Будем спрашивать у пользователя имя и комментарий. При желании пользователь сможет сообщить адреса электронной почты и домашней странички. Для администрирования книги нам понадобится ещё одно поле, уникальное для каждой записи, - идентификатор. Ну и дата, конечно. В итоге получается такая таблица:
CREATE TABLE gb ( id int(10) unsigned NOT NULL auto_increment, datetime datetime DEFAULT 0000-00-00 00:00:00 NOT NULL, name varchar(100) NOT NULL, email varchar(100), www varchar(100), message text NOT NULL, PRIMARY KEY (id) );
Таблица у нас есть. Теперь можно приступать к программированию.
Для создадим файл с настройками гостевой книги:
<?php // общие константы define(PATH, /gb/); // путь к гостевой книге define(RECSPERPAGE, 10); // количество записей на одной странице define(ADMIN_EMAIL, artem@sapegin.ru); // email администратора define(ERROR_LOG_FILE, logs/error.log); // файл лога ошибок
// Параметры БД define(DBHOST, localhost); // имя хоста define(DBUSER, root); // имя пользователя define(DBPASSWD, ); // пароль define(DBNAME, test); // имя базы данных ?>
Теперь подумаем, какие вспомогательные функции нам понадобятся. На нужно будет взаимодействовать с СУБД, проверят и обрабатывать вводимые пользователем данные. Так же для функций администрирования на понадобится отличать администратора от простых пользователей.
Начнём с работы с СУБД.
<?php /** recource db_connect ( string host, string user, string passwd, string dbname ) * Подключение к СУБД и открытие базы данных */ function db_connect($host, $user, $passwd, $dbname) { $link = mysql_pconnect($host, $user, $passwd) or die(Could not connect to database); mysql_select_db($dbname) or die(Could not select database); return $link; }
/** Выполняет запрос к БД * * @param текст запроса * @return resource id */ function db_query($query) { $result = mysql_query($query) or die(Bad database query); return $result; }
/** Выполняет запрос к БД (placeholder) * * @param текст запроса * @param* * @return resource id */ function db_query_ex($query) { $values = func_get_args(); array_shift($values); $i = 0; return db_query(preg_replace(%?%e, .addslashes($values[$i++])., $query)); } ?>
Обработка строк (проверка и фильтрация вводимых пользователем данных).
<?php /** * Проверяет является ли строка адресом e-mail */ function strings_isemail($string) { return preg_match(%[-.w]+@[-w]+(?:.[-w]+)+%, $string); }
/** * Добавление ссылок на http и e-mail */ function strings_addlinks($string) { return preg_replace( %((?:httpftp)://[-w]+(?:.[-w]+)+b[-w:@&?=+,!/~*$.%]*)(?<![.,?!)])%i, <a href=\1>\1<a>, $string ); }
Написание аутентификации администратора я оставляю вам в качестве домашнего задания. Есть достаточно много способов и их обсуждение - тема отдельной статьи. Я приведу лишь функцию-заглушку:
<?php /** * Проверка: администратор или обычный пользователь */ function auth_is_admin() { return @$_GET[admin]; } ?>
Далее идёт достаточно большой модуль, в котором содержится почти весь HTML-код гостевой книги, - шаблон. В нём нет ничего сложного и его написание можно вполне под силу верстальщику сайта, если у вас таковой имеется.
/** * форма добавления новой записи */ function template_form($name, $email, $www, $message, $error) { // вывод сообщения об ошибке function error($error) { if($error) echo <br><font color=#880000>.$error. </font>; }
/** * печать одной записи гостевой книги */ function template_show_body($id, $name, $email, $www, $message, $datetime) { $out = <div class=c><div class=cn><b>.$name.</b>; // если есть email или homepage - печатаем их if($email $www) { $out .= ( ; if($email) $out .= <a href=mailto:.$email.>email</a>; if($email && $www) $out .= ; if($www) $out .= <a href=.$www.>www</a>; $out .= ); } $out .= пишет .$datetime.:</div>.$message.</div>; // если гостевую книгу просматривает администратор - печатаем кнопку // удаления записи if(auth_is_admin()) { $out .= <div class=c>[ <a href=.PATH.?admin=1&del=.$id. >удалить</a> ]</div>; }
return $out; }
?>
И вот, мы наконец-то дошли до главного. До модуля гостевой книги. Постараюсь написать побольше комментариев, чтобы вам было понятно.
<?php /** * Создание таблицы, если её ещё нет */ function gb_install() { db_query( CREATE TABLE IF NOT EXISTS gb ( id int(10) unsigned NOT NULL auto_increment, datetime datetime NOT NULL default 0000-00-00 00:00:00, name varchar(100) NOT NULL default , email varchar(100) default NULL, www varchar(100) default NULL, message text NOT NULL, PRIMARY KEY (id), INDEX (datetime) ) TYPE=MyISAM; ); }
/** * Добавление записи в гостевую книгу */ function gb_add($name, $email, $www, $message, &$error) { // проверяем правильность заполнения полей $error = ; if(empty($name)) $error[name] = Это обязательное поле; if(empty($message)) $error[message] = Это обязательное поле; if(!empty($email) && !strings_isemail($email)) $error[email] = Это не email;
// если пользователь поленился написать http:// перед адресом - сделаем // это за него if(!empty($www) && http:// != substr($www, 0, 7)) $www = http://.$www;
// запрос на добавление записи в базу данных db_query_ex(INSERT INTO gb (name, email, www, message, datetime) VALUES(?, ?, ?, ?, NOW()), $name, $email, $www, $message); // перекидываем браузер на первую страницу // это нужно, чтобы, если пользователь нажмет кнопку Refresh, // запись не добавилась еще раз header(Location: .PATH.?page=1); } }
// удаление записи из гостевой книги function gb_delete($id) { // запрос на удаление записи из базы данных // WHERE id = .$id указывает на запись, которую следует удалить db_query_ex(DELETE FROM gb WHERE id = ?, $id); header(Location: .PATH.?page=1); // ??? }
// вывод страницы с записями function gb_show($page) { // положение первой записи страницы $begin = ($page - 1) * 10; // выборка записей из базы данных // SELECT * FROM gb - все поля из бд gb // ORDER BY datetime DESC - сортировка по дате, новые сверху // LIMIT .$begin.,.RECSPERPAGE - ограничение: // RECSPERPAGE (см. defines.php) записей начиная с $begin $result = db_query(SELECT * FROM gb ORDER BY datetime DESC LIMIT . $begin., .RECSPERPAGE); $out = ;
// цикл по всем выбранным записям while($row = mysql_fetch_array($result)) $out .= template_show_body($row[id], $row[name], $row[email], $row[www], $row[message], $row[datetime]);
// уничтожаем результат mysql_free_result($result);
echo $out; }
// вывод списка страниц function gb_showpages($current) { // узнаем число записей в гостевой книге $result = db_query(SELECT * FROM gb); $rows = mysql_num_rows($result); if($rows) { $pages = ceil($rows / RECSPERPAGE);