Ошибка: файл зашифрован или не является базой данных - PullRequest
34 голосов
/ 03 октября 2009

Я использовал PHP для создания базы данных с таблицей. Я сделал это следующим образом:

<?php
$db = new SQLiteDatabase("test.db");
unset($db);
$db = sqlite_open("test.db");
sqlite_query($db,"create table students (names char(255))");
sqlite_close($db);
?>

После того, как я выполняю свой PHP-файл из командной строки: «php test.php», я получаю новый файл в моем каталоге, который называется «test.db» (это то, что я хотел) Затем в командной строке набираю «sqlite3 test.db». Таким образом, я вхожу в сеанс командной строки sqlite. Затем, используя sqlite3, я набираю «.tables» (я хотел проверить, содержит ли новая база данных таблицы, которые она должна содержать). В результате я получаю:

Error: file is encrypted or is not a database 

Итак, это не работает. Кто-нибудь знает что-нибудь об этой проблеме? Заранее благодарю за любую помощь.

Ответы [ 7 ]

46 голосов
/ 20 января 2011

Это проблема несовпадения версий.

Чтобы открыть базу данных с использованием PHP5 и SQLite, нам нужно использовать PDO, а не sqlite_open() Пример того, как открыть или создать базу данных:

try 
{
    /*** connect to SQLite database ***/

    $dbh = new PDO("sqlite:VPN0.sqlite");
    echo "Handle has been created ...... <br><br>";

}
catch(PDOException $e)
{
    echo $e->getMessage();
    echo "<br><br>Database -- NOT -- loaded successfully .. ";
    die( "<br><br>Query Closed !!! $error");
}

echo "Database loaded successfully ....";
14 голосов
/ 14 февраля 2012

Я столкнулся с той же проблемой, используйте pdo вместо sqlite_open ()

эта ссылка очень полезна, и вот мой фрагмент кода, работает отлично, надеюсь, это поможет

$dir = 'sqlite:YourPath/DBName.db';
$dbh  = new PDO($dir) or die("cannot open the database");
$query =  "SELECT * from dummy_table";
foreach ($dbh->query($query) as $row)
{
    echo $row[0];
}
9 голосов
/ 03 октября 2009

это, скорее всего, несоответствие версий между версией php sqlite и вашим отдельным исполняемым файлом sqlite.

см. Это: http://us3.php.net/manual/en/book.sqlite.php - в разделе "Заметки пользователя", от Эндрю Пола Дики.

для быстрого решения вы можете установить и использовать отдельный исполняемый файл sqlite2.

3 голосов
/ 19 июля 2011

Недавно я столкнулся с точно такой же проблемой и выяснил, что происходит. (Да, все остальные ответы верны - это проблема несовпадения версий.) Я публикую это, чтобы предоставить дополнительную информацию, которая может быть полезна для других, столкнувшихся с этой проблемой ...

Резюме:

Ошибка связана с тем, что инструмент командной строки sqlite3.exe (который реализует SQLite версии 3) не может прочитать файлы базы данных, созданные с помощью процедурного интерфейса PHP, в SQLite (который реализует SQlite версии 2).

Обсуждение:

Я следую учебному пособию, описывающему, как использовать SQLITE с PHP: Учебное пособие по SQLite PHP (Обратите внимание, что я использую PHP 5.2.14 в Windows XP). Оказывается, PHP 5.2 имеет два (несовместимых) способа взаимодействия с системой управления базами данных SQLite; процедурный API ( SQLite ) и объектно-ориентированный API ( Функции SQLite (PDO_SQLITE) ). Процедурный API использует SQLite версии 2, а ООП API использует SQLite версии 3. Для платформ Windows PHP процедурный API включен, раскомментировав эту строку в php.ini:

extension=php_sqlite.dll

Пока OOP API включен, раскомментировав эти строки:

extension=php_pdo.dll
extension=php_pdo_sqlite.dll

Обратите внимание, что существует бесплатный инструмент Win32, который позволяет администрировать и манипулировать любой версией баз данных SQLite: Администратор SQLite . Этот инструмент позволяет преобразовать базу данных версии 2 (созданную с помощью процедурного API PHP) в базу данных версии 3, которую можно прочитать с помощью инструмента командной строки sqlite3.exe.

2 голосов
/ 21 октября 2011

Вопросу два года, но теперь его можно решить следующим образом:

class MyDB extends SQLite3
{
    function __construct()
    {
            $dbFile = __DIR__ . '/../../../adminer/Dictionary.sqlite';
            $this->open($dbFile);
    }
}

$db = new MyDB();
$db->exec('CREATE TABLE students (names VARCHAR(80))');
echo "done";

Источник: http://php.net/manual/en/sqlite3.open.php

0 голосов
/ 10 февраля 2013

Есть еще один простой способ решить эту проблему. Вы можете преобразовать файл базы данных sqlite 2 в sqlite 3. Я сделал это с программой SQLiteManager на Mac OS X.

0 голосов
/ 03 октября 2009

Почему вы открываете БД два раза?

Попробуйте этот код:

<?php
$db = sqlite_open( "test.db", 066, $err );
sqlite_query( $db, "CREATE TABLE students (names VARCHAR(80))" );
sqlite_close( $db );
?>

Edit: Fin, вероятно, прав; возможно, вам нужно проверить версию SQLite с помощью phpinfo ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...