Интернет магазин Нижнего Тагила
Интернет Магазин
Знакомства в Нижнем Тагиле
Знакомства
Каталог
Каталог
Доска обьявлений
Доска обьявлений
Ремонт Нижний Тагил
Ремонт
Карта города Нижний Тагил
Карта города
 
  • Вы здесь
Админ
Администрация форума
Постов:63
Репутация: 12

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

#225 09/03/2012 07:57
Joomla! широко использует базу данных и предоставляет всевозможные инструменты для доступа к базе данных, а также для получения и обновления данных в ней. При инициализации, Joomla! создает подключение к базе данных, создавая глобальный экземпляр класса JDatabase.

Изнутри ваших расширений получить доступ к этому подключению можно, присвоив локальной переменной ссылку на этот экземпляр. Для этого применяется ссылочный оператор присваивания и статический метод getDBO() класса JFactory, как показано далее:

$db =& JFactory::getDBO();

Заметим, что необходимо использовать ссылочный оператор присваивания =& как ссылку на существующий объект базы данных; используя оператор присваивания = будет создана копия существующего объекта базы данных.

Два подкласса, JDatabaseMySQL и JDatabaseMySQLi, расширяют класс JDatabase в зависимости от установленной СУБД. Класс JDatabase имеет более пятидесяти методов, хотя, по всей вероятности, вы будете использовать небольшой их набор. Какими методами пользоваться в большей степени зависит от ваших персональных предпочтений и функциональных требований. Некоторые более легки в использовании, но они могут не удовлетворять вашим требованиям. Доступные для вас методы, подразделяются на четыре больших категории:

  • JDatabase::query метод
  • JDatabase::load методы
  • JDatabase::ADOdb методы
  • JTable методы

JDatabase::query()

Самым основным методом для доступа к базе данных является выполнение к ней запроса, при помощи метода JDatabase::query(). В то время как мы можем использовать этот метод для фактически любого запроса, вообще мы должны ограничить его использование для тех запросов, которые возвращают булевский результат: истину или ложь. Для управления запросами к базе данных, существуют более подходящие методы, которые будут обсуждаться на протяжении всей этой главы.

Выполнение запроса требует от нас применения двух методов: метод setQuery() обращается к базе данных с запросом, который должен быть выполнен, а метод query() выполняет текущий запрос.

Важно понимать, что метод setQuery() не выполняет запрос, он только определяет запрос для базы данных. Могут возникнуть обстоятельства, когда вы пожелаете выполнить один и тот же запрос несколько раз. Метод setQuery() будет вызван один раз, в то время как метод query() должен быть выполнен много раз. Такое возможно в цикле.

Метод setQuery() может быть вызван с тремя дополнительными необязательными параметрами в дополнение к строке запроса. Параметры offset и limit используются, когда мы хотим вывести, возвращаемый набор строк запроса, постранично. Параметр offset определяет стартовую строку, а limit максимальное количество возвращаемых строк. Каждый раз при выполнении запроса, обычно это происходит в цикле, возвращается определенное количество строк, а параметр offset получает приращение и устанавливается в следующую стартовую точку. Необязательный параметр prefix, позволяет нам изменит символический префикс таблицы базы данных и редко, если вообще когда-либо, используется.

Для выполнения установленного запроса мы используем метод query(). Этого метод аналогичен PHP функции mysql_query(). Результат выполнения запроса будет различен, в зависимости от типа запроса:
Если исполняется запрос типа SELECT, SHOW, DESCRIBE или EXPLAIN
в случае успешного выполнения запроса будет возвращен запрашиваемый ресурс
false в случае неудачи
Для запросов типа DELETE, INSERT, RENAME, REPLACE или UPDATE
true при успешном выполнении запроса
false если запрос потерпит неудачу

Следующий код установит запрос к базе данных, затем первое его выполнение вернет 20 строк начиная со строки 1 и разместит это в переменной $result1. Второе выполнение запроса вернет 20 строк начиная со строки 21 и разместит их в переменной $result2:

  $query = 'SELECT * FROM '.$db->nameQuote('contacts');
  $db =& JFactory::getDBO();
  $db->setQuery($query, 1, 20);
  $result1 = $db->query($query);
  $result2 = $db->query($query);

Мы обсудим строку запроса более подробно далее.

Написание запросов

