Web

Почему класс SQLiteDatabase не найден в /var/www/*.php?

Я пытаюсь использовать 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 соответственно.

Вы можете:

  1. Попытаться найти php_sqlite.dll (php_sqlite.so) где-нибудь в Интернете. Однако вам придется тщательно подобрать старый файл библиотеки SQLite к платформе вашего PHP (x64 или x86), движку сборки (VC6, VC9 или VC11), версии (5.x) и типу (TS для потокобезопасного или NTS для непотокобезопасного). Это может оказаться сложной задачей.

  2. Оставьте php_sqlite.dll (SQLiteDatabase) и перейдите на новый php_sqlite3.dll (объект SQLite3). Сначала вам придется использовать такой инструмент, как SQLite Studio, чтобы преобразовать ваш файл базы данных из 2.1 в 3.0 (размер может уменьшиться даже в два раза), а затем внимательно сравнить страницы руководства по SQLite и SQLite3 PHP для изменения необходимых объектов и вызова функций.

 Если вариант второй, обратите внимание, что это не должно быть тяжелой работой, поскольку изменения не так уж велики. Например, что я узнал на данный момент:

  1. SQLiteDatabase -> SQLite3,

  2. SQLiteDatabase::unbufferedQuery -> SQLite3::query,

  3. 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)

Обратите внимание, что необходимо сделать:

  1. Установите в /etc/php/php.ini путь, где находится ваше расширение sqlite3.so в секции:

[sqlite3].

sqlite3.extension_dir = /path/to/your/modules

  1. Мои модули установлены в «/usr/lib/php/modules» и могут быть перечислены с помощью pacman:

$ sudo pacman -Ql php-sqlite

  1. В списке будут перечислены установленные расширения sqlite3.so и другие файлы.

  2. Вы можете проверить, нашел ли PHP расширение, сделав запрос:

$ php --ri sqlite3

  1. В данный момент я использую 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

Как определить, пуста ли переменная bash?

Как создать грамотное оформление страницы 404 на собственном сайте
Web

Как создать грамотное оформление страницы 404 на собственном сайте

Web

Что лучше использовать при освобождении памяти в PHP: unset() или $var=null

Как добавить сайт в каталог Dmoz.org, насколько просто туда попасть
Web

Как добавить сайт в каталог Dmoz.org, насколько просто туда попасть

×