Собираем
информацию
по крупицам

Web - разработка

Работа базы SQLite 3 в CodeIgniter 2
19-08-2012
11:29:06

В популярном веб-фреймверке CodeIgniter с поддержкой БД в формате SQLite 3 всё не слава богу. В устаревшем CodeIgniter (версии 1.7.x) ситуация была настолько запущена, что пришлось делать самодельный драйвер. Спустя пару лет, мы наблюдаем то же самое в CodeIgniter 2.

 

Давайте разбираться, как включить поддержку SQLite 3 в актуальной на текущий момент версии CodeIgniter 2.1.2.

 

 

Как строится работа с SQLite3 в CodeIgniter

 

Базы SQLite3 поддерживаются в CodeIgniter через механизм PDO. Таким образом, для работы с SQLite3 нам потребуется PDO-драйвер. В CodeIgniter 2 такой драйвер появился только в версии 2.1.x, так что те, кто пользуется стабильной версией 2.0.3 должны знать, что включить в ней поддержку SQLite3 не получится по причине отсутсвия нужного драйвера.

 

В версии 2.1.x наконец-то появился PDO-драйвер. И судьба его оказалась нелегка. Вначале он не мог работать с SQLite3 базами (портилась строка подключения к базе), потом в версии 2.1.1 отчитались о том, что работу восстановили:

 

Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite.

 

А в версии 2.1.2 поддержка SQLite3 опять оказалась разломанной.

 


Cостояние PDO-драйвера в CodeIgniter 2.1.2

 

В текущей официальной версии CodeIgniter 2.1.2 PDO-драйвер находится в недоделанном состоянии. Если откроем файл /system/database/driver/pdo/pdo_driver.php, то увидим следующий загадочный код:

 

empty($this->database) OR $this->hostname .= ';dbname='.$this->database;

 

Не знаю, что хотели сказать авторы этим кодом, но вставив отладку в место, где происходит инициализация открытыя PDO-хэндла в методе db_connect(), можно наблюдать следующую строку подключения:

 

";dbname=sqlite:/путь/к/файлу/базы/файл.sqlite"

 

Может быть, такое имя подключаемой базы данных может переварить какой-нибудь MySQL over DPO, но вот для SQLite3 эта строка непонятна. Строка должна быть такой:

 

"sqlite:/путь/к/файлу/базы/файл.sqlite"

 

то есть, в строке должно содержаться именно то, что прописано в конфиге /application/config/database.php:

 

$db['default']['database'] = 'sqlite:'.APPPATH.'какой_то_путь/db.sqlite';

 

 

Исправление PDO-драйвера в CodeIgniter 2.1.2

 

Поняв в чем проблема, внесем исправление в файл pdo_driver.php. Закомментируем строку:

 

empty($this->database) OR $this->hostname .= ';dbname='.$this->database;

 

И вместо нее вставим следующий код:

 

empty($this->database);
if(strpos($this->database, 'sqlite:') !== FALSE)
   $this->hostname .= $this->database;
else
   $this->hostname .= ';dbname='.$this->database;

 

После такого исправления, подключение к SQLite3 базе через PDO драйвер начнет работать. Приведу пример настроек в /application/config/database.php, при которых работает соединение с SQLite3 базой:

 

$db['default']['hostname'] = '';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = 'sqlite:'.APPPATH.'какой_то_путь/db.sqlite';
$db['default']['dbdriver'] = 'pdo';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

 

Соединение с базой будет установлено, казалось бы, все должно работать? Да, но если вы не забудете сделать одну важную вещь. На файл с базой данных нужно установить правильные права на чтение и запись. В UNIX-подобных системах скорее всего по-умолчанию у вас будут установлены права, позволяющие читать базу, но не позволяющие записывать. Самое неприятное, что сообщения об ошибке записи в файл базы показываться не будет, даже если выставить все опции видимости ошибок:

 

В php.ini:

 

display_errors = On

error_reporting = E_ALL & ~E_DEPRECATED

 

В index.php:

 

define('ENVIRONMENT', 'development');

 

В APPPATH/config/config.php:

 

$config['log_threshold'] = 4;

 

В APPPATH/config/database.php:

 

$db['default'] = array(

 ...

 'db_debug' => TRUE,

 ...

 

То есть, если запись в базу SQLite3 молча не работает, ставьте права

 

chmod ugo+w файл

 

на файл базы данных.

 

 

Что будет дальше с PDO-драйвером в CodeIgniter 2

 

В секретных лабораториях EllisLab наконец-то поняли, что одним PDO-механизмом для работы с разными БД не обойдешься. PDO-механизм обеспечивает только универсальность подключения к БД. Но проблема в том, что в разных БД могут отличаться запросы для выполнения стандартных операций. Например, SQL-команда получения количества записей в таблице для MySQL и SQLite сильно отличается. И эти различия нужно учитывать в драйвере, если поверх него наложена абстракция ActiveRecord.

 

Поэтому, в текущей разрабатываемой версии CodeIgniter, для PDO-драйвера начали создавать механизм субдрайверов. В перспективе это приведет к тому, что поддержка различных баз данных (и файловых и клиент-серверных) наконец-то будет приведена в порядок. Но на появление правильной и безглючной поддержки SQLite3 я бы в настоящее время не расчитывал.

 

Кроме SQLite-субдрайвера PDO, в разрабатываемой версии CodeIgniter появился отдельный драйвер под названием sqlite3. То есть, предполагается, что для подключения к SQLite3 базе можно будет использовать следующие настройки:

 

$db['default']['database'] = APPPATH.'какой_то_путь/db.sqlite';
$db['default']['dbdriver'] = 'sqlite3';

 

Какой драйвер будет лучше, сказать не могу, но о возможном появлении двух разных драйверов для SQLite3 вы должны знать.

 

UPD: В результате работы над поддержкой SQLite3 в CodeIgniter 2, написан временный SQLite3-драйвер (такой же драйвер я писал и для CodeIgniter 1.7.x). Страничка проекта находится здесь:

 

Драйвер SQLite3 для CodeIgniter 2.x

 

Удачи.

 


К списку "Компьютерное"

Интересное на сайте


Интерфейс и юзабилити » Оформление кода: Почему я выбрал для себя отступ в 2 пробела?

В мире программирования существует достаточно холиварная тема: "Каким должен быть отступ в коде"?   Оставим за бортом споры по теме "Форматироват...


Перевод документации Ext JS 4.2 » Ext JS 4.2. Часть 3.8: Запись данных на сервер

  Запись данных на сервер   Все достаточно просто. Нам нужно сохранять на сервер изменения, сделанные в интерактивном режиме на стороне брау...


Классическая анимация » Прыгающая подушка

Оборудование: Pentium-IV, Wacom Graphire3 CTE-630 Среда: Flash 8 Год: 2005   Первая и, видимо, последняя попытка нарисовать мини-мультфильм по т...

RSS подписка

Подпишитесь на новости сайта по RSS


О, смотри-ка какое хорошее место. Дайте два!

Внимание!


На этом сайте разрабатывается программа MyTetra и её родственные проекты. Доступны к просмотру следующие базы знаний:

 

База Xintrea (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

База Rarrugas (1, 2)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

База Anatolean

База Аrmagedec

База SorokinRed

База Deadelf79

 

Требуют доработки:

 

База Tairesh

База Ivnglkv

База Kolyag87

База Andyk101

База Garik456456

База Harpokrat

База SalexIzyh

База Duwaz

 

Подробности на странице MyTetra Share.

 WebHamster.Ru
 Домик любопытного хомячка
Яндекс индекс цитирования
Почтовый ящик