如果您在尝试写入 SQLite 数据库(更新、删除、删除)时遇到错误
警告:PDO::query() [function.query]:SQLSTATE[HY000]:一般错误:1 无法打开数据库
包含数据库文件的文件夹必须可写。
PDO_SQLITE 是一个驱动程序,它实现了 PHP 数据对象 (PDO) 接口,以启用对 SQLite 3 数据库的访问。
注意:
PDO_SQLITE 允许将字符串与流一起使用,以及
PDO::PARAM_LOB
。
PDO_SQLITE PDO 驱动程序默认启用。要禁用,可以使用 --without-pdo-sqlite[=DIR],其中可选的 [=DIR]
是 sqlite 的基本安装目录。从 PHP 7.4.0 开始,需要 » libsqlite ≥ 3.5.0。以前,可以使用捆绑的 libsqlite,并且是默认值,如果省略了 [=DIR]
。
注意:从 PHP 7.4.0 开始,在 Windows 上进行额外的设置
为了使此扩展正常工作,必须使 Windows 系统 PATH 中可以使用 DLL 文件。有关如何执行此操作的信息,请参阅名为 "如何在 Windows 上将我的 PHP 目录添加到 PATH" 的 FAQ。虽然将 DLL 文件从 PHP 文件夹复制到 Windows 系统目录也起作用(因为系统目录默认位于系统的 PATH 中),但不推荐这样做。此扩展需要以下文件位于 PATH 中: libsqlite3.dll.
如果您在尝试写入 SQLite 数据库(更新、删除、删除)时遇到错误
警告:PDO::query() [function.query]:SQLSTATE[HY000]:一般错误:1 无法打开数据库
包含数据库文件的文件夹必须可写。
您可以(更轻松地)运行查询“PRAGMA legacy_file_format = TRUE;”,而不是编译旧版本的 SQLite 来使用 PDO 捆绑的 SQLite 版本可以处理的旧数据库格式来创建数据库(如果您有现有的数据库,请从 SQLite shell 在您的数据库上运行“.dump”,在新的数据库上运行 SQLite shell,运行 PRAGMA,然后粘贴 .dump 的内容)。这将确保 SQLite 创建一个 SQLite 3.0 及更高版本可读的数据库。
使用 PDO SQLite 驱动程序,包含多个 ? 的 SQL 中的计算可能不会按预期获得结果。
<?php
// ....
$stmt = $PDO->prepare('SELECT * FROM `X` WHERE `TimeUpdated`+?>?');
$stmt->execute([3600, time()]);
$data = $stmt->fetchAll();
print_r($data);
?>
要获得正确的结果,您有超过 3 种解决方案。
1. 将“SELECT * FROM `X` WHERE `TimeUpdated`+?>?”更改为“SELECT * FROM `X` WHERE `TimeUpdated`>?”,并使用 Php 进行数学运算(即:$stmt->execute([time()-3600]);)。
2. 使用 PdoStatement::bindParam 或 PdoStatement::bindValue,并将参数类型设置为 PDO::PARAM_INT。
3. 将“SELECT * FROM `X` WHERE `TimeUpdated`+?>?”更改为“SELECT * FROM `X` WHERE `TimeUpdated`+?>?+0”,这里“?+0”可以替换为其他数学函数或其他计算,例如“abs(?)”,您甚至可以用数学计算将 ? 包裹起来。
请注意,截至本文发布之日,PDO_SQLITE 不会与使用当前版本的 SQLite 控制台应用程序 sqlite-3.3.6 创建的数据库文件进行交互。
目前需要从 http://www.sqlite.org/ 获取版本 3.2.8,但只能通过手动输入 URI 来获取,因为没有链接。转到 http://www.sqlite.org/download.html 并找到您要查找的版本的 URI,然后进行相应的版本号替换。