Пишем cms на php и SQL. Часть 1.
Задача построения системы управления содержанием (CMS) может привести в замешательство новичка разработчика PHP. Но не так страшен черт, как его малюют! В данной серии уроков мы построим простую, но полностью работоспособную систему с нуля.
В ходе процесса вы научитесь создавать базы и таблицы MySQL, работать с объектами, константами, включениями, сессиями и прочими инструментами PHP. Кроме того мы покажем, как отделять логику приложения от презентации и сделать код PHP более безопасным. А также вам откроется многое другое, полезное в деле создания собственной системы мечты.
Вы можете посмотреть работу готового приложения на странице демонстрации (с целью безопасности включен режим "только чтение", так что добавлять, изменять и удалять статьи не получится). Также можно скачать полный код PHP нашей меленькой CMS с переведенными комментариями.
Примечание: для изучения материалов уроков потребуется веб сервер Apache с установленным модулем PHP и сервер MySQL. Для работы на локальном компьютере можно воспользоваться одним из инструментов веб разработчика: XAMPP (на английском языке), Denwer, Open server или другим.
Функционал нашей CMS
Первым делом надо точно определиться, что будет делать наша CMS. Итак, вот список функций:
Клиентская часть:
- Главная страница, на которой выводиться список последних 5 статей
- Страница со списком всех статей
- Страница просмотра отдельной статьи
Серверная часть:
- Вход/выход для администратора
- Список всех статей
- Добавление новой статьи
- Редактирование существующей статьи
- Удаление существующей статьи
Каждая статья имеет собственный заголовок, резюме и дату публикации.
Планирование работ
Для создания нашей CMS нужно сделать следующие шаги
- Создать базу данных
- Создать таблицу
articles
- Сделать файл конфигурации
- Построить класс
Article
- Написать скрипт клиентской части
index.php
- Написать скрипт серверной части
admin.php
- Создать шаблон клиентской части
- Создать шаблон серверной части
- Создать таблицу стилей и логотип системы
Примечание: на страницах уроков приводится код для нашей CMS готовый к копированию в ваши текстовые файлы. Если у вас нет желания создавать файлы самостоятельно, то можно скачать архив с исходниками, в котором содержатся все нужные папки и файлы.
Шаг 1. Создаем базу данных
На первом шаге нужно создать базу данных MySQL для хранения содержания. Можно сделать так:3
- Запускаем программу клиент
mysql
Открываем окно терминала и набираем командуmysql -u username -pПосле запроса введите пароль для доступа к MySQL.username
- имя пользователя, который имеет полномочия для создания баз данных. В случае работы на локальном компьютере можно использоватьroot
, хотя для безопасности всегда следует создавать пользователя с другим именем для решения задач администрирования. - Создаем базу данных После метки
mysql>
вводим:create database cms;И нажимаем Enter. - Выходим из программы клиента
mysql
После меткиmysql>
вводим:exitИ нажимаем Enter.
Теперь у нас есть пустая база данных, в которой можно размещать таблицы и содержание.
Для решения такой задачи также можно воспользоваться инструментами для администрирования баз данных, таким как phpMyAdmin, cPanel или Plesk (если они установлены на вашем сервере). В некоторых случаях использование подобных инструментов является единственным доступным для пользователя инструментом для работы с базами данных (ситуация зависит от правил, установленных на вашем хостинге).
Шаг 2. Создаем таблицу articles
Наша простая CMS имеет единственную таблицу в базе данных: articles
. В ней содержатся все статьи в нашей системе.
Создадим схему таблицы. Схема таблицы описывает типы данных, которые могут содержаться в таблице и информацию о ней.
Создаем текстовой файл tables.sql
на жестком диске и добавляем в него следующий код:
DROP TABLE IF EXISTS articles;C
REATE TABLE articlesp
ublicationDate date NOT NULL, # Когда статья опубликована
title varchar(255) NOT NULL, # Полный заголовок статьи
summary text NOT NULL, # Резюме статьи
content mediumtext NOT NULL, # HTML содержание статьи
PRIMARYKEY (id)
);
Выше приведенный код определяет схему таблицы articles. Он написан на SQL, языке для создания и манипулирования базами данных в MySQL (и во многих других системах).
Разберём выше приведенный кодСоздаем таблицу articles Выражение DROP TABLE IF EXISTS articles удаляет любую существующую таблицу articles (вместе с данным - осторожно!). Мы выполняем данную операцию чтобы в базе не было двух таблиц с одинаковыми именами. Выражение CREATE TABLE articles ( ) создает новую таблицу articles. Код, размещенный в скобках, определяет структуру данных в таблице...
title varchar(255) NOT NULL, # Полный заголовок статьи
title varchar(255) NOT NULL, # Полный заголовок статьи
CREATE
TABLE
articles
(
id smallint
unsigned NOT
NULL
auto_increment,
publicationDate date
NOT
NULL, # Когда статья опубликована
title varchar(255) NOT
NULL, # Полный заголовок статьи
summary text NOT
NULL, # Резюме статьи
content mediumtext NOT NULL, # HTML содержание статьи
content mediumtext NOT
NULL, # HTML содержание статьи
PRIMARY
KEY
(id)
);
Выше приведенный код определяет схему таблицы articles
. Он написан на SQL, языке для создания и манипулирования базами данных в MySQL (и во многих других системах).
Разберем выше приведенный код
- Создаем таблицу
articles
ВыражениеDROP TABLE IF EXISTS articles
удаляет любую существующую таблицуarticles
(вместе с данным - осторожно!). Мы выполняем данную операцию чтобы в базе не было двух таблиц с одинаковыми именами. ВыражениеCREATE TABLE articles ( )
создает новую таблицуarticles
. Код, размещенный в скобках, определяет структуру данных в таблице... - Определяем для каждой статьи уникальный ID Теперь можно определять структуру таблицы. Таблица состоит из набора полей (также их называют столбцами). Каждое поле содержит опредленный тип информации о статье. Сначала мы создаем поле
id
. Оно имеет типsmallint unsigned
(без знаковое маленькое целое), то есть число от 0 до 65,535. Таким образом, наша CMS может содержать до 65,535 статей. Также для него определяется атрибутNOT NULL
, который означает, что поле не может быть пустым (null). Данное свойство существенно облегчает труд разработчика. Добавляем атрибутauto_increment
, который указывает MySQL назначать новое, уникальное значение для поляid
при создании записи. Итак, первая статья будет иметьid
1, вторая -id
2, и так далее. Мы будем использовать уникальные значения как указатели на статью при выводе и редактировании в CMS. - Добавляем поле
publicationDate
Следующая строка создает полеpublicationDate
, которое хранит дату публикации каждой статьи. Данное поле имеет типdate
, соответствующий значениям дат. - Добавляем поле
title
Теперь создаем полеtitle
, в котором размещается заголовок. Оно имеет типvarchar(255)
, то есть может хранить строку длиной до 255 символов. - Добавляем поля
summary
иcontent
Последние два поля 2,summary
иcontent
, содержат резюме статьи (краткое описание материала) и HTML содержание соответственно. Резюме имеет типtext
(то есть, может состоять из 65,535). А полеcontent
имеет типmediumtext
(то есть может содержать до 16,777,215). - Добавляем основной ключ Последняя строка в выражении
CREATE TABLE
определяет ключ для таблицы. Ключ также называют индексом, и он служит для быстрого поиска данных в таблице за счет некоторого увеличения требующегося пространства для хранения. Мы определяем полеid
какPRIMARY KEY
. Каждая таблица может содержать единственныйPRIMARY KEY
, так как данный ключ уникально определяет каждую запись в таблице. Кроме того, с помощью данного ключа MySQL очень быстро находит нужную запись.
Теперь у нас есть схема таблицы и ее нужно загрузить в MySQL для создания структуры. Самый простой способ - открыть окно терминала, перейти к папке с файлом tables.sql
и запустить следующую команду:
mysql -u username -p cms < tables.sql
...где username
- имя пользователя MySQL, а cms
- имя базы данных, которую мы создали на шаге 1.
Вводите пароль пользователя после запроса, и MySQL загрузит и выполнит код из файла tables.sql
, создав таблицу articles
в базе данных cms
.
Также можно воспользоваться инструментами для администрирования баз данных, таким как phpMyAdmin, cPanel или Plesk (если они установлены на вашем сервере).
Шаг 3. Создаем файл конфигурации
Теперь у нас есть база данных и мы готовы разрабатывать код PHP. Начнем с создания файла конфигурации для хранения различных установок для нашей CMS. Данный файл будет использоваться остальными скриптами нашей системы.
Первым делом создаем папку cms
в папке веб сервера. Она будет содержать все файлы нашей CMS.
В папке cms
создаем файл config.php
и копируем в него следующий код:
01
<?php
02
ini_set( "display_errors", true );
03
date_default_timezone_set( "Australia/Sydney"
); // http://www.php.net/manual/en/timezones.php
04
define( "DB_DSN", "mysql:host=localhost;dbname=cms"
);
05
define( "DB_USERNAME", "username"
);
06
define( "DB_PASSWORD", "password"
);
07
define( "CLASS_PATH", "classes"
);
08
define( "TEMPLATE_PATH", "templates"
);
09
define( "HOMEPAGE_NUM_ARTICLES", 5 );
10
define( "ADMIN_USERNAME", "admin"
);
11
define( "ADMIN_PASSWORD", "mypass"
);
12
require( CLASS_PATH . "/Article.php"
);
13
14
function
handleException( $exception
) {
15
echo
"Sorry, a problem occurred. Please try later.";
16
error_log( $exception->getMessage() );
17
}
18
19
set_exception_handler( 'handleException'
);
20
?>
Разберем код подробно:
- Выводим ошибки в браузере Строка
ini_set()
устанавливает режим вывода сообщений об ошибках в браузере. Отличная опция для отладки кода, но на готовом проекте данную опцию надо отключить ( установить значениеfalse
) для безопасности ресурса. - Устанавливаем временную зону Так как наша CMS будет использовать функцию PHP
date()
, нужно указать временную зону сервера для PHP (иначе PHP будет генерировать предупреждение). В примере установлена зона"Australia/Sydney"
— поменяйте на свою. - Устанавливаем детали доступа к базе данных Затем определяем константу
DB_DSN
, которая указывает PHP, где искать базу данных MySQL. Параметрdbname
должен соответствовать имени базы данных нашей CMS (cms
). Также мы будем хранить имя пользователя MySQL и пароль, которые используются для доступа к базе данных CMS в константахDB_USERNAME
иDB_PASSWORD
. Установите правильные значения в данных константах, которые соответствуют вашим настройкам. - Устанавливаем пути Мы устанавливаем 2 пути в нашем файле конфигураций:
CLASS_PATH
, который указывает на место хранения файлов классов, иTEMPLATE_PATH
, который указывает на место хранения шаблонов HTML. Оба пути указываются относительно верхнего каталогаcms
. - Устанавливаем количество статей, выводимых на главной странице
HOMEPAGE_NUM_ARTICLES
управляет максимальным количеством заголовков статей, которые выводятся на главной странице. Мы установили 5, но можно легко увеличить или уменьшить значение. - Устанавливаем имя и пароль администратора Константы
ADMIN_USERNAME
иADMIN_PASSWORD
содержат данные регистрации для администратора нашей CMS. - Включаем класс
Article
Так как файл классаArticle
(мы его создадим позже) требуется во всех скриптах нашего приложения, добавим его здесь. - Создаем обработчик исключительных ситуаций В завершение определяем
handleException()
- простую функцию для обработки исключений PHP, которые могут генерироваться при выполнении кода. Данная функция выводит общее сообщение об ошибке и записывает данные об ошибке в журнал веб сервера. Такая функция способствует улучшению безопасности системы за счет обработки исключений PDO, которые могут выводить имя пользователя и пароль на странице. После определения функцииhandleException()
, мы устанавливаем ее как обработчик исключений PHP, вызывая функциюset_exception_handler()
.Такой обработчик исключений сделан для упрощения материалов урока. "Правильный" способ для обработки исключений для перехвата всех вызовов PDO вArticle.php
заключается в использовании блоковtry ... catch
.