- Метки урока:
- php
- кодинг
- web дизайн
Строим свою CMS на PHP и MySQL. Часть 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 для хранения содержания. Можно сделать так:
-
Запускаем программу клиент
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; 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 содержание статьи 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
и копируем в него следующий код:
<?php ini_set( "display_errors", true ); date_default_timezone_set( "Australia/Sydney" ); // http://www.php.net/manual/en/timezones.php define( "DB_DSN", "mysql:host=localhost;dbname=cms" ); define( "DB_USERNAME", "username" ); define( "DB_PASSWORD", "password" ); define( "CLASS_PATH", "classes" ); define( "TEMPLATE_PATH", "templates" ); define( "HOMEPAGE_NUM_ARTICLES", 5 ); define( "ADMIN_USERNAME", "admin" ); define( "ADMIN_PASSWORD", "mypass" ); require( CLASS_PATH . "/Article.php" ); function handleException( $exception ) { echo "Sorry, a problem occurred. Please try later."; error_log( $exception->getMessage() ); } set_exception_handler( 'handleException' ); ?>
Разберем код подробно:
- Выводим ошибки в браузере Строка
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
.
Замечание о безопасности
В реальных проектах лучше помещать config.php
где-нибудь за пределами корневого каталога веб сайта, так как в файле содержатся имена и пароли. Обычно код PHP невозможно просмотреть в браузере, но иногда из-за неправильной конфигурации веб сервера код становится доступным. Вы можете использовать функцию hash()
для хэширования паролей и хранить в config.php
хэши, вместо текстовых паролей. Затем при регистрации пользователя можно опять воспользоваться функцией hash()
для кодирования введенного пароля и сравнения результата с сохраненным в config.php
хэшем.
В следующем уроке мы построим основной класс нашего приложения - Article.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.elated.com/articles/cms-in-an-afternoon-php-mysql/
Перевел: Сергей Фастунов
Урок создан: 22 Ноября 2012
Просмотров: 287154
Правила перепечатки
5 последних уроков рубрики "PHP"
-
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
-
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
-
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
-
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
-
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.