Запросы
Основы Запросов
Регулярные Запросы
Для выполнения запроса используйте функцию 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 имеет три метода, которые помогут вам сделать это:
$this->db->escape() Эта функция определяет тип данных, так что он может обезопасить только строковые данные. Он также автоматически добавляет одинарные кавычки вокруг данных, так что вы не должны это делать самостоятельно:
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
$this->db->escape_str() Эта функция делает безопасными переданные ей данных вне зависимости от типа. Большую часть времени вы будете использовать вышеприведенную функцию нежели эту. Используйте функцию так:
$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";
$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'
}