Существует несколько правил, которых необходимо придерживаться при построении запросов к базе данных:
Используйте символический префикс #__ в начале наименований всех таблиц.
Используйте метод nameQuote() для инкапсулящии имен элементов запроса.
Используйте метод Quote() для инкапсуляции значений.
Символический префикс гарантирует, что мы используем верный префикс для текущей установки Joomla!, если необходимо, то может быть использован альтернативный символический префикс, как упоминалось в предыдущем параграфе. nameQuote() гарантирует, что наименование элементов будут инкапсулированы правильными разделителями. Quote() гарантирует, что значения будут инкапсулированы правильными разделителями. Этот пример демонстрирует использование всех трех правил:
$db = JFactory::getDBO();
$query = 'SELECT * FROM '
.$db->nameQuote('#__test')
.' WHERE '
.$db->nameQuote('name')
.' = '
.$db->Quote('Some Name');

Предполагая, что мы используем СУБД MySQL или MySQLi, $query будет эквивалентен следующей строке:

SELECT * FROM `jos_test` WHERE `name` = 'Some Name';

JDatabase::load методы

В то время как мы можем использовать метод query() и вручную обработать его результат, тем не менее будет проще воспользоваться одним из методов JDatabase для форматирования результата запроса. Какому из методов отдать предпочтение, зависит от трех вещей: данных, формата, в котором мы хотим их получить и наших личных предпочтений. Отличаются прежде всего по формату возвращаемых данных и включают в себя следующие методы:

Методы

:pinch: ВНИМАНИЕ: СПОЙЛЕР!

Методы, используемые в ядре Joomla!, чаще всего возвращают объекты.

Для помощи в объяснении каждого из методов, мы будем использовать простую таблицу #__test. Таблица имеет два поля, id — первичный ключ с автоматическим приращением, и name — поле типа varchar. В таблице ниже показаны данные, которые будут использоваться в демонстрационных целях:

id name
1 Foo
2 Bar

Первые два метода разработаны для возврата единственного значения (JDatabase::loadResult) или колонки значений (JDatabase::loadResultArray) из запроса соответственно.

loadResult():string

Этот метод загружает значение из первой ячейки результирующего набора. Если мы выбираем все данные из нашей таблицы, то этот метод будет возвращать значение из первой колонки первой строки результирующего набора данных. Это полезно в том случае, когда мы хотим получить доступ к одному полю из строки или когда результат выполнения запроса аналогичен функции COUNT(). Например, нам нужно вернуть значение из колонки name для записи 2:
$query = 'SELECT ' .nameQuote('name').
         ' FROM ' .nameQuote('#__test').
         ' WHERE ' .nameQuote('id').' = '.Quote('2');

$db =& JFactory::getDBO();
$db->setQuery($query);
echo $db->loadResult();

Результатом этого запроса будет значение Bar.
Этот метод так же можно использовать для определения общего количества строк в нашей таблице:
$query = 'SELECT COUNT(*) FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
echo $db->loadResult();

Результатом этого запроса будет количество строк, которое равно двум.

loadResultArray(numinarray:int=0):array

Этот метод загружает обычный массив значениями из результирующего набора, полученными из одной колонки найденными. Параметр numinarray используется для указания номера возвращаемой колонки. Колонка определяется ее логическим положением в результирующем наборе.
$query = 'SELECT '.nameQuote('name').
         ' FROM ' .nameQuote('#__test');
$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadResultArray());

В массиве применяется числовой индекс, значения которого начинаются с нуля:
Array
(
  [0] => Foo
  [1] => Bar
)

Нам постоянно требуется получать одну строку из базы данных. Например, для получения статьи существует три метода, которые вернут одну запись (строку значений): JDatabase::loadRow, JDatabase::loadAssoc и JDatabase::loadObject. Различие которых состоит только в формате возвращаемого результата.

loadRow():array

Этот метод загружает первую строку из результирующего набора в обычный массив. Полезен, когда нас интересует только одна строка. Если запрос вернет больше одной записи, то будет использоваться первая запись результирующего набора:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadRow());

Результат этого запроса будет следующим:
Array
(
  [0] => 1
  [1] => Foo
)

loadAssoc():array

Этот метод загружает первую строку результирующего набора в ассоциативный массив, используя в качестве ключей наименования колонок. Полезен, когда нас интересует только одна строка. Если запрос вернет больше одной строки, то загружена будет только первая строка результирующего набора:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadAssoc());

