错误:文件已加密或不是数据库

时间:2009-10-03 14:18:22

标签: php sqlite

我用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 个答案:

答案 0 :(得分:46)

这是版本不匹配问题。

要使用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 ....";

答案 1 :(得分:14)

我遇到了同样的问题,请使用pdo而不是sqlite_open()

this link非常有帮助,这是我的代码段,效果很好,希望有所帮助

$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];
}

答案 2 :(得分:9)

这很可能是php sqlite版本和你的独立sqlite可执行文件之间的版本不匹配。

请参阅:http://us3.php.net/manual/en/book.sqlite.php - 来自Andrew Paul Dickey的“用户贡献说明”。

对于快速解决方案,您可以安装和使用sqlite2独立可执行文件。

答案 3 :(得分:3)

我最近遇到了这个完全相同的问题并且已经弄清楚发生了什么。 (是的所有其他答案都是正确的 - 这是一个版本不匹配问题。)我发布此信息是为了提供一些其他可能对其他人遇到此问题有帮助的信息......

要点:

错误是由于sqlite3.exe命令行工具(实现SQLite版本3)无法读取使用PHP的SQLite过程接口创建的数据库文件(实现SQlite版本2)。

讨论:

我正在学习一个教程,该教程描述了如何在PHP中使用SQLITE:SQLite PHP tutorial(请注意,我在Windows XP上运行PHP 5.2.14)。事实证明,PHP 5.2有两种(不兼容的)与SQLite数据库管理系统连接的方式;过程API(SQLite)和面向对象的API(SQLite Functions (PDO_SQLITE))。过程API使用SQLite版本2,OOP API使用SQLite版本3.对于Windows PHP平台,通过在php.ini中取消注释该行来启用过程API:

extension=php_sqlite.dll

通过取消注释这些行来启用OOP API:

extension=php_pdo.dll
extension=php_pdo_sqlite.dll

请注意,有一个免费的Win32工具,允许管理和操作任何版本的SQLite数据库:SQLite Administrator。此工具允许用户将版本2数据库(使用PHP的过程API创建)转换为可使用sqlite3.exe命令行工具读取的版本3数据库。

答案 4 :(得分:2)

问题是两年了,但现在可以通过这种方式解决:

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

答案 5 :(得分:0)

为什么要打开数据库两次?

试试这段代码:

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

编辑:Fin可能是对的;也许你必须用phpinfo()检查SQLite版本。

答案 6 :(得分:0)

有一种更简单的方法可以解决这个问题。您可以将sqlite 2数据库文件转换为sqlite 3.我在Mac OS X上使用SQLiteManager程序执行此操作。