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

Как получить ID последней обновленной строки в MySQL

Web

Как восстановить сериализованную строку, которая была повреждена из-за неправильной длины счетчика байтов

Web

Могу ли я расширить некоторый класс, используя более одного базового класса в PHP

Web

Как удалить Apache с помощью командной строки? Как удалить в Windows 8?

×