PHP. Разработка модуля комментариев для сайта

Дмитрий Приходько, 2021

В книге рассмотрен вариант разработки модуля комментариев для сайта на чистом языке php в процедурном стиле.

Оглавление

3. Создание тестового сайта

Ну, что ж приступим. Для упрощения разработки модуля на этапе разработки, воспользуемся не готовым шаблоном, а создадим свой простейший сайт одностраничник. Для этого переходим в папку с установленным «Open Server». По умолчанию она находится по пути: C:\OSPanel. Далее переходим в папку «domains» и создаем там тестовый отладочный сайт. Для этого создадим в папке «domains» подпапку. Название выбирайте какое хотите. Название этой папки будет именем вашего сайта. Я назвал её news. Затем открываем редактор и создаем в нем текстовый документ со следующим кодом:

Листинг 2. index.html Путь: news/index.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport"content="width=device-width, initial-scale=1.0">

<title>Test site</title>

</head>

<body>

<p>Значимость этих проблем настолько очевидна, что начало повседневной работы по формированию позиции способствует подготовке и реализации новых предложений!

Значимость этих проблем настолько очевидна, что повышение уровня гражданского сознания влечет за собой процесс внедрения и модернизации модели развития. Практический опыт показывает, что рамки и место обучения кадров способствует повышению актуальности соответствующих условий активизации.</p>

</body>

</html>

Сохраняем файл в папке news как index.html. Теперь у нас есть стартовая страница тестового сайта. В тегах <p> содержится обычный текст заглушка. Стили к данной странице применять не будем.

Запускаем «Open Server». В разделе мои сайты должен появиться новый сайт news. Запускаем его. Если все сделано правильно, в браузере должен появиться сайт «news» и на нем текст заглушка.

Так как дальнейшая работа предполагает работу с PHP, создаем в редакторе в этой же папке «news» файл.htaccess со следующим содержимым

Листинг 3..htaccess Путь: news/.htaccess

#Включаем обработку php в html файлах

AddType application/x-httpd-php.php.htm.html

#Устанавливаем кодировку по умолчанию

AddDefaultCharset utf-8

Сохраняем в корне сайта, т.е. в папке «news».

При сохранении в меню «Файл» выбрать «Сохранить как».

В выпадающем списке «Тип файла» выбрать «Все файлы».

Ввести в качестве имени.htaccess.

Нажать на кнопку «Сохранить».

Файл.htaccess (англ. hypertext access) используется для настройки веб-сервера на котором хранится сайт пользователя. А меняя настройку веб-сервера, мы влияем на работу сайта. В данном случае серверу дается команда обрабатывать PHP код в HTML документах и устанавливать по умолчанию кодировку «UTF-8»

Создаем папку модуля комментариев. Ее можно создать в любом месте, но разместить в корне сайта. Назовем папку «chat». В этой папке создадим две подпапки:

admin — для файлов администрирования;

say — для файлов управления комментариями.

В этой же папке chat создадим файл style.css для того чтобы настраивать внешний вид элементов модуля. Пока этот файл будет пустой. Должно получиться как на рис. 7, 8.

Рис. 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); //получаем путь к смайлу

$smile = str_replace($smile,":$smile:", $smile); //делаем условное обозначение смайла

$path = '/chat/say/smiles/'.$val;//строим наш путь к смайлу

$s->bindValue(':smile', $smile);

$s->bindValue(':path', $path);

$s->execute();

}

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit();

}

echo '<br>'.'Все таблицы успешно созданы';

В этом файле мы сначала включаем вывод всех сообщений об ошибках кодом: error_reporting(E_ALL). Это необходимо на этапе разработки, чтобы иметь возможность сразу выявлять и обрабатывать ошибки. После отладки всего приложения данную строку необходимо будет или удалить или закомментировать.

Затем подключаемся к СУБД MySQL. Для подключения необходимы следующие параметры:

Имя хоста: $host ="localhost";

Имя пользователя СУБД: $root ="root";

Пароль к СУБД: $root_password ="";

Для подключения к БД:

Название БД: $db ="beseder",

Первые три значения по умолчанию. На реальном сайте предоставляются «хостером». Четвертый параметр это название для создаваемой новой базы данных. В ней будут хранится комментарии, ее название придумывается самостоятельно. У меня БД названа «beseder».

Далее подключаемся к СУБД MySQL при помощи PDO (PHP Data Objects), PDO определяет интерфейс для доступа к базам данных в PHP[manual]. Подключение выполняется согласно мануала PDO с явным перехватом ошибок в блоке catch[7].

Внимание! далее все подключения к бд будут выполнятся только с использованием блоков try и Catch

При успешном создании БД выводится сообщение: 'База создана (OK!)Имя базы $db’. После создания базы закрываем подключение.

Снова открываем подключение, но теперь коннектимся не к СУБД, а к созданной БД. Создаем и затем выполняем SQL запросы на создание таблиц.

Типы полей для хранения данных принимаем следующие:

— для чисел «int»;

— для текста «text»;

— для коротких строк «varchar».

Смайлы, выделены в отдельный блок. Принцип работы следующий, проверяем папку «smiles» на наличие картинок:

$files1 = preg_grep('~\.(jpeg jpg png gif)$~', scandir($dir));

где preg_grep возвращает массив, состоящий из элементов входящего массива, которые соответствуют заданному шаблону, в данном случае из папки «smiles» возвращаются только «картинки».

Создаем в цикле условные обозначения для смайлов:

$smile = pathinfo($val, PATHINFO_FILENAME);

$smile = str_replace($smile,":$smile:", $smile);

где pathinfo — возвращает информацию о пути к файлу,

str_replace (что меняем, на что меняем, где меняем) — заменяет все вхождения строки поиска на строку замены;

и строим пути к картинкам:

$path = '/say/smile/'.$val;

При успешном завершении кода выводим сообщение:

echo '<br>'.'Все таблицы успешно созданы';

Запускаем сайт. Добавляем после «news» в адресную строку /chat/admin/createbase.php. Обновляем страницу. Должно получиться следующее.

Рис. 11 Результат работы файла createbase.php

Заходим в phpMyAdmin и проверяем. В списке БД должна появится новая база «beseder».

phpMyAdmin находится на вкладке «дополнительно» «Open Server».

Рис. 12. Проверяем наличие созданной БД

Файл работает. Для интереса, можете посмотреть, какие таблицы созданы.

На данном этапе БД не нужна, поэтому удаляем. В phpMyAdmin:

— выбираем базу «beseder»;

— жмём кнопку «Операции»;

— жмем кнопку «Удалить базу данных (DROP)».

Для того чтобы выполнять удаление не входя в phpMyAdmin средствами PHP, создаем файл «drop» и размещаем его также в папке «admin». Теперь можно будет удалять базу переходя по адресу: news/chat/admin/drop.php

Листинг 5. drop.php Путь: news/chat/admin/drop.php

<?php

include_once $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';

try {

$sql = 'DROP DATABASE beseder';

$s = $dsn->exec($sql);

} catch (PDOException $e) {

echo $e->getMessage();

exit('Ошибка подключения к базе данных');

}

header('Location: /');//переходим на главную страницу

В этом скрипте мы сначала подключаемся к нашей базе данных beseder, а затем выполняем SQL запрос DROP DATABASE удаляющий все таблицы в указанной базе данных и саму базу. В результате выполнения данного оператора база удаляется полностью.

*файл подключения к БД dsn.php будет рассмотрен в следующем разделе.

Смотрите также

а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ э ю я