Работа с базой данных в Joomla
Общая информация
При старте Joomla в числе прочих, создается объект класса database (исходники класса лежат в /includes/database.php), позволяющий Joomla работать с базой данных – выбирать данные и изменять их. Исторически сложилось, что данный класс лишь обертка над myslq_* функциями, пусть и очень удобная.
Префикс таблиц в Joomla
Так как Joomla изначально создавалась для учета реальных требований хостинга, то в ней заложен функционал доступа к таблицам, согласно их префиксу. Т.е. если ваш тарифный план на хостинге дает вам возможность использовать одну лишь базу данных MySQL, а вы хотите поставить, например две Joomla или какой-либо дополнительный скрипт, названия таблиц которого совпадают с некоторыми таблицами в Joomla, то это можно реализовать при помощи префикса таблиц.
Сам префикс задается еще при установке и чаще всего представляет собой нечто вроде “jos_” (JOS расшифровывается как Joomla Open Source) и записывается в файл конфигурации configuration.php.
Конечно, при работе с базой данных можно считывать эту переменную и каждый раз приписывать ее к именам таблиц в SQL-запросах, но намного удобнее использовать механизм, встроенный в Joomla, а именно макроподстановку #__ (знак решетки и два подчеркивания). В классе database данный символ будет заменен на текущий префикс таблиц, с которым работает Joomla. Например, если при установке вы оставили префикс пустым, то он и будет заменен на пустую строку, и названия таблиц будут самыми читабельными: users, session.
Методы класса database
- setQuery — один из самых часто используемых методов. Нужен для того, что бы объект записал запрос в свою внутреннюю переменную и заменил префикс на тот, который записан в файле конфигурации.
- query — используется для исполнения запроса, не возвращающего никаких данных. Например, вставки или удаления строк из таблицы по некоторому условию.
- loadObjectList — используется для выборки массива объектов представляющих собой наследники stdClass с именами полей совпадающих с именами столбцов в таблице.
- loadResultArray — загрузка массива результатов. Удобно при выборке одной колонки, а не нескольких.
- loadResult — загрузка одного поля. Т.е. мы знаем что результат будет только один.
Примеры использования:
- Загрузка списка пользователей
$database->setQuery("SELECT * FROM #__users"); $list = $database->loadObjectList(); foreach($list as $user) { echo $user->name; }
В результате мы увидим на экране имена всех пользователей на сайте. Отмечу, что для некоторых людей, ранее работавших с другими CMS и их слоями абстракции от БД, такой подход может оказаться немного странным. Они могли привыкнуть в цикле производить выборку данных и в этом же цикле с ними что-то делать, а здесь цикл выборки спрятан от глаз программиста, он сразу работает с данными. Надо просто привыкнуть, и позволить такие рутинные функции делать самой Joomla, а в цикле уже манипулировать данными, а не функциями выборки этих данных.
- Загрузка ID-статей из определенного раздела
$database->setQuery("SELECT id FROM #__content WHERE section_id=1"); $ids = $database->loadResultArray(); echo implode(',',$ids);//выведет нечто вроде "1,2,3,4,5,6"
- Загрузка email текущего пользователя
global $my; $database->setQuery("SELECT email FROM #__users WHERE id='{$my->id}'"); $email = $database->loadResult();
- Удаление из таблицы
$database->setQuery("DELETE FROM #__xxx WHERE id>20"); $database->query();
- Вставка данных
$database->setQuery("INSERT INTO #__table (name,value) VALUES ('волк','голодный')"); $database->query();
Если в таблице было создано поле типа AUTO_INCREMENT, то получить идентификатор вновь созданного поля можно при помощи метода insertid, если вызвать его сразу после непосредственной вставки данных.
$new_id = $database->insertid();
Отладка обращений к базе данных
Порой, во время написания компонента или модуля возникает такая ситуация, что метод loadObjectList возвращает не нужные нам значения, а NULL. Это происходит из-за того, что вы совершили ошибку в синтаксисе SQL-запроса. Для того, что бы узнать ее, вам необходимо вызвать специальный метод, отображающий последнюю ошибку, которая произошла в данном сеансе работы с сервером MySQL.
$database->setQuery(“SELECT * FROM qwerty”); $list = $database->loadObjectList(); echo $database->stderr();
Если таблицы не существует, то будет выведено сообщение примерно такого вида: “Table ‘joomla.qwerty’ doesn’t exist”. Для других ситуаций ошибки будут другими.
Реклама. Информация о рекламодателе по ссылкам в статье.