我有一个简单的 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 上运行。
问题可能出在您与 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 需要能够在与数据库文件相同的目录中创建临时锁定文件。
干杯。
DSN 前缀是
。sqlite:
- 要访问磁盘上的数据库,必须将绝对路径附加到 DSN 前缀。
考虑到这一点,构造一条绝对路径
$pdo = new PDO('sqlite:' . realpath(__DIR__ . '/resources/quotes.sqlite');
好的,我的代码没有任何问题。
我愚蠢地在另一个应用程序中打开了数据库。显然这锁定了数据库并阻止 PHP 读取它。