【问题标题】:PDO SQLite Cannot Open DatabasePDO SQLite 无法打开数据库
【发布时间】:2015-07-18 18:02:24
【问题描述】:

我在 Linux 环境中使用 PHP 没问题,但我正在开发一个 PHP 应用程序,该应用程序在 Windows Server 2012 R2 上的 IIS 8 上使用 PDO 的 sqlite。

从数据库中读取工作正常;尝试插入或更新会导致相当无用的错误,“无法打开数据库文件”

运行良好的代码:

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 用户具有数据库文件的读/写权限,per this question
  • 确保 IIS 用户对包含数据库文件的目录具有读/写权限。 per this question
  • 检查 IIS 错误日志以了解发生了什么。 (唯一存在的是由于此请求失败而导致的不相关警告。)
  • 确保它适用于另一个数据库(它适用于 mySQL,但 sqlite 是最终应用程序的硬性要求。)

非常感谢任何帮助!

【问题讨论】:

    标签: php sqlite iis pdo


    【解决方案1】:

    我遇到了同样的问题,但在使用 Apache 时发现问题的根源是相同的。

    Sqlite 需要在目录中创建额外的文件来保存事务数据,并且由于它没有在当前文件夹中写入的权限,它会在读取工作正常时给出该错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2023-04-01
        • 2014-11-11
        • 2014-08-30
        相关资源
        最近更新 更多