PDO 无法打开子目录中的 SQLite 数据库

问题描述 投票:0回答:3

我有一个简单的 SQLite 数据库文件,我正在尝试使用 PDO 打开它:

try {
    $pdo = new PDO("sqlite:resources/quotes.sqlite");
} catch (PDOException $e) {
    die($e -> getMessage());
}

我收到消息:

SQLSTATE[HY000] [14] 无法打开数据库文件

该文件没有任何问题:如果我将文件复制到 Web 根目录,它就可以工作。

我尝试过硬编码文件的绝对路径,但这也不起作用。

我也尝试过目录权限:

chmod 777 resources

我想不出还有什么会出错的。我应该使用什么技巧来解决问题或获取有关错误的更多信息吗?

我在 Rocky Linux、Apache 上运行。

php sqlite pdo path
3个回答
0
投票

问题可能出在您与 PDO 一起使用的 DSN 中。 SQLite DSN 前缀是 sqlite: 或 sqlite2:,后跟 SQLite 数据库文件的绝对路径。

尝试以下操作:

try {
    $pdo = new PDO("sqlite:/absolute/path/to/resources/quotes.sqlite");
} catch (PDOException $e) {
    die($e->getMessage());
}

您应该将路径替换为资源目录的完整路径。

如果您使用相对路径,请注意它们是相对于最初调用的脚本,而不是当前正在运行的脚本。

此外,请确保 Web 服务器进程不仅对数据库文件本身具有读写权限,而且对其包含的目录也具有读写权限。 SQLite 需要能够在与数据库文件相同的目录中创建临时锁定文件。

干杯。


0
投票

请参阅 PDO_SQLITE DSN 文档

DSN 前缀是

sqlite:

  • 要访问磁盘上的数据库,必须将绝对路径附加到 DSN 前缀。

考虑到这一点,构造一条绝对路径

$pdo = new PDO('sqlite:' . realpath(__DIR__ . '/resources/quotes.sqlite');

0
投票

好的,我的代码没有任何问题。

我愚蠢地在另一个应用程序中打开了数据库。显然这锁定了数据库并阻止 PHP 读取它。

© www.soinside.com 2019 - 2024. All rights reserved.