Spec-Zone.ru › CodeIgniter 3

Запросы

Основы запросов

Обычные запросы

Для отправки запроса используйте функцию query:

$this->db->query('YOUR QUERY HERE');

Функция query() возвращает объект результата базы данных при выполнении запросов типа «чтение», который вы можете использовать для отображения результатов. При выполнении запросов типа «запись» она просто возвращает ИСТИНА или ЛОЖЬ в зависимости от успеха или неудачи. При получении данных вы обычно присваиваете запрос своей переменной, например так:

$query = $this->db->query('YOUR QUERY HERE');

Упрощенные запросы

Метод simple_query — это упрощенная версия метода $this->db->query(). Он НЕ возвращает набор результатов базы данных, не устанавливает таймер запроса, не компилирует данные привязки или не сохраняет ваш запрос для отладки. Он просто позволяет вам отправить запрос. Большинство пользователей редко используют эту функцию.

Она возвращает то, что возвращает функция «execute» драйверов базы данных. Как правило, это ИСТИНА/ЛОЖЬ при успехе/неудаче для запросов типа записи, таких как INSERT, DELETE или UPDATE (для чего она, по сути, и предназначена), и ресурс/объект при успехе для запросов с извлекаемыми результатами.

if ($this->db->simple_query('YOUR QUERY'))
{
        echo "Success!";
}
else
{
        echo "Query failed!";
}

Примечание

Функция PostgreSQL pg_exec() (например) всегда возвращает ресурс при успехе, даже для запросов типа записи. Имейте это в виду, если вы ищете булевое значение.

Работа с префиксами базы данных вручную

Если вы настроили префикс базы данных и хотите добавить его к имени таблицы для использования в собственном SQL-запросе, например, то вы можете использовать следующее:

$this->db->dbprefix('tablename'); // outputs prefix_tablename

Если по какой-либо причине вы хотите изменить префикс программно, без необходимости создания нового подключения, вы можете использовать этот метод:

$this->db->set_dbprefix('newprefix_');
$this->db->dbprefix('tablename'); // outputs newprefix_tablename

Защита идентификаторов

Во многих базах данных рекомендуется защищать имена таблиц и полей — например, с помощью обратных кавычек в MySQL. Запросы Query Builder автоматически защищаются, однако если вам нужно вручную защитить идентификатор, вы можете использовать:

$this->db->protect_identifiers('table_name');

Важно

Хотя Query Builder постарается правильно процитировать любые имена полей и таблиц, которые вы ему передаёте, имейте в виду, что он НЕ предназначен для работы с произвольными пользовательскими данными. НЕ передавайте ему необработанные пользовательские данные.

Эта функция также добавит префикс таблицы к вашей таблице, предполагая, что вы указали префикс в файле конфигурации базы данных. Для включения префикса установите ИСТИНА (булево) через второй параметр:

$this->db->protect_identifiers('table_name', TRUE);

Экранирование запросов

Очень хорошая практика безопасности — экранировать ваши данные перед отправкой в базу данных. CodeIgniter предоставляет три метода, которые помогут вам в этом:

  1. $this->db->escape() Эта функция определяет тип данных, чтобы экранировать только строковые данные. Она также автоматически добавляет одинарные кавычки вокруг данных, так что вам не придётся:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
  2. $this->db->escape_str() Эта функция экранирует передаваемые данные, независимо от типа. В большинстве случаев вы будете использовать вышеуказанную функцию, а не эту. Используйте функцию так:

    $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
    
  3. $this->db->escape_like_str() Этот метод следует использовать, когда строки будут использоваться в условиях LIKE, чтобы символы подстановки LIKE (‘%’, ‘_’) в строке также были должным образом экранированы.
$search = '20% raise';
$sql = "SELECT id FROM table WHERE column LIKE '%" .
    $this->db->escape_like_str($search)."%' ESCAPE '!'";

Важно

Метод escape_like_str() использует ‘!’ (восклицательный знак) для экранирования специальных символов для условий LIKE. Поскольку этот метод экранирует частичные строки, которые вы сами обернёте в кавычки, он не может автоматически добавить условие ESCAPE '!', и поэтому вам придётся сделать это вручную.

Связывание запросов

Связывания позволяют упростить синтаксис запросов, позволяя системе собирать запросы за вас. Рассмотрим следующий пример:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));

Знаки вопроса в запросе автоматически заменяются значениями в массиве во втором параметре функции запроса.

Связывание также работает с массивами, которые будут преобразованы в наборы IN:

$sql = "SELECT * FROM some_table WHERE id IN ? AND status = ? AND author = ?";
$this->db->query($sql, array(array(3, 6), 'live', 'Rick'));

Результирующий запрос будет:

SELECT * FROM some_table WHERE id IN (3,6) AND status = 'live' AND author = 'Rick'

Дополнительным преимуществом использования связываний является то, что значения автоматически экранируются, что обеспечивает более безопасные запросы. Вам не нужно помнить, чтобы вручную экранировать данные; движок делает это автоматически.

Обработка ошибок

$this->db->error();

Если вам нужно получить последнюю произошедшую ошибку, метод error() вернёт массив, содержащий его код и сообщение. Вот быстрый пример:

if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`'))
{
        $error = $this->db->error(); // Has keys 'code' and 'message'
}

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/database/queries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API