php - PDO PHP SQLite3 数据库连接一般错误14

标签 php pdo sqlite

我有 2 个 sqlite3.x 数据库(来自 iPhone),一个来自游戏应用程序,另一个是地址簿。

我在 php conf 中有记录和显示错误。

使用 PHP/PDO,我可以显示游戏数据库中的字段和值,包括我在结果页面中捕获并使用“img src='data:...' 呈现的图像 blob。我在其他字段上使用 htmlentities捕获 plist 二进制 blob 之类的东西。

我正在使用 perl 脚本生成第一页,示例数据是使用对 sqlite3 的系统调用获得的。该脚本正在通过作为 cli 参数提供的目录进行递归搜索。

我基本上从数据库中的每个表中获取第一条记录(作为数据样本),为用户提供他们想要进一步询问的字段的选项,并将这些选项传递给对目标表执行查询的表单处理程序,并且从选定的列中获取数据。

但是...尝试连接到通讯簿数据库时,我收到“无法打开数据库”的一般错误。

我检查了数据库权限、所有权,将两者放在同一个目录中,使它们完全向世界开放……我能想到的一切,但仍然没有乐趣。

真正奇怪的是,我可以使用 sqlite3 从命令行非常愉快地查询所有数据库,但是在使用 PDO 时会出现此错误。

整个事情发生在以下几点:

($db and $strSQL vals passed from previous page)

$dbh = new PDO('sqlite:'.$db);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result = $dbh->query($strSQL);

即使我从表中选择一个简单的主键列,我也会收到错误,所以我很确定这不是数据处理问题。我什至在 Firefox 和 Chrome 数据库上尝试过同样的脚本……完全没有问题。

非常感谢任何想法/指针/建议。这是我的头!

干杯。

最佳答案

好的......所以看起来尽管数据库文件本身是敞开的(chmod 777),但它们所在的目录必须是可写的!仍然不确定命令行中的 sqlite 是如何摆脱不需要可写目录的,但您肯定需要它来进行 PHP/PDO 查询。

未显示结果的数据库设置了预写日志 (WAL) 位(文件头的字节 18 和 19),并且目录需要可写,以便 SQLite 可以创建正在查询的数据库的 WAL 版本。对于非 WAL 数据库,字节 18 和 19 设置为 0x01 和 0x01,对于启用 WAL 的数据库,字节 18 和 0x02 设置为 0x02 0x02。

是什么泄露了它?...当我重新运行查询并且碰巧将数据库移入时,突然出现了我的地址簿数据库文件的副本,文件名的末尾附加了“-wal”和“-shm”用于测试的可写目录。

去搞清楚!

PS..
有趣的是,每次更改日志模式时(使用 db 查询“pragma journal_mode=[wal|off]”),字节 94 和 95 处的 2 字节计数器都会增加 1。在模式之间切换时检查数据库的哈希值时注意到这一点,并且无法获得相同的 2 个哈希值。我在前后数据库上做了一个 xxd,将输出通过管道传输到 txt 文件,然后对 2 个 txt 文件进行了比较......并且有这些计数器字节。

关于php - PDO PHP SQLite3 数据库连接一般错误14,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364608/

相关文章:

ruby-on-rails - 安装 sqlite3 时出错,无法构建 gem native 扩展

php - 向mysql中插入大数据并带有进度条

php - 我可以让 mysql 在一列中的任何行上搜索相同的匹配项吗?

php - 排除任何与 MYSQL 全文搜索无关的内容

php - SQLSTATE[42000] : Syntax error or access violation: 1064 Error in setting Variable in bindparam

php - PDO SQL Server 扩展间歇性故障

python - ipdb,多线程和自动重新加载程序导致 ProgrammingError

python - 出现运行时错误 : unsupported value when trying to insert binary data into a blob field in a sqlite3 table using python

php - .ajax跨域和MySQL无法正常工作

mysql - PDO MySQL 使用 select 插入多行