Возможности данной гостевой не самые большие: постраничный вывод записей, проверка вводимых данных, возможность удалять записи.
Допустим, что у вас уже есть 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) );
Таблица у нас есть. Теперь можно приступать к программированию.
Для создадим файл с настройками гостевой книги:
// общие константы 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'); // имя базы данных ?>
Теперь подумаем, какие вспомогательные функции нам понадобятся. На нужно будет взаимодействовать с СУБД, проверят и обрабатывать вводимые пользователем данные. Так же для функций администрирования на понадобится отличать администратора от простых пользователей.
Начнём с работы с СУБД.
/** 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)); } ?>
Обработка строк (проверка и фильтрация вводимых пользователем данных).
/** * Проверяет является ли строка адресом e-mail */ function strings_isemail($string) { return preg_match('%[-.w]+@[-w]+(?:.[-w]+)+%', $string); }
/** * Добавление ссылок на http и e-mail */ function strings_addlinks($string) { return preg_replace( '%((?:http|ftp)://[-w]+(?:.[-w]+)+[-w:@&?=+,!/~*$.'\%]*)(?'1', $string ); }
Написание аутентификации администратора я оставляю вам в качестве домашнего задания. Есть достаточно много способов и их обсуждение - тема отдельной статьи. Я приведу лишь функцию-заглушку:
/** * Проверка: администратор или обычный пользователь */ function auth_is_admin() { return @$_GET['admin']; } ?>
Далее идёт достаточно большой модуль, в котором содержится почти весь HTML-код гостевой книги, - шаблон. В нём нет ничего сложного и его написание можно вполне под силу верстальщику сайта, если у вас таковой имеется.
/** * заголовок страницы */ function template_header($page) { ?>
/** * форма добавления новой записи */ function template_form($name, $email, $www, $message, $error) { // вывод сообщения об ошибке function error($error) { if($error) echo ' '.$error. ''; }
/** * печать одной записи гостевой книги */ function template_show_body($id, $name, $email, $www, $message, $datetime) { $out = '
'.$name.''; // если есть email или homepage - печатаем их if($email || $www) { $out .= '( '; if($email) $out .= ' email'; if($email && $www) $out .= ' | '; if($www) $out .= ' www'; $out .= ' )'; } $out .= ' пишет '.$datetime.':
'.$message.'
'; // если гостевую книгу просматривает администратор - печатаем кнопку // удаления записи if(auth_is_admin()) { $out .= '
[ '>удалить ]
'; }
return $out; }
?>
И вот, мы наконец-то дошли до главного. До модуля гостевой книги. Постараюсь написать побольше комментариев, чтобы вам было понятно.
/** * Создание таблицы, если её ещё нет */ 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);
// печатаем ссылки на страницы (номер текущей страницы не является ссылкой) echo '