PHP framework CodeIgniter: работа с базой данных

Владимир | | CodeIgniter, PHP.

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

Все, модель нашего каталога готова. В следующий раз мы допишем контроллер и создадим страницы нашего каталога.

До встречи!

  • Евгений

    Кое-что о фреймворке можно почерпнуть из русской документации 🙂
    http://code-igniter.ru

  • Евгений

    Кое-что о фреймворке можно почерпнуть из русской документации 🙂
    http://code-igniter.ru

  • vit

    а где прописовать function getAllBooks и function getBookDetails в каких файлах скажите плиз

    • В файле модели
      system/application/models/catalogmodel.php

  • vit

    а где прописовать function getAllBooks и function getBookDetails в каких файлах скажите плиз

    • В файле модели
      system/application/models/catalogmodel.php

  • отличный сайт у вас!
    вот только поправка по поводу базы данных:

    ручная загрузка библиотеки для работы с базой осуществляется вот так:

    $this->load->database();

    • Спасибо, я исправил. Честно говоря, не помню когда последний раз загружал ее вручную 😉

  • отличный сайт у вас!
    вот только поправка по поводу базы данных:

    ручная загрузка библиотеки для работы с базой осуществляется вот так:

    $this->load->database();

    • Спасибо, я исправил. Честно говоря, не помню когда последний раз загружал ее вручную 😉

  • Progvlad

    учебники по программированию можно еще поискать тут ychebniki.ru

  • Tango

    *** extends CI_Model

  • Tango

    Точнее так: