PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
Рис. 7 Содержание тестового сайта news.
Рис. 8. Содержание папки chat сайта news.
Комментарии без смайлов, как-то не интересно. Поэтому добавим праздника. Смайлов. Для этого в папке «say» создаем подпапку «smiles» в которую загружаем набор смайлов. В этом модуле загружен набор «Колобки» в формате GIF. Вы можете загрузить любые другие смайлы. Папка «smiles» будет проверяться на наличие изображений при первом запуске модуля и в случае если в ней будут обнаружены изображения, то они автоматически будут обработаны в качестве смайлов.
Рис. 9. Содержимое папки smiles.
На рисунке 7 представлена структура тестового сайта на данном этапе.
Рис. 10. Содержание тестового сайта news.
Таким образом, у нас получился рабочий тестовый сайт с размещенным на нем модулем комментариев с набором смайлов.
База данных
Теперь необходимо определиться для чего нам нужна база данных (далее БД), с ее системой управления и с тем, что в ней будет храниться. Я выбрал систему управления БД MySQl. Во-первых потому что ранее уже приходилось с ней работать, во-вторых, это самая распространенная на сегодня БД и на нее есть огромное количество справочной информации. Итак: MySQl – система управления реляционными, т.е. представленными в виде таблиц, базами данных (далее СУБД). Что в ней хранить?
В контексте задачи храниться будут:
Комментарии.
Ответы на комментарии.
Данные пользователей.
Данные о странице на которой размещаются комментарии.
Смайлы (без смайлов я комментарии не представляю).
При создании таблиц используем правило: каждый объект должен располагаться в отдельной таблице.
Объекты будут следующие: комментарии, ответы на комментарии, пользователи, права пользователей, смайлы. Еще одна таблица будет связывать права пользователя с данными в других таблицах.
Для хранения комментариев создаем таблицу «say». Таблица будет содержать следующую информацию о комментарии:
id – уникальный номер комментария;
saytext – текст комментария;
userid – идентификатор пользователя;
page_id – идентификатор страницы;
saydate – дата добавления комментария;
Для ответов на комментарии создаем таблицу «reply». Таблица будет содержать следующую информацию.
id – уникальный номер ответа на комментарий;
replytext – текст комментария;
userid – идентификатор пользователя;
replyid – идентификатор комментария;
saydate – дата добавления комментария;
Мне кажется в этих двух таблицах все понятно, вопросов быть не должно.
Для администрирования создаем три таблицы: «users», «authorrole», «role».
Таблица «users», будет содержать следующие данные:
id – уникальный номер пользователя;
login – логин пользователя;
password – пароль пользователя;
email – адрес электронной почты пользователя;
img – адрес расположения аватара пользователя;
activation – проверка активации пользователя;
date – дата регистрации пользователя.
Для идентификации автора комментария, поле «id» таблицы «users» будет в запросах к бд связываться с полем «userid» таблиц «say» и «reply»
Таблица «role» будет содержать следующие данные:
id – роль (права) пользователя;
description – описание прав пользователя;
Таблица «authorrole» – промежуточная и будет содержать следующие данные:
authorid – id пользователя;
roleid – роль (права) пользователя;
Таблица «authorrole» связывает пользователей «users» и их права «role»
Для смайлов создаем таблицу «smiles». Таблица будет содержать следующие данные:
id – id смайла;
smile – условное обозначение смайла;
path – путь к смайлу.
Пишем файл, создающий базу данных и необходимые таблицы. Назовем этот файл «createbase.php» и разместим в папке «admin». Сохраняем в формате php.
Листинг 4. createbase.php Путь: news/admin/createbase.php
<?php
error_reporting(E_ALL);//включаем вывод ошибок
/* 1. Создаем переменные подключения */
$host = "localhost"; /* Имя хоста */
$root = "root"; /* Имя пользователя БД */
$root_password = ""; /* Пароль к БД */
$db = "beseder"; /* название БД */
/* 2. Создаем базу данных */
try {
$dsn = new PDO("mysql:host=$host", $root, $root_password);
$dsn->exec("CREATE DATABASE IF NOT EXISTS `$db` CHARACTER SET utf8 COLLATE utf8_general_ci;");
echo 'База создана (OK!)<br>' . ' Имя БД: ' . '<b>' . $db . '</b>' . '<br> Пользователь: ' . '<b>' . $root . '</b>';
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка при создании базы');
}
$dsn = null;//обнуляем подключение
/* 3. Формируем запросы для создания таблиц */
try {
$dsn=newPDO("mysql:host=$host;dbname=$db",$root,root_password);//подключаемся к созданной БД
$dsn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/* Нумерация страниц */
$sql_page = "CREATE TABLE IF NOT EXISTS page (
id INT(11) AUTO_INCREMENT PRIMARY KEY NOT NULL,
sayid int(11),
userid int(11),
pageid text
)";
//пользователи
$sql_users = "CREATE TABLE IF NOT EXISTS users (
id int(11) AUTO_INCREMENT PRIMARY KEY NOT NULL,
login VARCHAR(15) NOT NULL,
password VARCHAR(256) NOT NULL,
youtext text NOT NULL,
email text NOT NULL,
img text NOT NULL,
activation int(11),
date int(11)
)";
//роль автора определение
$sql_role = "CREATE TABLE IF NOT EXISTS role (
id VARCHAR(255) NOT NULL PRIMARY KEY,
description VARCHAR(255)
)
DEFAULT CHARACTER SET utf8 ENGINE=InnoDB";
//роль автора id
$sql_authorrole = "CREATE TABLE IF NOT EXISTS authorrole (
authorid INT NOT NULL,
roleid VARCHAR(255) NOT NULL,
PRIMARY KEY (authorid, roleid)
)
DEFAULT CHARACTER SET utf8 ENGINE=InnoDB";
$sql_roledesc = "REPLACE INTO role (id, description) VALUES
('user', 'Контроль своих комментариев'),
('admin', 'Full control'),
('Site Administrator', 'Контроль комментариев')";
$sql_userole = "REPLACE INTO authorrole (authorid, roleid) VALUES
(1, 'admin')";
/* Для комментариев */
$sql_say = "CREATE TABLE IF NOT EXISTS say (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
saytext TEXT,
userid int(11),
saydate int(11)
) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB";
/* Для ответов на комментарии */
$sql_reply = "CREATE TABLE IF NOT EXISTS reply (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
replytext TEXT,
userid int(11),
replyid int(11),
replydate int(11)
) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB";
/* 4. Создаем таблицы */
$dsn->exec($sql_users);
$dsn->exec($sql_authorrole);
$dsn->exec($sql_role);
$dsn->exec($sql_roledesc);
$dsn->exec($sql_userole);
$dsn->exec($sql_say);
$dsn->exec($sql_page);
$dsn->exec($sql_reply);
} catch (PDOException $e) {
echo $e->getMessage();
}
/* 5. Смайлы */
try {
$sql_smile = "CREATE TABLE IF NOT EXISTS smiles (
id INT(11) AUTO_INCREMENT PRIMARY KEY NOT NULL,
smile text,
path text)";
$dsn->exec($sql_smile);
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
$dir = $_SERVER['DOCUMENT_ROOT'].'/chat/say/smiles/';//строим путь к папке smiles
$files1 = preg_grep('~.(jpeg|jpg|png|gif)$~', scandir($dir));//делаем массив из картинок в папке smiles
try {
$sql = 'INSERT INTO smiles SET
smile = :smile,
path = :path';
$s = $dsn->prepare($sql);
foreach ($files1 as $val) {
$smile = pathinfo($val, PATHINFO_FILENAME); //получаем путь