PDO SQLite无法打开数据库

时间:2015-05-07 23:31:23

标签: php sqlite iis pdo

我在Linux环境中使用PHP做得很好,但我正在开发一个在Windows Server 2012 R2上的IIS 8上使用PDO的sqlite的PHP应用程序。

从数据库中读取工作正常;试图插入或更新相当无用的错误的结果,"无法打开数据库文件"

运行正常的代码:

if (!($db = new PDO('sqlite:assets/database.db'))) { ?>
    ...
} else {
    $stmt="SELECT
             ... ";

    $stmt = $db->prepare($stmt);

    $stmt->execute(array(":person" => $this->uid));
}

不起作用的代码:

if (!($db = new PDO('sqlite:assets/database.db'))) { ?>
    ...
} else {
    $stmt = "INSERT INTO bills(date, label, categ, amount, timestamp) VALUES(?, ?, ?, ?, ?)";

    $stmt = $db->prepare($stmt);
    var_dump($stmt->errorInfo()); 
    // yields : array(3) { [0]=> string(0) "" [1]=> NULL [2]=> NULL }

    $stmt->execute([$fData['date'], $fData['label'], $fData['categ'], $fData['amount'], $fData['timestamp']]);
    var_dump($stmt->errorInfo()); 
    // yields : array(3) { [0]=> string(5) "HY000" [1]=> int(14) [2]=> string(28) "unable to open database file" }
}

我已经尝试过的事情:

  • 确保IIS用户具有数据库文件{/ 3}}
  • 的读/写权限
  • 确保IIS用户具有包含数据库文件的目录的读/写权限。 per this question
  • 检查IIS错误日志,了解发生了什么。 (唯一存在的是此请求失败导致的无关警告。)
  • 确保它适用于另一个数据库(它适用于mySQL,但sqlite是最终应用程序的一项硬性要求。)

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但与Apache合作,结果发现问题的根源是相同的。

Sqlite需要在目录中创建其他文件来保存事务数据,因为它没有在当前文件夹中写入的权限,所以在读取工作正常时会出现该错误。

答案 1 :(得分:0)

事实证明,问题在于在IIS上运行PHP所涉及的特定用户帐户。显然,用户是IUSR,奇怪的是是IIS_Users组的一部分。因此,将IUSR添加到允许的用户列表中解决了问题,如this question中所述,我希望几天前在搜索中出现。