【问题标题】:PDO PHP SQLite3 database connection General Error 14PDO PHP SQLite3 数据库连接一般错误14
【发布时间】:2013-12-04 00:38:27
【问题描述】:

我有 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 数据库上尝试过同样的脚本……完全没有问题。

非常感谢任何想法/指针/建议。这个让我头疼!

干杯。

【问题讨论】:

    标签: php pdo sqlite


    【解决方案1】:

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

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

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

    去看看吧!

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

    【讨论】:

    • 这是使用 WAL 的documented disadvantage。至于schema version,它会随着数据库模式的每次变化而增加,包括日志模式。
    • 是的,该目录也必须是可写的,因为 sqlite 会在与 db 交互时创建一个临时文件。
    • 非常感谢!上帝不检查封装文件夹的权限给我带来了很多问题!谢谢!
    【解决方案2】:

    根据错误消息“无法打开数据库”,它无法访问 sqlite 文件。 我确定您已经检查了上一页中的“$db”变量。

    很难给你一个明确的答案。 您可以尝试不使用 PDO,只是检查 sqlite 文件或 PHP 代码是否存在问题。

    发布你的结果,让我们看看。

    【讨论】:

    • 感谢 Harsain,我使用了很多“打印”代码来确保结果页面为从前一页传递的所有变量获取所有正确的值。就好像 PDO 认为数据库不是有效的数据库一样。 SQLite 没有来自 cli 的问题。由于一切都在本地运行,我可能不得不求助于使用 php exec,但这对于循环输出数组以使其很好地显示更加麻烦。只是很烦人,不知道为什么 PDO 似乎无法做到。
    • 为了消除其他可能的错误,我删除了除 PDO 连接和带有错误陷阱的 try/catch 之外的所有代码。除了“SQLSTATE[HY000]:一般错误:14 无法打开数据库文件”消息之外,绝对没有任何有用的信息......这与直升机的弹射座椅一样有用!
    • 很高兴知道你能弄明白
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2017-06-17
    • 2012-11-22
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2016-03-27
    相关资源
    最近更新 更多