Создание блога на PHP. Урок 2. Логирование на сайте. Язык SQL.

Создание блога на PHP. Урок 2. Логирование на сайте. Язык SQL.Создание блога на PHP. Урок 2. Логирование на сайте. Язык SQL.

Цикл материалов «Создание блога на PHP»

Сегодня мы плавно перейдём от теории к практике. Первым делом мы реализуем логирование в нашем блоге, рассмотрим простейшие SQL запросы и научимся с ними работать из PHP.

Отладка и логирование в CMS

Отладочная информацияОтладочная информация – информация, помогающая в отладке.

Часто приходится проанализировать внезапно возникшую ошибку или устроить «разбор полётов» серьёзного бага. Инструменты ведения логов будут полезны как и при разработке сайта, так и при разборе полётов.

ЛоггированиеЛоггирование или журналирование – процесс ведения пошагового лога (журнала) отладочной информации.

Кроме общего лога ошибок PHP необходимо логировать действия и промежуточные результаты выполнения програмы. Для этого в CMS используются различные. У нас схема классов приблизительно следующая:

Структура классов логирования

BLogger – абстрактный класс-родитель. В нём прописаны 2 основных абстрактных функции:

  1. public function addtolog($msg,$level=LL_GENERAL);
  2. public function addHR();

addtolog добавляет сообщение, addHR – горизонтальную линию.

BLog – общий класс, который управляет логгерами – регистрирует их, отправляет им сообщения и прочее. Мы же им и будем пользоваться в логгировании нашей работы (в библиотеках и компонентах мы все наши отладочные сообщения передаём в BLog). Все функции BLog статические. Если у нас не зарегистрировано ни одного логгера – все логи игнорируются.

Примеры использования:

  • В режиме отладки мы подключаем BLoggerHTML и BLoggerFile. Лог выводится в футере сайта и параллельно складывается в папочку.
  • На рабочем проекте мы можем подключить логгер BLoggerFile, который будет вести логи в папочке на сервере для разбора полётов.
  • При наличии скриптов, которые запускаются в консоли или по CRONу – мы регистрируем логгер BLoggerConsole, который запросы выводит в консоль.
  • Если наш сайт работает в кластере – мы можем создать систему логгирования каждой ноды, просто унаследовав BLoggerNode от BLogger и прописав там работу с логами.

Всё предельно просто и удобно.

База данных в блоге. Для чего нужна база данных?

База данных в блоге

Много сайтов (а особенно блогов) работают не статично – на сайте приходится добавлять и обновлять информацию, постоянно пишутся комментарии, регистрируются пользователи. Всю это информацию приходится где-то хранить.

Обычно в PHP для хранения данных:

  1. Реляционные базы данных (обычно это SQL);
  2. Файлы (да, и такое встречается);
  3. Базы данных Key=>Value (их ещё в народе называют NoSQL).

Работа с данными, сортировка, лимиты.

БД – это

СУБД – это

Реляционная БД.

Слово «реляционный» происходит от англ. relation («отношение», «зависимость», «связь»).

FoxPro, DB2, MicrosoftAccess

Что такое SQL?

SQL – это язык запросов. На языке SQL построено множество СУБД – MySQL, MS SQL, PostgreSQL, Oracle и много других. У каждого из них есть свои нюансы в работе, но их объединяет общий язык. Обычно СУБД работает на клиент-серверной модели. Т.е. к одной базе данных подключается много клиентов и все они, без каких-либо конфликтов, могут пользоваться базой.

Как я уже выше сказал, .

Таблицы

Вся информация в SQL базе данных.

Строки называют записями

У каждого столбца есть свой определённый тип. Если created – DATETIME, то там можно хранить только дату / время.

Столбец может допускать или не допускать значения NULL, ограничивать размер.

Пример:

id email 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
  • Агрегатные функции
  • Объединение таблиц
  • Вложенные запросы
  • Создание таблиц
  • Ключи
  • Триггеры
  • Хранимые процедуры
Поскольку акценты наших уроков больше на PHP, сложные структуры MySQL мы оставляем на будущее.

Класс для работы с MySQL (Singleton)

Чего мы хотим от класса: 1. Выполнять запросы 2. Уметь соединятся с сервером 3. Вести статистику Для связи с MySQL сервером есть 3 варианта библиотек PHP – php_mysql, php_mysqli и php_pdo.

