Запросы 

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

Регулярные Запросы 

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

$this->db->query('ВАШ ЗАПРОС');

Функция query() возвращает объект результата запроса к бд. Когда тип запросов “чтение” - можно использовать для отображения результатов. Когда тип запросов “запись” он просто возвращает TRUE или FALSE в зависимости от успеха или неудачи. При получении данных обычно записывают запрос в отдельную переменную:

$query = $this->db->query('ВАШ ЗАПРОС');

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

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

Он возвращает функцию базы данных “выполнение”. Что обычно TRUE/FALSE при успехе или неудаче для запросов типа INSERT, DELETE или UPDATE (что действительно должно быть использовано) и ресурс/объект при успехе для запросов с извлечением результататов.

if ($this->db->simple_query('ВАШ ЗАПРОС'))
{
        echo "Успех!";
}
else
{
        echo "Запрос рухнул!";
}

Примечание

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

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

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

$this->db->dbprefix('tablename'); // выведет prefix_tablename

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

$this->db->set_dbprefix('newprefix');
$this->db->dbprefix('tablename'); // выведет newprefix_tablename

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

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

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

Важно

Хоть построитель запросов будет стараться правильно цитировать любые поля и имена таблиц, которые вы ему передаете, обратите внимание, что он НЕ предназначен для работы с вводом данных пользователем. НЕ ПЕРЕДАВАЙТЕ ему непроверенные данные пользователя.

Эта функция также будет добавлять префикс к таблице, если он у вас указан в конфигурационном файле базе данных. Чтобы включить добавление префикса, установите TRUE (булево) вторым параметром:

$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 как (‘%’, ‘_’).

$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(); // Имеет ключи 'code' и 'message'
}