Мы продолжаем изучение фрэймворка 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()
. Единственное отличие заключается в том, что в данном случае мы возвращаем только первый элемент массива с результатами, т.к. в нем не может быть больше одного элемента.
Все, модель нашего каталога готова. В следующий раз мы допишем контроллер и создадим страницы нашего каталога.
До встречи!