【问题标题】:Uncaught PDOException for SQLite - unable to open database fileSQLite 的未捕获 PDOException - 无法打开数据库文件
【发布时间】:2020-02-12 05:36:38
【问题描述】:

我有一个带有 SQLite 数据库的 php 网站。此代码打开并查询数据库没有错误:

use App\SQLiteConnection;
$pdo = (new SQLiteConnection())->connect();
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->query("SELECT empid, fullname FROM employees ORDER BY fullname");

while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
    $employees[] = [
        'empid' => $row['empid'],
        'fullname' => $row['fullname']
    ];
}

这里的代码:

use App\SQLiteConnection;
$pdo = (new SQLiteConnection())->connect();
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$training_id = $_POST['id'];

$stmt = $pdo->prepare("SELECT description from training WHERE id = :training_id");
$stmt->bindParam(':training_id', $training_id);
$stmt->execute();
echo $stmt->fetchColumn();

得到一个错误:

致命错误:未捕获的 PDOException: SQLSTATE[HY000] [14] 无法 在中打开数据库文件 C:\Bitnami\wampstack-7.3.10-0\apache2\htdocs\arborcircle\app\SQLiteConnection.php:23 堆栈跟踪:0 C:\Bitnami\wampstack-7.3.10-0\apache2\htdocs\arborcircle\app\SQLiteConnection.php(23): PDO->__construct('sqlite:db/EmpTr...') 1 C:\Bitnami\wampstack-7.3.10-0\apache2\htdocs\arborcircle\functions\get_training_description.php(10): App\SQLiteConnection->connect() 2 {main} 抛出 C:\Bitnami\wampstack-7.3.10-0\apache2\htdocs\arborcircle\app\SQLiteConnection.php 第 23 行

这是我的 SQLiteConnection 类:

class SQLiteConnection {
    /**
     * PDO instance
     * @var type 
     */
    private $pdo;

    /**
     * return in instance of the PDO object that connects to the SQLite database
     * @return \PDO
     */


    public function connect() {
        if ($this->pdo == null) {
            $this->pdo = new \PDO("sqlite:" . Config::PATH_TO_DB_FILE);
        }
        return $this->pdo;
    }
}

我如何查询数据库的两个示例似乎都与我相似,但我不明白为什么第二个示例会引发打开同一数据库的错误。

任何帮助表示赞赏。

【问题讨论】:

  • 这可能是命名空间问题,在SQLiteConnection 中,您可以尝试放置Config::PATH_TO_DB_FILE 的绝对类名,这可能是\Config::PATH_TO_DB_FILE\App\Config::PATH_TO_DB_FILE,或者您可能有两个不同的脚本试图同时打开同一个 sqlite 数据库,这可能会发生冲突

标签: php sqlite pdo


【解决方案1】:

需要考虑的信息:

SQLite 对整个数据库文件使用读/写锁。这意味着如果任何进程正在从数据库的任何部分读取数据,则所有其他进程都将被阻止写入数据库的任何其他部分。类似地,如果任何一个进程正在写入数据库,则所有其他进程都无法读取数据库的任何其他部分。对于许多情况,这不是问题。每个应用程序都快速完成其数据库工作并继续运行,并且没有任何锁定持续超过几十毫秒。但是有些应用程序需要更多的并发性,这些应用程序可能需要寻求不同的解决方案。

还可以尝试在您的 SQLiteConnection 类中添加 PDO::ATTR_PERSISTENT => true

public function connect() {
    if ($this->pdo == null) {
        $this->pdo = new \PDO(
            "sqlite:" .  Config::PATH_TO_DB_FILE, '', '',     
            array(
                PDO::ATTR_PERSISTENT => true
            )
        );
    }
    return $this->pdo;
}

【讨论】:

  • 好吧,有趣。所以我上面提到的第一个数据库调用是加载一些页面数据,第二个调用是响应选择输入以获取查找值。
  • 谢谢。我将此数组添加到我的连接中,效果很好。
猜你喜欢
  • 2014-11-11
  • 2014-08-30
  • 2021-10-15
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多