JDatabaseDriver
Класс является драйвером базы данных в Joomla. Используется для составления и выполнения запросов, получения результатов.
- Расположение
-
- Базовый класс - /libraries/joomla/database/driver.php
- Драйверы - /libraries/joomla/database/driver
- Ссылка на API
- JDatabaseDriver
Методы
@todo
Использование
Для начала работы с базой данных нам необходимо получить объект через фабрику Factory:
$db = Factory::getDbo();
Составление и выполнение запросов
При составлении запросов мы можем использовать два подхода: строковой и объектно-ориентированный.
Строковой запрос - это обычный SQL синтаксис:
$query = 'SELECT title FROM #__content WHERE id = 1';
Объектно-ориентированный запрос выполняется с помощью конструктора запросов JDatabaseQuery:
// Получаем объект конструктора запросов (JDatabaseQuery)
$query = $db->getQuery(true);
$query->select($db->quoteName('title'));
->from($db->quoteName('#__content'));
->where($db->quoteName('id') . ' = 1');
Элемент #_
используется вместо префикса таблицы. При установке запроса он заменяется реальным префиксом таблицы.
Когда запрос подготовлен, мы устанавливаем его через метод setQuery
и выполняем:
$db->setQuery($query)
->loadResult();
Если нам необходимо просто выполнить запрос, без получения результата, то используем метод execute
.
Для выполнения запроса с получением результатов используется большое количество различных методов. Их использование зависит от того, какой запрос мы устанавливаем, и какой результат мы хотим получить. Подробнее в материале Выборка данных и получение результата.
Также стоит ознакомиться с материалом Вставка, обновление и удаление данных.
Экранирование идентификаторов запроса
Метод quoteName($name, $as = null)
оборачивает идентификаторы запроса (названия таблиц и полей) в кавычки для предотвращения инъекций и конфликта использования зарезервированных имен (таких как table, count и т.п.).
'SELECT ' . $db->quoteName('title')
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE ' . $db->quoteName('id') . ' = 1';
SELECT `title` FROM `#__content` WHERE `id` = 1
Метод может принимать массив:
'SELECT ' . $db->quoteName(array('title', 'state'))
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE ' . $db->quoteName('id') . ' = 1';
SELECT `title`,`state` FROM `#__content` WHERE `id` = 1
Второй параметр $as
(строка или массив) является условием AS
, которое ассоциировано с параметром $name
. Если это массив, то его длина должна совпадать с длиной $name
:
'SELECT ' . $db->quoteName('title')
. ' FROM ' . $db->quoteName('#__content', 'a')
. ' LEFT JOIN ' . $db->quoteName('#__users', 'b') . ' ON b.id = a.created_by'
. ' WHERE ' . $db->quoteName('id') . ' = 1;
SELECT `title`
FROM `#__content` AS `a`
LEFT JOIN `#__users` AS `b`
ON b.id = a.created_by
WHERE `id` = 1
Для quoteName
существует алиас - можно использовать более короткий вариант qn
.
Экранирование строк
Перед использованием в запросе, строки в обязательном порядке должны быть экранированы. Для экранирования строк используются методы escape($text, $extra = false)
и quote($text, $escape = true)
.
Метод escape
добавляет обратную косую черту перед небезопасными символами:
$db->escape("I'm a Joomla lover")
I\'m Joomla lover
Если второй параметр установлен в значение true
, то включается экранирование дополнительных символов (например, символ процента), и этот символ будет восприниматься как строковой элемент, а не как специальный групповой символ.
$db->escape("I'm %Joomla% lover", true)
I\'m \%Joomla\% lover
Метод quote
добавляет обратную косую черту перед небезопасными символами и оборачивает строку в одинарные кавычки:
'SELECT ' . $db->quoteName('state')
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE ' . $db->quoteName('title') . ' = ' . $db->quote("I'm Joomla lover");
SELECT `state` FROM `#__content` WHERE `title` = 'I\'m Joomla lover'
Метод может принимать массив строк:
$title = array("I'm a Joomla lover", "I'm using Joomla! CMS");
'SELECT ' . $db->quoteName('state')
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE $db->quoteName('title')
. ' IN (' . implode(',', $db->quote($title)) . ')';
SELECT `state` FROM `#__content` WHERE `title` IN ('I\'m Joomla lover','I\'m using Joomla! CMS')
Если экранирование необходимо выключить (для предотвращения двойного экранирования), то второй параметр устанавливаем в значение false
:
$search = '%' . $db->escape("I'm %Joomla% lover", true) . '%';
'SELECT ' . $db->quoteName('state')
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE ' . $db->quoteName('title')
. ' LIKE ' . $db->quote($search, false);
SELECT `state` FROM `#__content` WHERE `title` LIKE '%I\'m \%Joomla\% lover%'
Для quote
существует алиас - можно использовать более короткий вариант q
.
Отладка
Для отладки мы можем использовать метод getQuery
, который возвращает сформированную строку запроса:
echo $db->getQuery();
Например, мы установили следующий запрос:
$db->setQuery(
'SELECT ' . $db->quoteName('title')
. ' FROM ' . $db->quoteName('#__content')
. ' WHERE ' . $db->quoteName('id') . ' = 1';
);
echo $db->getQuery();
Получаем строку:
SELECT `title` FROM `#__content` WHERE `id` = 1
Мы можем пойти ещё дальше и заменить префикс #__
на реальный префикс таблиц:
echo str_replace('#__', $db->getPrefix(), $db->getQuery());
Ссылки по теме
Factory JDatabaseDriver Database
- Последнее обновление: .