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());

Ссылки по теме

© 2019 BinaryCraft. Все права защищены.