为什么我可以在PHP中的SQLite数据库上使用SELECT而不是INSERT?

为什么我可以在PHP中的SQLite数据库上使用SELECT而不是INSERT?,php,sql,sqlite,pdo,Php,Sql,Sqlite,Pdo,我能够用PHP从SQLite数据库中检索信息,但不能对其进行写入。例如,此代码工作得非常好: $db = new PDO("sqlite:foo.db"); $rowCount = $db->query("SELECT COUNT(*) FROM tblname;")->fetchColumn(0); echo $rowCount; // works as it should 但是,以下代码段会导致“无法打开数据库文件”错误: $db = new PDO("sqlite:foo.d

我能够用PHP从SQLite数据库中检索信息,但不能对其进行写入。例如,此代码工作得非常好:

$db = new PDO("sqlite:foo.db");
$rowCount = $db->query("SELECT COUNT(*) FROM tblname;")->fetchColumn(0);
echo $rowCount; // works as it should
但是,以下代码段会导致“无法打开数据库文件”错误:

$db = new PDO("sqlite:foo.db");
$db->exec("INSERT INTO tblname VALUES(NULL, 'val1', 'val2');") or die(print_r($db->errorInfo(), true));
当我从命令行而不是在PHP中执行上述插入时,我得到了预期的结果(tblname中的新行):


这是我第一次使用PDOs(或SQLite),因此非常感谢您的帮助。

检查运行PHP脚本的用户是否有权编写foo.db


另外(从内存中,如果我错了,请纠正我),用户需要对包含foo.db的目录具有写权限,否则SQLite3将抛出一条不太有用的错误消息。

您可能没有对sqllite文件的写访问权限。检查您从PDO表单获得的错误消息

您的web服务器(apache/php或其他)是否具有对数据库的写访问权限?我确保数据库及其所在的目录都是可写的,但这似乎没有改变任何内容。请尝试在代码中使用foo.db的绝对路径,只是为了排除可能发生的任何工作目录差异…“检查运行PHP脚本的用户…”这就是问题所在。我的普通用户是具有写权限的用户,而不是实际运行脚本的用户。谢谢。哇,这是我的文件夹权限,这是意外的,但已修复。这不是让攻击变得更危险吗?
$ sqlite3 foo.db
sqlite> INSERT INTO tblname VALUES(NULL, 'val1', 'val2');