Работа с базой данных в Joomla

Версия для печати

Материал из База знаний Joomla

Перейти к: навигация, поиск

Это статья из раздела Программирование для 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”. Для других ситуаций ошибки будут другими.

К этой странице обращались 98 041 раз.
Последнее изменение этой страницы: 19:01, 27 марта 2009.