Веб-дизайн и поисковая оптимизация. PHP скрипты Неосновательный guest book html

Недавно получил письмо на email с просьбой помочь разобраться со скриптом гостевой книги или книги отзывов. Поэтому выполняю свое обещание и сегодняшняя статья будет именно на эту тему.

Что такое гостевая книга и зачем она вообще нужна на сайте?

Гостевая книга — это своего рода книга жалоб или пожеланий, где любой посетитель Вашего сайта может оставить свое сообщение, которое (в случае одобрения админом) смогут прочитать все желающие. Т.е. это самые обычные комментарии, только не к отдельной заметки, а к целому сайту!

Гостевая книга добавляет интерактивность на Ваш сайт и является распространенным способом обратной связи.

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

CREATE TABLE IF NOT EXISTS `guestbook` (`id` int(11) NOT NULL auto_increment, `user_ip` int(10) unsigned NOT NULL, `user_email` varchar(50) NOT NULL, `addtime` int(11) NOT NULL, `name` varchar(15) NOT NULL, `text` text NOT NULL, `admin_text` text NOT NULL, `image` varchar(40) NOT NULL, `sex` tinyint(1) NOT NULL default "1", PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

  • id — порядковый номер сообщения
  • user_ip — IP-адрес пользователя, представленный в виде целого цисла
  • user_email — email-адрес пользователя
  • addtime — время добавления сообщения
  • name - имя пользователя
  • text — текст сообщения
  • admin_text — текст ответа администратора на сообщение
  • image — аватар пользователя
  • sex — пол пользователя (мужской/женский)

Как Вы видите в табличке есть поле для IP-адреса пользователя. Это делается для того, чтобы можно было потом сделать черный список, куда можно заносить IP-адреса «не хороших» пользователей, которые в дальнейшем не смогут оставлять сообщения.

Поле sex нужно для того, чтобы выводить «правильный» аватар, в случае, когда пользователей не загрузит свой.

С базой данных разобрались. Переходим к программированию. Так как мы работаем с базой данных, то первым делом создадим самый простой класс для работы с базой данных. Для этого создадим файл DB.class.php и поместим туда следующий код:

Class DB { private static $instance; private $MySQLi; private function __construct(array $dbOptions){ $this->MySQLi = @ new mysqli($dbOptions["db_host"],$dbOptions["db_user"], $dbOptions["db_pass"],$dbOptions["db_name"]); if (mysqli_connect_errno()) { throw new Exception("Ошибка базы данных."); } $this->MySQLi->set_charset("utf8"); } public static function init(array $dbOptions){ if(self::$instance instanceof self){ return false; } self::$instance = new self($dbOptions); } public static function getMySQLiObject(){ return self::$instance->MySQLi; } public static function query($q){ return self::$instance->MySQLi->query($q); } public static function esc($str){ return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str)); } }

Стоит сказать, что конструктор этого класса объявлен как private, таким образом, объект не может быть создан вне пределов класса, и инициализация возможна только из статического метода init(). Он берет массив с параметрами соединения с MySQL и создает экземпляр класса, который содержится в статической переменной self::$instance. Таким образом, обеспечивается существование единственного соединения с базой данных в конкретный момент времени.

Остальная часть класса, выполняет запросы к базе данных, на основе статического метода query().

При желании Вы можете доработать этот класс, так как Вам это нужно!

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

Теперь мы плавно подошли к самому главному файлу в нашем скрипте — index.php. Именно здесь и будет выполняться вся логика скрипта.

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

Session_start(); /* Конфигурация базы данных. Добавьте свои данные */ $dbOptions = array("db_host" => "localhost", "db_user" => "", "db_pass" => "", "db_name" => ""); //Подключаем класс для работы с базой данных require "DB.class.php" //Подключаем вспомогательные функции require "helper.php" // Соединение с базой данных DB::init($dbOptions); $appath = realpath(dirname(__FILE__))."/"; //Папка на сервере, куда будут загружаться аватарки $uploaddir = "images/avatars"; //Максимальное число сообщений на одной странице $per_page = 10; //Число страниц в пейджинге $num_page = 2;

Для построения навигации по страницам в гостевой книге, необходимо узнать общее число сообщений. Это можно сделать так:

//Получаем общее число сообщений $result = DB::query("SELECT COUNT(*) AS numrows FROM guestbook"); $total = $result->fetch_object()->numrows;

Теперь определим номер страницы, которую необходимо показать. Для этого обработаем переменную $_GET["p"]

$start_row = (!empty($_GET["p"]))? intval($_GET["p"]): 0; if($start_row < 0) $start_row = 0; if($start_row > $total) $start_row = $total;

$result = DB::query("SELECT * FROM guestbook ORDER BY addtime DESC LIMIT ".$start_row.",".$per_page); //Здесь будет храниться список сообщений $items = array(); while($row = $result->fetch_assoc()){ $row["addtime"] = format_date($row["addtime"],"date")."|".format_date($row["addtime"],"time"); $items = $row; }

Здесь я использовал функцию format_date() для работы с датой и временем, которую я создал в файле helper.php. Основная её задача — это вывод даты и времени в русском формате. Вот ее код:

Function format_date($date,$format = "date"){ if(empty($date)) return ""; $months = array("1" => "января", "2" => "февраля", "3" => "марта", "4" => "апреля", "5" => "мая", "6" => "июня", "7" => "июля", "8" => "августа", "9" => "сентября", "10" => "октября", "11" => "ноября", "12" => "декабря"); if($format == "time"){ return date("H:i",$date); } elseif($format == "date"){ $m = date("n", $date); $m = $months[$m]; $d = date("j",$date); $y = date("Y",$date); return $d." ".$m." ".$y; } else{ return date("d.M.Y H:i",$date); } }

Данная функция имеет всего 2 параметра:

  • $date — дата в формате UNIX (количество секунд пройденных с ночи 1-ого января 1970 - ого года)
  • $format — форма вывода даты.

Теперь мы можешь вывести список сообщений на странице. Для этого я использую следующий html-код:

Гостевая книга Отзывы оставить отзыв