Свойства класса

Следующие свойства:

  1. protected $db_connected; //Указывает на состояние соединения с сервером
  2. protected $mysqli; //экземпляр класса библиотеки php_mysqli
  3. protected $logsuffix; //суффикс для лога (в случае нескольких БД)
  4. public $queries_count=0; //количество запросов к базе данных
  5. public $db_host; //Хост сервера MySQL
  6. public $db_username;
  7. public $db_password;
  8. public $db_name;

Метод TryConnect

Данный метод используется для

  1. public function TryConnect(){
  2. 	if($this->db_connected){
  3. 		return TRUE;
  4. 		}
  5. 	if(!class_exists('mysqli')){
  6. 		BLog::addtolog($this->logsuffix.
  7. 			': MySQLi class not found',LL_ERROR);
  8. 		return FALSE;
  9. 		}
  10. 	$this->mysqli=new mysqli($this->db_host, 
  11. 		$this->db_username,
  12. 		$this->db_password,
  13. 		$this->db_name,
  14. 		$this->db_port);
  15. 	if((empty($this->mysqli))||(mysqli_connect_errno())){
  16. 		BLog::addtolog($this->logsuffix.
  17. 			': '.mysqli_connect_error(),LL_ERROR);
  18. 		return FALSE;
  19. 		}
  20. 	if(!$this->mysqli->set_charset("utf8"))return FALSE;
  21. 	$this->db_connected=TRUE;
  22. 	return TRUE;
  23. 	}

Метод getInstanceAndConnect

Данный метод используется для

  1. public static function getInstanceAndConnect(){
  2. 	if(!is_object(self::getInstance()))return NULL;
  3. 	if(!self::$instance->TryConnect())return NULL;
  4. 	return self::$instance;
  5. 	}

Метод Query

  1. public function Query($sql){
  2. 	BLog::addtolog($this->logsuffix.' Query: '.$sql);
  3. 	$this->queries_count++;
  4. 	$r=$this->mysqli->query($sql);
  5. 	if((DEBUG_MODE)&&(empty($r))){
  6. 		BLog::addtolog($this->logsuffix.
  7. 			' query failed!',LL_ERROR);
  8. 		BLog::addtolog($this->logsuffix.
  9. 			' query="'.$sql.'";',LL_ERROR);
  10. 		BLog::addtolog($this->logsuffix.
  11. 			' query error='.$this->lasterror(),LL_ERROR);
  12. 		}
  13. 	return $r;
  14. 	}

Используем логгирование.

Метод escape_string

Для предотвращения SQL-инъекций.

  1. public function escape_string($s, $EMPTY_NULL=false){
  2. 	if(!is_string($s)){
  3. 		$s='';
  4. 		}
  5. 	if(($EMPTY_NULL)&&(empty($s))){
  6. 		return 'NULL';
  7. 		}
  8. 	return '"'.$this->mysqli->real_escape_string($s).'"';
  9. 	}

Метод escape_datetime

  1. public function escape_datetime($dt, $EMPTY_NULL=true){
  2. 	if(($EMPTY_NULL)&&(empty($dt))){
  3. 		return 'NULL';
  4. 		}
  5. 	$str='"'.$dt->format('Y-m-d H:i:s').'"';
  6. 	return $str;
  7. 	}

Остальные методы

  1. real_query – для
  2. multi_query –
  3. fetch
  4. lasterror
  5. QueryAndFetch
  6. affected_rows
  7. insert_id
  8. start_transaction
  9. commit
  10. rollback

Использование класса

  1. $sql=BMySQL::getInstanceAndConnect();
  2. If(empty($sql)){
  3. 	return false;
  4. 	}
  5. $sql->query(‘INSERT INTO `users` (`email`,`password`,`created`) VALUES (“admin@google.com”,”admin”,NOW()));

ДЗ, тема следующего урока, проверка ДЗ

ДЗ – написать простейшие выборки, составить.

Тема следующего урока – фабрика, кеширование (memcached, файлы). Синглетон для кеширования. Фабрика для нашего блога. Улучшаем выборку данных из таблицы (добавляем кеширование).

Оглавление уроков

Ну, и напоследок, краткое оглавление уроков:

Поздравляю всех, кто осилил такой большой урок. До встречи!

Комментарии

17.09.2017 06:02:45
Avatar of TestTest
Test
Captcha Обновить
Go Top