
Мы продолжаем изучение фрэймворка CodeIgniter. Сегодня речь пойдет о работе с базами данных.
В прошлой статье мы начали разработку небольшого сайта, представляющего собой обычный каталог. Мы уже определились со структурой данных, установили и настроили CodeIgniter. А также написали контроллер с двумя методами, которые будут создавать страницу с общим перечнем книг и страницу с подробной информацией о выбранной книге.
Т.к. обоим методам нужна информация из базы данных, рассмотрим возможности CodeIgniter в плане работы с БД.
В соответствии с архитектурой MVC для работы с данными используется модель. Что бы создать модель в CodeIgniter нужно написать класс, наследующий Model и поместить его в папку system/application/models.
Для нашего приложения достаточно одной модели, назовем ее Catalogmodel. Создаем файл system/application/models/catalogmodel.php и записываем в него следующий код.
<?php
class Catalogmodel extends Model {
function Catalogmodel() {
parent::Model();
}
}
?>
Теперь нам нужно подключить библиотеку для работы с базами данных. Для этого открываем файл system/application/config/autoload.php и ищем переменную $autoload['libraries']. Она содержит массив с названиями всех библиотек, которые будут автоматически загружаться при обращении к сайту. Мы добавим загрузку библиотеки «database».
$autoload['libraries'] = array('database');
Небольшое отступление
Одним из преимуществ CodeIgniter является низкое потребление ресурсов. Достигается это в основном за счет того, что по-умолчанию загружается только минимально необходимый для работы набор библиотек (ядро). Какие из дополнительных библиотек загружать решаете вы. И CodeIgniter предоставляет несколько вариантов их загрузки.
В данном случае мы добавили название библиотеки в $autoload, т.к. все методы нашего контроллера будут работать с БД. Если данные из БД нужны только для создания части страниц, то лучше загружать библиотеку непосредственно перед использованием.
$this->load->database();
Переходим к подключению к базе данных. Вообще-то CodeIgniter позволяет работать одновременно с несколькими БД, но мы ограничимся самым простым вариантом. Открываем файл system/application/config/database.php и заполняем массив с параметрами подключения:
$db['default']['hostname'] = "localhost"; //имя хоста, на котором запущен сервер БД $db['default']['username'] = "имя_пользователя_БД"; $db['default']['password'] = "пароль"; $db['default']['database'] = "bookcatalog"; // имя базы данных
Теперь можно работать с БД с помощью объекта db. Например, отправить запрос можно с помощью функции query().
$this->db->query('строка_запроса');
Итак, база данных доступна, запросы мы выполнять можем. Осталось написать методы нашей модели. Для нашего примера достаточно двух методов.
Первый будет возвращать данные обо всех книгах в БД без аннотаций, т.е. информацию, необходимую для создания главной страницы каталога.
function getAllBooks() {
$qGetAll = "SELECT id, title, author, pages, genre FROM books";
$res = $this->db->query($qGetAll);
$booksData = $res->result_array();
if (count($booksData) == 0) {
return false;
}
return $booksData;
}
В строках 2 и 3 мы формируем и отправляем запрос. В результате получаем объект с результатами и преобразуем его в массив (с помощью метода result_array()).
Примечание. CodeIgniter предоставляет ряд методов для работы с результатами запроса. Их описание можно посмотреть здесь.
После этого, мы проверяем длину массива. И если она равна нулю (каталог пуст), возвращаем false. В противном случае, возвращаем массив с результатами.
Второй метод используется для создания страницы с подробной информацией о выбранной книге.
function getBookDetails($bookId) {
$qGetBook = "SELECT * FROM books WHERE id=?";
$res = $this->db->query($qGetBook, array($bookId));
$bookData = $res->result_array();
if (count($bookData) == 0) {
return false;
}
return $bookData[0];
}
В параметре $bookId методу передается значения поля id выбранной книги.
Обратите внимание на то, как мы формируем запрос. В строке запроса вместо значения параметра id мы ставим знак вопроса. А методу query() в качестве второго параметра передаем массив со значениями. При отправке запроса значения будут подставлены вместо знаков вопроса.
Что дает такой подход? Во-первых, запрос легче читается. Во-вторых, все спецсимволы SQL будут автоматически преобразованы в эскейп последовательности.
Примечание. Если вы формируете строку с параметрами запроса самостоятельно, не забывайте использовать метод escape(). Например, так $this->db->escape($title). Это позволит защититься от SQL Injection.
Дальнейшая работа метода практически полностью аналогична getAllBooks(). Единственное отличие заключается в том, что в данном случае мы возвращаем только первый элемент массива с результатами, т.к. в нем не может быть больше одного элемента.
Все, модель нашего каталога готова. В следующий раз мы допишем контроллер и создадим страницы нашего каталога.
До встречи!


