Вопрос или проблема
Я пытаюсь использовать sqlite из PHP. У меня есть следующий простой код:
<?php
$db = new SQLiteDatabase("test2.sdb");
unset($db);
?>
В результате выполнения этого кода (который я запускаю в командной строке “php test2.php”) я получаю:
Фатальная ошибка: Класс 'SQLiteDatabase' не найден в /var/www/test2.php на строке 3
Кто-нибудь знает, как сделать так, чтобы PHP мог использовать sqlite?
Дополнительно.
Здесь я узнал, что “Поддержка SQLite включена по умолчанию в стандартной сборке PHP для Linux, начиная с PHP 5.0.” У меня “PHP Version => 5.2.6-2ubuntu4.6”. Так что sqlite должен быть включен, если не было использовано “–disable-sqlite”. В моем случае вывод “phpinfo();” не содержит “sqlite” вообще.
Есть довольно много сообщений о той же проблеме в Google, но нет окончательного решения.
Проверьте, включено ли расширение SQLlite в PHP, и вы должны быть в состоянии использовать функцию семейства sqlite_* (например, sqlite_open), вместо объектно-ориентированного подхода, который не идеален, я знаю.
Также просто проверьте, что ваш модуль PECL для sqlite >= 1.0.0.
Класс 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))
{
...
}
Другие изменения требуют аналогичного объема работы, так что это не должно быть процессом на всю жизнь.
Я, конечно, настоятельно советую всем идти вперед и выбрать второй вариант. Прогресс, как правило, является лучшим из двух доступных вариантов.
У меня была такая же проблема.
Если вы обновили свою версию 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, все заработало для меня.
Надеюсь, это поможет.
У меня была такая же проблема, и я забыл раскомментировать
extension=php_pdo_sqlite.dll
И
extension=php_sqlite.dll
У меня была похожая проблема, и при попытке установить sqlite с помощью “yum install sqlite.i386” говорилось, что он установлен и актуален, однако по какой-то причине в моем php.ini не было о нем никаких упоминаний, и он не работал, хотя phpinfo сообщал “с sqlite=shared” и т.д.
Добавление “extension=sqlite.so” где-то в php.ini позволило ему заработать, я поместил его в раздел PDO внизу, но я сомневаюсь, что имеет значение, куда вы его на самом деле помещаете.
А, и не забудьте перезапустить apache перед проверкой или просто перезагрузите сервер! 🙂
Это старая, но хорошая проблема, которая снова коснулась меня!!!
Оказалось, что есть php расширения sqlite и sqlite3, которые нужно установить, возможно, у вас есть последнее, но вы смотрите на страницу документации для расширения “sqlite”.
Мое решение заключалось в следующем:
print_r(get_declared_classes());
И это отображает:
.......
[130] => mysqli_stmt
[131] => SQLite3
[132] => SQLite3Stmt
[133] => SQLite3Result
[134] => ImagickException
.......
Таким образом, моя установка не определяет класс SQLiteDatabase, только SQLite3. Теперь обратитесь к разделу документации php для sqlite3.
С версией PHP 5.6.2 на системе Arch Linux (Текущая: Ноябрь 2014)
Также обратите внимание, что нужно сделать:
Укажите в /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.
Спасибо за предоставленную выше информацию и удачи.
Проверьте ваш php.ini (например, на Windows):
extension=php_pdo.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
У меня была такая же проблема при запуске старого php скрипта. Оказалось, что SQLiteDatabase была устаревшей и удалена в PHP 7.0.
Сейчас правильный способ использовать SQLite в PHP – это использовать класс SQLite3.
Исходная проблема была другой, но теперь вы можете получить ту же ошибку, даже когда SQLite установлен правильно.
Проверьте ваш php.ini.
1) Введите путь к файлу расширений вручную. Раскомментируйте:
extension_dir = “C:\php\ext”
2) Не забудьте раскомментировать расширения в главе “Динамические расширения”:
extension=php_mysqli.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite3.dll
Ответ или решение
Класс SQLiteDatabase
не найден в файле /var/www/test2.php
по нескольким причинам, связанным с различиями в версиях PHP и поддержкой расширений. Давайте исследуем эту проблему более подробно.
Причины отсутствия класса SQLiteDatabase
-
Устаревшая версия PHP:
КлассSQLiteDatabase
принадлежит расширению, которое было удалено с версии PHP 7.0. На ваш компилятор, как вы отметили, установлен PHP 5.2.6. Несмотря на то, что эта версия поддерживала SQLite, вероятно, расширение для SQLite не было включено в вашу сборку PHP. -
Неправильная конфигурация расширений:
Убедитесь, что в вашем конфигурационном файлеphp.ini
указаны необходимые расширения. Например, вам следует добавить или раскомментировать строки:extension=sqlite.so
-
Отсутствие библиотеки SQLite:
В некоторых случаях, если библиотека SQLite не установлена на сервере, классSQLiteDatabase
может быть недоступен. Убедитесь, что у вас установлены соответствующие библиотеки, и проверьте, что они совместимы с версией PHP, которую вы используете. -
Изменение на SQLite3:
Как указано в ваших сообщениях, проект можно адаптировать под классSQLite3
, который был введен в PHP 5.3. Попробуйте изменить ваш код, чтобы вместоSQLiteDatabase
использоватьSQLite3
:$db = new SQLite3('test2.sdb'); unset($db);
Шаги по устранению неполадок
-
Проверьте конфигурацию PHP:
Введите командуphpinfo();
в вашем скрипте или вызовите:php -m
Это покажет список загруженных модулей и поможет определить, загружен ли модуль SQLite.
-
Убедитесь, что расширение включено:
Проверьте наличиеsqlite.so
илиsqlite3.so
в директорииext
и добавьте путь к директории расширений в вашемphp.ini
:extension_dir = "/path/to/php/extensions"
-
Переход на новые функции SQLite:
Если вы решите использоватьSQLite3
, вам также потребуется обновить свой код. Измените методы, как указано в предыдущих сообщениях, например:$rowsIMEI = $db->query($imeiSQL); while ($r = $rowsIMEI->fetchArray(SQLITE3_ASSOC)) { ... }
-
Перезагрузка сервера:
Не забудьте перезагрузить веб-сервер, если вы вносили какие-либо изменения в конфигурацию PHP, чтобы новые настройки вступили в силу:sudo service apache2 restart
Заключение
Решение проблемы с классом SQLiteDatabase
, которого не существует, заключается, как правило, в обновлении конфигурации PHP и переходе на новое расширение SQLite3
, если вы используете более новую версию PHP. Убедитесь, что все необходимые модули установлены и корректно настроены, и при необходимости обновите код, чтобы соответствовать изменениям в новых версиях PHP.