文件已加密或不是数据库 - sqlite

时间:2015-07-03 15:14:35

标签: php sqlite

打开sqlite文件时遇到一些麻烦

在命令行中我得到了这个:

#sqlite3 sms.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from message;
Error: file is encrypted or is not a database

当我连接时,错误不是,当我运行查询时

检查文件让我这个

# file sms.db
sms.db: SQLite 3.x database

因此它不应该是版本问题 - 比如使用sqlite3打开sqlite2文件

在php中我有这个:

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

    $db = new PDO("sqlite:path/sms.db");
    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");
}

$result = $db->query('SELECT * from message') or var_dump($db->errorInfo());

获取此信息(不是在连接时,而是在执行查询时)

array(3) { [0]=> string(5) "HY000" [1]=> int(26) [2]=> string(38) "file is encrypted or is not a database" } 

我为firefox使用了一个Sql管理器扩展,在那里我可以毫无问题地打开文件(并运行任何查询而无需任何加密或密码)。这对我来说真的很奇怪。我在最后几个小时搜索了这个,但我找不到任何解决方案。任何帮助,将不胜感激。

我刚刚在Windows上测试过,我可以打开数据库。我认为这个问题与sqlite驱动程序有关。

在Windows上我有SQLite Library 3.7.7.1 在我的centos服务器上,我有SQLite Library 3.6.20

现在的问题是如何更新php sqlite扩展。我无法更新整个php(可能会导致错误)

像yum install php-pdo,yum install php5-sqlite3这样的命令,不起作用

1 个答案:

答案 0 :(得分:1)

有时我将php脚本从一个托管移动到另一个托管时会出现此错误。 最常见的是sqlite WAL模式中的bug:

PRAGMA journal_mode = WAL;

要解决此问题,您需要在数据库中禁用此选项。 最简单的方法是将文件database \ x02 \ x02中的2个字节替换为\ x01 \ x01到地址\ x12(dec 18) 在bash中,您可以使用命令:

do printf '\x01\x01' | dd of=basename.db bs=1 seek=18 count=2 conv=notrunc