Я пытаюсь использовать sqlite из PHP. У меня есть такой простой код:
<?php
$db = new SQLiteDatabase("test2.sdb");
unset($db);
?>
В результате этого кода (который я выполняю в командной строке «php test2.php») я получаю:
Fatal error: Class 'SQLiteDatabase' not found in /var/www/test2.php on line 3
Кто-нибудь знает, как я могу заставить PHP использовать sqlite?
Я обнаружил, что «поддержка SQLite включена по умолчанию в стандартной компиляции PHP для Linux, начиная с PHP 5.0». И у меня есть «Версия PHP => 5.2.6-2ubuntu4.6». Таким образом, sqlite должен быть включен, если только нет опции «--disable-sqlite». В моем случае вывод «phpinfo ();» вообще не содержит sqlite.
Ответ 1
Класс SQLiteDatabase — это объект из библиотеки sqlite, поддержка которой была прекращена в PHP 5.4, но на различных системах и конфигурациях могла быть отключена в более ранних релизах, так как эта библиотека уже давно была помечена как устаревшая.
Библиотека php_sqlite.dll (Windows) или php_sqlite.so (Linux) больше не поддерживается в новых версиях PHP и была заменена на php_sqlite3.dll или php_sqlite3.so соответственно.
Вы можете:
Попытаться найти php_sqlite.dll (php_sqlite.so) где-нибудь в Интернете. Однако вам придется тщательно подобрать старый файл библиотеки SQLite к платформе вашего PHP (x64 или x86), движку сборки (VC6, VC9 или VC11), версии (5.x) и типу (TS для потокобезопасного или NTS для непотокобезопасного). Это может оказаться сложной задачей.
Оставьте php_sqlite.dll (SQLiteDatabase) и перейдите на новый php_sqlite3.dll (объект SQLite3). Сначала вам придется использовать такой инструмент, как SQLite Studio, чтобы преобразовать ваш файл базы данных из 2.1 в 3.0 (размер может уменьшиться даже в два раза), а затем внимательно сравнить страницы руководства по SQLite и SQLite3 PHP для изменения необходимых объектов и вызова функций.
Если вариант второй, обратите внимание, что это не должно быть тяжелой работой, поскольку изменения не так уж велики. Например, что я узнал на данный момент:
SQLiteDatabase -> SQLite3,
SQLiteDatabase::unbufferedQuery -> SQLite3::query,
SQLiteResult::fetchAll(SQLITE_*) -> SQLite3Result::fetchArray(SQLITE3_*) и т.д.
Что касается выборки, то в старом SQLite мы имели:
$rowsIMEI = $db->unbufferedQuery($imeiSQL)->fetchAll(SQLITE_ASSOC);
foreach($rowsIMEI as $r) {
...
}
В новом SQLite3 мы должны:
$rowsIMEI = $db->query($imeiSQL);
while($r = $rowsIMEI->fetchArray(SQLITE3_ASSOC)) {
...
}
Другие изменения требуют аналогичного объема работы, так что это не должно вызвать большие сложности. Я, конечно, настоятельно советую всем идти вперед и выбирать второй вариант. Прогресс в большинстве случаев является лучшим выбором из двух возможных вариантов.
Ответ 2
У меня была такая же проблема. Если вы обновили версию php, некоторые из старых конфигурационных файлов могут ссылаться на несуществующий файл. Посмотрите на файлы «.ini» в директории «conf.d». В моем случае путь к директории «conf.d» — «/etc/php5/conf.d» в системе Debian. Говоря конкретно о классе «SQLiteDatabase», моя проблема заключалась в файле «sqlite.ini», указывающем на несуществующий «sqlite.so».
После удаления файла «sqlite.ini» убедитесь, что есть файл ini, указывающий на действительное расширение sqlite (в данном случае «sqlite3.ini», указывающий на «sqlite3.so») и перезапустите apache, все сработает нормально.
Надеюсь, это поможет.
Ответ 3
Для версии PHP 5.6.2 на системе Arch Linux (Актуально: Nov2017)
Обратите внимание, что необходимо сделать:
Установите в /etc/php/php.ini путь, где находится ваше расширение sqlite3.so в секции:
[sqlite3].
sqlite3.extension_dir = /path/to/your/modules
Мои модули установлены в «/usr/lib/php/modules» и могут быть перечислены с помощью pacman:
$ sudo pacman -Ql php-sqlite
В списке будут перечислены установленные расширения sqlite3.so и другие файлы.
Вы можете проверить, нашел ли PHP расширение, сделав запрос:
$ php --ri sqlite3
В данный момент я использую Adminer, как объясняется в wiki.archlinux.org, и он создает базу данных после того, как я установил этот путь в php.ini.
Ответ 4
Оказывается, есть sqlite и sqlite3 php расширения, которые нужно установить, у вас может быть последнее, но вы посмотрите на страницу руководства для расширения «sqlite».
Моим решением было запустить:
print_r(get_declared_classes());
И этот код отображает на экране:
.......
[130] => mysqli_stmt
[131] => SQLite3
[132] => SQLite3Stmt
[133] => SQLite3Result
[134] => ImagickException
.......
Таким образом, моя установка не определяет класс SQLiteDatabase, только SQLite3. Обратитесь к разделу руководства php для sqlite3.
Web