Адаптируйте код из раздела " Практика" для своего варианта (см. дополнительные материалы).
Работа с базой данных
Подробно рассмотрена работа с базой данных средствами Joomla. Рассмотрены понятия реального и символического префиксов, этапы выполнения запроса к базе данных и класс JTable.
Цель лекции:Изучить, как происходит работа с базой данных средствами Joomla.
Префикс таблиц базы данных
Префикс таблиц базы данных- это строка, которая присоединяется к названию каждой таблицы Joomla в базе данных. Префикс задается при установке Joomla. В старых версиях по умолчанию использовался префикс "jos_", однако это создавало потенциальную уязвимость сайта, т.к. хакеры знали название таблицы с паролями пользователей - "jos_users". Теперь префикс, предлагаемый при установке, генерируется случайным образом.
Использование префикса позволяет разместить в одной базе данных несколько установок Joomla.
Различают реальный и символический префиксы. Реальный префикс- это то конкретное сочетание символов, которое используется в названиях таблиц базы данных. Символический префикс- это сочетание "#__" (решетка и два знака подчеркивания), которое используется в запросах вместо реального префикса. При обработке запроса вместо символического префикса будет автоматически подставлен реальный. Например, при реальном префиксе "jos_" строка "#__mycomponent_mytable" превратится в "jos_mycomponent_mytable".
При разработке собственных расширений в SQL-запросах всегда указывается символический префикс, а не реальный, так как в других установках Joomla почти наверняка будут использоваться другие реальные префиксы.
Выполнение запроса к базе данных
Чтобы выполнить запрос к базе данных Joomla, необходимо осуществить пять операций:
Получение ссылки на объект JDatabase.
Формирование запроса.
Задание запроса.
Выполнение запроса.
При необходимости - загрузка результата.
Получение ссылки на объект JDatabase
JDatabase- абстрактный класс, предоставляющий доступ к соединению с базой данных. Это соединение создается при инициализации приложения Joomla, а в коде своего расширения мы можем получить ссылку на него с помощью метода getDbo статического класса JFactory:
$db =& JFactory::getDbo;
Формирование SQL-запроса
В старых версиях Joomla запросы формулировались в виде строки:
$query = 'SELECT * FROM #__categories';
В Joomla 1.6 появился объект JDatabaseQuery, методы которого позволяют упростить создание сложных SQL-запросов. Названия этих методов практически совпадают с ключевыми словами языка SQL: select, from, where, having, join и т.д. Использование объекта JDatabaseQuery иллюстрирует следующий пример:
$db = JFactory::getDbo; $query = $db->getQuery(true); $query->select('id, name'); $query->from('#__users'); $query->order('name'); $query->where('username LIKE \'a%\''); $db->setQuery($query); echo $query->__toString;
В данном примере мы получаем из таблицы #__users отсортированный по алфавиту список id и имен пользователей, чьи логины начинаются на букву "a". Данный код выведет на экран следующий SQL-запрос:
SELECT id, name FROM #__users WHERE username LIKE 'a%' ORDER BY name
Как известно, употребляющиеся в запросе названия полей и таблиц рекомендуется заключать в ограничители, чтобы избежать совпадений с зарезервированными словами. Кроме того, строковые значения в запросах также берутся в кавычки. Методы nameQuote и Quote заключают, соответственно, названия и значения в правильные ограничители. Для MySQL это обратные апострофы (``) для названий и обычные апострофы ('') для значений.
Рассмотрим пример использования этих методов:
$query = 'SELECT * FROM '.$db->nameQuote('#__users').' WHERE '.$db->nameQuote('username').'='.$db->Quote('admin');
Для базы данных MySQL с префиксом таблиц jos_ переменная $query примет следующее значение:
SELECT * FROM `jos_users` WHERE `username`='admin';
Задание запроса
Чтобы задать SQL-запрос для последующего выполнения, используется метод:
JDatabase setQuery(string $query, string $offset=0, string $limit=0)
где $query - это запрос, а $offset и $limit - соответственно смещение для начала выборки и количество выбираемых строк.
Например:
$db->setQuery($query, 0, 10);
Обратите внимание, что метод setQuery не выполняет запрос, а только задает его.
Выполнение запроса
Без выборки данных
Для выполнения запроса, не требующего выборки данных (например, UPDATE или INSERT), используется метод mixed query.
При успешном выполнении запроса метод возвращает указатель на его результат, в противном случае - false. Например:
$db =& JFactory::getDBO; $query = "UPDATE #__users SET block = 0 WHERE username LIKE 'a%'"; $db->setQuery($query); $result = $db->query;
С выборкой данных
В классе JDatabase существуют методы для получения форматированного результата. Их можно разделить на следующие группы: