
Цикл материалов «Создание блога на PHP»
Сегодня мы плавно перейдём от теории к практике. Первым делом мы реализуем логирование в нашем блоге, рассмотрим простейшие SQL запросы и научимся с ними работать из PHP.
Отладка и логирование в CMS
Отладочная информацияОтладочная информация – информация, помогающая в отладке.
Часто приходится проанализировать внезапно возникшую ошибку или устроить «разбор полётов» серьёзного бага. Инструменты ведения логов будут полезны как и при разработке сайта, так и при разборе полётов.
ЛоггированиеЛоггирование или журналирование – процесс ведения пошагового лога (журнала) отладочной информации.
Кроме общего лога ошибок PHP необходимо логировать действия и промежуточные результаты выполнения програмы. Для этого в CMS используются различные. У нас схема классов приблизительно следующая:
BLogger – абстрактный класс-родитель. В нём прописаны 2 основных абстрактных функции:
public function addtolog($msg,$level=LL_GENERAL);
public function addHR();
addtolog добавляет сообщение, addHR – горизонтальную линию.
BLog – общий класс, который управляет логгерами – регистрирует их, отправляет им сообщения и прочее. Мы же им и будем пользоваться в логгировании нашей работы (в библиотеках и компонентах мы все наши отладочные сообщения передаём в BLog). Все функции BLog статические. Если у нас не зарегистрировано ни одного логгера – все логи игнорируются.
Примеры использования:
- В режиме отладки мы подключаем BLoggerHTML и BLoggerFile. Лог выводится в футере сайта и параллельно складывается в папочку.
- На рабочем проекте мы можем подключить логгер BLoggerFile, который будет вести логи в папочке на сервере для разбора полётов.
- При наличии скриптов, которые запускаются в консоли или по CRONу – мы регистрируем логгер BLoggerConsole, который запросы выводит в консоль.
- Если наш сайт работает в кластере – мы можем создать систему логгирования каждой ноды, просто унаследовав BLoggerNode от BLogger и прописав там работу с логами.
Всё предельно просто и удобно.
База данных в блоге. Для чего нужна база данных?
Много сайтов (а особенно блогов) работают не статично – на сайте приходится добавлять и обновлять информацию, постоянно пишутся комментарии, регистрируются пользователи. Всю это информацию приходится где-то хранить.
Обычно в PHP для хранения данных:
- Реляционные базы данных (обычно это SQL);
- Файлы (да, и такое встречается);
- Базы данных Key=>Value (их ещё в народе называют NoSQL).
Работа с данными, сортировка, лимиты.
БД – это
СУБД – это
Реляционная БД.
Слово «реляционный» происходит от англ. relation («отношение», «зависимость», «связь»).
FoxPro, DB2, MicrosoftAccess
Что такое SQL?
SQL – это язык запросов. На языке SQL построено множество СУБД – MySQL, MS SQL, PostgreSQL, Oracle и много других. У каждого из них есть свои нюансы в работе, но их объединяет общий язык. Обычно СУБД работает на клиент-серверной модели. Т.е. к одной базе данных подключается много клиентов и все они, без каких-либо конфликтов, могут пользоваться базой.
Как я уже выше сказал, .
Таблицы
Вся информация в SQL базе данных.
Строки называют записями
У каждого столбца есть свой определённый тип. Если created – DATETIME, то там можно хранить только дату / время.
Столбец может допускать или не допускать значения NULL, ограничивать размер.
Пример:
| id | password | name | created | |
|---|---|---|---|---|
| 1 | admin@google.com | admin0000 | Администратор | 2015-01-12 00:12:23 | 2 | vasya@mail.ru | Vasya123 | Вася | 2012-07-11 23:11:05 | 3 | test@brilliant.ua | pWt@s1Lq | Тест | 2013-04-29 12:02:34 | 4 | a@konservs.com | gHckOlx2 | Андрей | 2011-12-03 17:12:12 |
Команда SELECT
Для выбора данных.
SELECT name, text, created FROM content_articles WHERE (category=5) ORDER BY `created` LIMIT 5 OFFSET 10
Давайте разберём запрос детальнее:
| SELECT | Ключевое слово которое сообщает базе данных что мы хотим выбрать данные. |
|---|---|
| name, text, created | Список столбцов из таблицы которые выбираются запросом. Если мы хотим выбрать все поля, можно использовать символ «*». |
| FROM content_articles | FROM – ключевое слово, которое должно быть представлено в каждом запросе выборки. После него идёт пробел и затем имя таблицы. |
| WHERE (category=5) | WHERE – необязательное ключевое слово, которое указывает на условия фильтрации данных. Условия могут быть достаточно сложными. |
| ORDER BY `created` | ORDER BY – необязательное ключевое слово, указывающее на столбцы сортировки |
| LIMIT 5 | LIMIT – необязательное ключевое слово |
| OFFSET 10 | OFFSET – необязательное ключевое слово |
| ; | Точка с запятой – индикатор окончания команды. |
Я описал команду SELECT в общих чертах, если будет необходима детальная информация – пользуйтесь документацией SQL.
Команда INSERT
INSERT INTO users (email, password, name, created) VALUES (“test@google.com”,”test”,”google test”,NOW()) INSERT INTO users (email, password, name, created) VALUES (“test@google.com”,”test”,”google test”,NOW()) РезультатомКоманда UPDATE
Команда служит для обновления, в упрощённом виде выглядит следующим образом:
UPDATE users SET name=””, password=”” WHERE (id=2);
Команда DELETE
Команда служит для удаления записи, в упрощённом виде выглядит следующим образом:
DELETE FROM users WHERE (id=2)
Что ещё?
Мы не рассмотрели:
- Типы данных SQL
- Агрегатные функции
- Объединение таблиц
- Вложенные запросы
- Создание таблиц
- Ключи
- Триггеры
- Хранимые процедуры
Класс для работы с MySQL (Singleton)
Чего мы хотим от класса: 1. Выполнять запросы 2. Уметь соединятся с сервером 3. Вести статистику Для связи с MySQL сервером есть 3 варианта библиотек PHP – php_mysql, php_mysqli и php_pdo.Свойства класса
Следующие свойства:
protected $db_connected; //Указывает на состояние соединения с сервером
protected $mysqli; //экземпляр класса библиотеки php_mysqli
protected $logsuffix; //суффикс для лога (в случае нескольких БД)
public $queries_count=0; //количество запросов к базе данных
public $db_host; //Хост сервера MySQL
public $db_username;
public $db_password;
public $db_name;
Метод TryConnect
Данный метод используется для
public function TryConnect(){
if($this->db_connected){
return TRUE;
}if(!class_exists('mysqli')){
BLog::addtolog($this->logsuffix.
': MySQLi class not found',LL_ERROR);
return FALSE;
}$this->mysqli=new mysqli($this->db_host,
$this->db_username,
$this->db_password,
$this->db_name,
$this->db_port);
if((empty($this->mysqli))||(mysqli_connect_errno())){
BLog::addtolog($this->logsuffix.
': '.mysqli_connect_error(),LL_ERROR);
return FALSE;
}if(!$this->mysqli->set_charset("utf8"))return FALSE;
$this->db_connected=TRUE;
return TRUE;
}
Метод getInstanceAndConnect
Данный метод используется для
public static function getInstanceAndConnect(){
if(!is_object(self::getInstance()))return NULL;
if(!self::$instance->TryConnect())return NULL;
return self::$instance;
}
Метод Query
public function Query($sql){
BLog::addtolog($this->logsuffix.' Query: '.$sql);
$this->queries_count++;
$r=$this->mysqli->query($sql);
if((DEBUG_MODE)&&(empty($r))){
BLog::addtolog($this->logsuffix.
' query failed!',LL_ERROR);
BLog::addtolog($this->logsuffix.
' query="'.$sql.'";',LL_ERROR);
BLog::addtolog($this->logsuffix.
' query error='.$this->lasterror(),LL_ERROR);
}return $r;
}
Используем логгирование.
Метод escape_string
Для предотвращения SQL-инъекций.
public function escape_string($s, $EMPTY_NULL=false){
if(!is_string($s)){
$s='';
}if(($EMPTY_NULL)&&(empty($s))){
return 'NULL';
}return '"'.$this->mysqli->real_escape_string($s).'"';
}
Метод escape_datetime
public function escape_datetime($dt, $EMPTY_NULL=true){
if(($EMPTY_NULL)&&(empty($dt))){
return 'NULL';
}$str='"'.$dt->format('Y-m-d H:i:s').'"';
return $str;
}
Остальные методы
- real_query – для
- multi_query –
- fetch
- lasterror
- QueryAndFetch
- affected_rows
- insert_id
- start_transaction
- commit
- rollback
Использование класса
$sql=BMySQL::getInstanceAndConnect();
If(empty($sql)){
return false;
}$sql->query(‘INSERT INTO `users` (`email`,`password`,`created`) VALUES (“admin@google.com”,”admin”,NOW())’);
ДЗ, тема следующего урока, проверка ДЗ
ДЗ – написать простейшие выборки, составить.
Тема следующего урока – фабрика, кеширование (memcached, файлы). Синглетон для кеширования. Фабрика для нашего блога. Улучшаем выборку данных из таблицы (добавляем кеширование).
Оглавление уроков
Ну, и напоследок, краткое оглавление уроков:
- Урок 1. Вступительный.
- Урок 2. Логирование на сайте. Язык SQL.
- Урок 3. Фабрика, кеширование.
Поздравляю всех, кто осилил такой большой урок. До встречи!
Комментарии
Adding comments is temporarily disabled for unregistered users.