Как получить результат запроса к базе данных
Примеры запросов и получения результатов
Как подключиться к базе данных
Как получить значение из одной ячейки таблицы базы данных
Как получить данные из строки базы данных
Как получить данные из нескольких ячеек строки базы данных
Как получить данные из нескольких строк базы данных
Как получить id (идентификатор) последней строки таблицы
Как создать новую строку в таблице
Как обновить одну ячейку в таблице базы данных
Как обновить данные в нескольких ячейках строки таблицы
Как удалить строку из таблицы базы данных
Несмотря на то, что Joomla поддерживает стандартные SQL-запросы, при создании кода рекомендуется использовать цепочку запросов, соединяющую несколько методов; при этом каждый метод возвращает объект и улучшает работу с кодом. Прежде, чем создавать запросы, необходимо получить экземпляр класса для работы с базой данных, который автоматически подключается к базе (см. пример "Как подключиться к базе данных").
Принцип создания запросов
В начале каждого запроса создаётся новый объект:
$query = $db
->getQuery(true)
Далее указывается метод запроса, например, select ("выбрать"), insert ("вставить"), update ("обновить"), delete ("удалить") и так далее:
->select($db->quoteName('column'))
Обратите внимание!
Метод quoteName() добавляет соответствующие кавычки вокруг имен столбцов, чтобы избежать конфликтов с любым зарезервированным словом базы данных, сейчас или в будущем. Метод quote() экранирует строку, т.е. добавляет обратную косую черту перед некоторыми символами, которые могут представлять опасность, и оборачивает эту строку в одинарные кавычки. При использовании некоторых данных, например, при вставке файла изображения в базу данных (не ссылки на файл, а именно самого файла в поле типа BLOB), из-за экранирования могут возникнуть проблемы и файл при вставке на страницу не будет открываться. Решение данной проблемы простое: отключить функцию экранирования, но оставить одинарные кавычки. Для этого в метод нужно передать не только переменную с данными, но и второй аргумент - false:
$db->quote($value, false)
Метод select может использовать различные данные. Это может быть указание на всю строку ('*'), один конкретный столбец ('column') или на несколько столбцов; в последнем случае столбцы указываются в виде массива:
->select($db->quoteName(array('column1', 'column2', 'column3', 'column4')))
Так же могут быть указаны различные функции SQL, например, функция получения id последней строки:
->select('MAX(id)')
Методы insert, update, delete указывают таблицу, причём применение в начале символов #__ позволяет использовать запрос при любом префиксе таблицы:
->insert($db->quoteName('#__table'))
Следующая строка запроса зависит от метода, указанного в предыдущей строке. Это может быть метод from, который применяется вместе с select и означает "из таблицы":
->from($db->quoteName('#__table'))
Это может быть метод columns, который применяется вместе с insert и указывает на создаваемые столбцы; перечисление столбцов представляется в виде массива:
->columns($db->quoteName(array('column1', 'column2')))
Так же это может быть метод set, представляющий в виде массива пары столбец/значение для update, и т.д.
Ещё одна строка с методом where указывает, к чему применяется запрос, например:
->where($db->quoteName('id') . " = " . $db->quote($value));
Данный вариант указывает на идентификатор 'id', равный значению $value. Значения могут быть указаны как в виде переменной, так и в виде строки, взятой в одинарные кавычки.
Далее создаётся запрос с использованием созданного выше объекта:
$db->setQuery($query);
Как получить результат запроса к базе данных
Заключительным этапом является выполнение запроса и (при необходимости) получение результата. Если требуется просто выполнить запрос, например, выполнить обновление update или удаление delete строки, то применяется команда
$db->execute();
Если требуется получить результат в виде одного значения, например, значения из одной ячейки, то применяется
$result = $db->loadResult();
а если требуется получить результат в виде массива значений, то необходим другой метод:
$result = $db->loadRow();
Так же вы можете получить результат в виде ассоциативного массива; его отличие в том, что в качестве ключа для значения каждой ячейки применяется имя столбца, в котором расположена ячейка, т.е. вы получаете не просто пронумерованный массив, начинающийся с нуля, а массив, в котором видно, какое значение принадлежит какому столбцу:
$result = $db->loadAssoc();
При помощи следующего метода вы получите всё тоже самое, но уже в виде PHP-объекта:
$result = $db->loadObject();
Иногда возникает необходимость получить данные всего столбца а не строки; следующий код выведет результат в виде массива:
$result = $db->loadColumn();
Обратите внимание на то, что при использовании данного метода получения результата в методе select можно указывать не только один определённый столбец, а использовать массив из нескольких столбцов; в этом случае loadColumn(0) выведет данные из первого указанного в этом массиве столбца, loadColumn(1) - из второго, loadColumn(2) - из третьего и так далее.
Так же существует вариант вывода всех данных таблицы в виде индексированного массива, содержащего индексированные массивы данных строк таблицы:
$result = $db->loadRowList();
В этом случае вы получите нечто подобное:
Array (
[0] => Array([0] => 1, [1] => value1, [2] => value2, [3] => value3),
[1] => Array([0] => 2, [1] => value1, [2] => value2, [3] => value3),
[2] => Array([0] => 3, [1] => value1, [2] => value2, [3] => value3)
)
Если необходимо получить результаты в виде ассоциативных массивов, нужно использовать код
$result = $db->loadAssocList();
Если в таком варианте указать в скобках определённый ключ в виде названия какого-либо столбца, то для основного массива в качестве ключей будут использованы не индексы (цифры от 0 и далее), а данные из соответствующих строк этого столбца, т.е. эти данные для этой строки будут использованы в качестве идентификатора.
Если же в скобках указать названия двух столбцов (через запятую), то в результате будет выведен ассоциативный массив, где в качестве ключей будут указаны данные из первого указанного столбца, а в качестве значения - из второго.
Результат метода $db->loadAssocList() можно получить в виде объекта; в этом случае запрос должен выглядеть так:
$db->loadObjectList();
При этом точно так же можно указать в скобках одно значение (название столбца), данные из которого будут использованы в качестве ключей для основного массива.
Примеры запросов и получения результатов
Как подключиться к базе данных
$db = JFactory::getDbo();
Как получить значение из ячейки таблицы
Этим способом вы получите только одно значение из столбца 'column' таблицы '#__table' с идентификатором 'id' равным значению переменной $value; вместо переменой можно вписать непосредственно значение, например, '1':
$query = $db
->getQuery(true)
->select($db->quoteName('column'))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . " = " . $db->quote($value));
$db->setQuery($query);
$result = $db->loadResult();
Как получить данные из строки базы данных
Этот код позволяет получить значение из одной строки таблицы '#__table' базы данных с идентификатором 'id' равным значению переменной $value; вместо переменой можно вписать непосредственно значение, например, '1':
$query = $db
->getQuery(true)
->select('*')
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . " = " . $db->quote($value));
$db->setQuery($query);
$result = $db->loadRow();
Как получить данные из нескольких ячеек строки базы данных
Если необходимо получить не всю строку таблицы '#__table', а только данные из нескольких её ячеек, воспользуйтесь таким кодом:
$query = $db
->getQuery(true)
->select($db->quoteName(array('column1', 'column2', 'column3', 'column4')))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . " = " . $db->quote($value));
$db->setQuery($query);
$result = $db->loadRow();
Как получить данные из нескольких строк базы данных
Получать данные построчно далеко не всегда выгодно, так как это увеличивает количество запросов и, соответственно, время ответа сервера. При помощи нескольких строк where и использования метода loadRowList() можно получить значения сразу из нескольких строк таблицы; это можно сделать разными способами.
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . ' = ' . $db->quote('1'), 'OR')
->where($db->quoteName('id') . ' = ' . $db->quote('2'), 'OR')
->where($db->quoteName('id') . ' = ' . $db->quote('3'));
$db->setQuery($query);
$numberList = $db->loadRowList();
В данном примере переменная $numberList получает массив, состоящий из трех массивов, содержащих данные столбцов 'id', 'type', 'name', 'status' строк с id равным 1, 2 и 3. Обратите внимание на то, что нет необходимости указывать id, следующие по порядку: это могут быть абсолютно любые строки таблицы.
Можно получить тоже самое, установив лимит по количеству строк:
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->setLimit('3');
$db->setQuery($query);
$recipeNumberList = $db->loadRowList();
В данном примере переменная $numberList получит значения указанных столбцов из первых трёх строк таблицы.
Если требуется указать, с какой нужно начинать строки (строки ис определённым id), используется следующий вариант:
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . ' > ' . $db->quote('8'))
->setLimit('5');
$db->setQuery($query);
$numberList = $db->loadRowList();
В этом примере переменная $numberList получает содержимое указанных столбцов из 9, 10, 11, 12 и 13 строки, т.е. первых пяти строк (определено лимитом), id которых больше указанного (8).
Так же можно получить значения, соответствующие сразу нескольким условиям или одному из условий:
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . ' = ' . $db->quote('1'), 'OR')
->where($db->quoteName('id') . ' = ' . $db->quote('2'), 'OR')
->where($db->quoteName('id') . ' = ' . $db->quote('3'), 'OR');
$db->setQuery($query);
$numberList = $db->loadRowList();
Вариант, представленный выше, уже был рассмотрен в начале: выводятся все строки, запрошенные методом where, которые соответствуют условиям (в данном случае - имеют указанные id).
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->where($db->quoteName('id') . ' > ' . $db->quote('10'))
->where($db->quoteName('status') . ' = ' . $db->quote('activated'))
->setLimit('5');
$db->setQuery($query);
$numberList = $db->loadRowList();
В данном примере будут выведены 5 следующих по порядку строк (установлено лимитом), для которых выполняются сразу два условия: значение id больше 10 и в столбце 'status' указано значение 'activated', т.е. строки с другим статусом будут проигнорированы.
Так же вы можете получить данные из строк, в которых содержится заданная информация - слово, фраза, число и так далее. Для этого используется оператор LIKE; просто добавьте ещё одну строку:
->where($db->quoteName('status') . ' LIKE ' . $db->quote('activated'))
Данное условие позволит вывести все строки, где в столбце 'status' есть значение 'activated'; при этом будут учитываться и другие условия, прописанные в других where. Искомый шаблон может быть указан разными способами: просто определённым словом (как в примере), или с применением символов '%' или '_'. Наличие '%' (символ процента) указывает на любые другие символы (например, 'activated%' указывает, что значение в ячейке начинается со слова activated), а символ '_' (нижнее подчёркивание) указывает лишь на один любой символ. Примеры:
- '_activated%' - любые значения, где есть 'activated' и какой-либо один символ впереди;
- 'activated%' - любые значения, начинающиеся с 'activated';
- '%activated' - любые значения, заканчивающиеся на 'activated';
- '%activated%' - любые значения, где есть 'activated'.
Полученные значения можно отсортировать при помощи метода order.
$query = $db
->getQuery(true)
->select($db->quoteName(array('id', 'type', 'name', 'status')))
->from($db->quoteName('#__table'))
->setLimit('10')
->order('id DESC');
$db->setQuery($query);
$numberList = $db->loadRowList();
В данном примере будет создан массив, состоящий из 10 массивов значений столбцов 'id', 'type', 'name', 'status' последних десяти строк таблицы базы данных (в обратном порядке, т.е. начиная с последней строки). Что бы получить данные, например, столбца 'name', нужно прописать код
$result = $numberList[id строки][2];
Если вы хотите получить значения начиная с первых строк таблицы, вместо DESC используйте ASC.
Как получить id (идентификатор) последней строки таблицы
Как узнать, сколько строк в таблице на данный момент? Довольно часто необходимо получить номер последней строки таблицы; для этого используется следующий код:
$query = $db
->getQuery(true)
->select('MAX(id)')
->from($db->quoteName('#__table'));
$db->setQuery($query);
$result = $db->loadResult();
Как создать новую строку в таблице
Данный код вносит в конец таблицы '#__table' новую строку. Обратите внимание на то, каким образом должны быть указаны записываемые в ячейки данные, а так же на то, что весь процесс завершается командой $db->execute(); .
$query = $db
->getQuery(true)
->insert($db->quoteName('#__table'))
->columns($db->quoteName(array('column1', 'column2')))
->values(implode(',', array($id, $db->quote($val1), $db->quote($val2))));
$db->setQuery($query);
$db->execute();
Как обновить одну ячейку в таблице
Что бы обновить данные в таблице '#__table' в ячейке, расположенной в столбце 'column' строки с идентификатором 'id', равным значению 'value', воспользуйтесь следующим кодом:
$query = $db
->getQuery(true)
->update($db->quoteName('#__table'))
->set($db->quoteName('column') . " = " . $db->quote($value))
->where($db->quoteName('id') . " = " . $db->quote('value'));
$db->setQuery($query);
$db->execute();
Как обновить данные в нескольких ячейках
Для обновления данных в нескольких ячейках строки или во всей строке, удобнее воспользоваться отдельной переменной $row_update, представляющей собой массив из пар столбец/значение:
$row_update = array(
$db->quoteName('column1') . ' = ' . $db->quote('value'),
$db->quoteName('column2') . ' = ' . $db->quote('value'),
$db->quoteName('column3') . ' = ' . $db->quote('value')
);
$query = $db
->getQuery(true)
->update($db->quoteName('#__table'))
->set($row_update)
->where($db->quoteName('id') . " = " . $db->quote('value'));
$db->setQuery($query);
$db->execute();
Как удалить строку из таблицы базы данных
Удалить из таблицы '#__table' строку, значение идентификатора 'id' равно 'value' можно при помощи такого кода:
$query = $db
->getQuery(true)
->delete($db->quoteName('#__table'))
->where($db->quoteName('id') . " = " . $db->quote('value'));
$db->setQuery($query);
$db->execute();
---