如何防止SQLITE SQLSTATE [HY000] [14]?

时间:2014-09-04 14:31:32

标签: php pdo sqlite persistent

我有时收到以下错误:

  

SQLSTATE [HY000] [14]无法打开数据库文件

我使用

打开日期库
new PDO("sqlite:database/datbase.db","","",array(
    PDO::ATTR_PERSISTENT => true
));

每次我想要从数据库读取数据或向数据库写入数据。开放过程是以下功能:

function opendatabase(){
try{
    return new PDO("sqlite:database/database.db","","",array(
        PDO::ATTR_PERSISTENT => true
    ));
}catch(PDOException $e){
    logerror($e->getMessage(), "opendatabase");
    print "Error in openhrsedb ".$e->getMessage();
}
}

经过一段时间(某个时间超过一个小时,有些时间过了几分钟后,我会在帖子开头收到错误消息。如何防止此类错误?

3 个答案:

答案 0 :(得分:3)

如果有人在重用PDO连接时遇到相同的消息但仍有问题,可能是因为你正在存储从fopen()获得的图像而忘记了fclose()语句。在这种特殊情况下,错误消息确实具有误导性。 以下是我在故障排除几天后设法解决的相同错误消息的问题。 SQLSTATE[HY000] [14] : can't open database because too many connections are already opened

答案 1 :(得分:2)

这是来自SQLlite的错误:

#define SQLITE_CANTOPEN 14 /* Unable to open the database file */

您似乎已经打开了许多连接,我建议您重新连接,如果它已打开。

创建一个属性:

private $pdo;

在创建新对象之前检查它是否为null:

function opendatabase(){
    try{
        if($this->pdo==null){
          $this->pdo =new PDO("sqlite:database/database.db","","",array(
                PDO::ATTR_PERSISTENT => true
            ));
        }
        return $this->pdo;
    }catch(PDOException $e){
        logerror($e->getMessage(), "opendatabase");
        print "Error in openhrsedb ".$e->getMessage();
    }
}

答案 2 :(得分:0)

非常奇怪,但对我来说,这是因为没有将新的PDO语句包装在try / catch块中。