Выгода использования этого метода заключается в том, что его результатом будет ассоциативный массив, использующий в качестве ключей наименования колонок. Это делает его намного проще и безопаснее с точки зрения написания кода. Как можно видеть ниже, проще обратиться к элементу массива по наименованию колонки, чем пытаться помнить ее числовой индекс:
Array
(
  [id] => 1
  [name] => Foo
)

loadObject():stdClass

Этот метод загружает первую строку результирующего набора в экземпляр класса stdClass, используя в качестве имен свойств наименования колонок таблицы. Полезен, когда нас интересует только одна строка. Если запрос вернет больше одной строки, то использоваться будет первая строка результирующего набора:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadObject());

Результат этого запроса будет следующим:
stdClass Object
(
  [id] => 1
  [name] => Foo
)

Всякий раз, когда мы обращаемся к базе данных с запросом в ожидании того, что результат его выполнения будет будет содержать множество строк, Joomla! создаст массив. Этот массив может быть обычным или ассоциативным и каждый элемент массива будет представлять собой строку результирующего набора. Формат элемента этого массива может быть либо обычным массивом, либо ассоциативным массивом, либо объектом класса stdClass, в зависимости от того, какой из трех методов используется: JDatabase::loadRowList, JDatabase::loadAssocList или JDatabase::loadObjectList.

loadRowList(key:int):array

Этот метод загружает обычный массив массивов или ассоциативный массив массивов. Если мы определяем параметр key, то возвращаемый массив в качестве ключа использует ключ строк. В отличие от других загрузочных методов, key - это логическая позиция (0 указывает на первую колонку) поля первичного ключа результирующего набора:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadRowList(0));

Результат запроса будет следующим:
Array
(
 [0] => Array
  (
   [0] => 1
   [1] => Foo
  )
 [1] => Array
  (
   [0] => 2
   [1] => Bar
  )
)

loadAssocList(key:string=''):array

Этот метод загружает обычный массив ассоциативных массивов или ассоциативный массив ассоциативных массивов. Если определен параметр key, то возвращаемый массив будет использовать в качестве ключа ключ строки:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadAssocList());

Результат запроса будет следующим:
Array
(
 [0] => Array
  (
   [id] => 1
   [name] => Foo
  )
 [1] => Array
  (
   [id] => 2
   [name] => Bar
  )
)

loadObjectList(key:string=''):array

Этот метод загружает обычный массив объектов класса stdClass или ассоциативный массив объектов класса stdClass. Если определен параметр key, то возвращаемый массив использует в качестве ключа ключ строки:
$query = 'SELECT * FROM '.nameQuote('#__test');

$db =& JFactory::getDBO();
$db->setQuery($query);
print_r($db->loadObjectList());

Результат запроса будет следующим:
Array
(
 [0] => stdClass Object
  (
   [id] => 1
   [name] => Foo
  )
 [1] => stdClass Object
  (
   [id] => 2
   [name] => Bar
  )
)

JDatabase::ADOdb методы

ADOdb – это библиотека абстрактных классов для работы с базой данных на PHP, выпущенная под лицензией BSD. ADOdb поддерживает работу со многими ведущими СУБД. Joomla! не использует ADOdb, но эмулирует некоторую функциональность ADOdb в собственных абстрактных классах, работающих с базой данных.

Мы должны применять только методы ADOdb если переносим существующие приложения, полагающиеся на ADOdb или если мы содаем расширения, и также желаем, чтобы они работали как автономные приложения, использующие ADOdb. Приложение A, Joomla! Основные классы сожержит более подробную информацию о методах JDatabase::ADOdb.

Joomla! использует класс JRecordSet для эмуляции класса ADOdb ADORecordSet. Класс JRecordSet пока что не завершен и не включает реализацию всех методов класса ADORecordSet. Этот пример показывает основное использование класса JRecordSet; $row - массив:
$db =& JFactory::getDBO();
$rs = $db->Execute('SELECT * FROM #__test');
while ($row = $rs->FetchRow())
{
    // process $row
}

Для более подробной информации можно перейти по ссылке adodb.sourceforge.net/

Хотя эмуляция ADOdb была добавлена в Joomla!, необходимо отметить, что в настоящее время не существует планов по интеграции ADOdb в качестве основного средства доступа к базе данных на Joomla!.
Время создания страницы: 0.79 секунд

Каталог организаций Новые организации