我有时会收到以下错误:
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();
}
}
一段时间后(有时超过一个小时,有时几分钟后,我在帖子开头收到错误消息。如何防止此类错误?
这是 SQLlite 的错误:
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
您好像打开了很多连接,如果打开了,我建议您重新使用该连接。
创建属性:
private $pdo;
并在创建新对象之前检查它是否为空:
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();
}
}
如果有人在重用 PDO 连接时收到相同的消息并且仍然遇到问题,则可能是因为您正在存储从 fopen() 获取的图像并忘记了 fclose() 语句。在这种特殊情况下,错误消息确实具有误导性。 这是我在经过几天的故障排除后设法解决的同一错误消息的问题。 SQLSTATE[HY000] [14]:无法打开数据库,因为已经打开了太多连接
不知道为什么它对我有帮助,但它确实有效。尝试从
更改与sqlite3数据库的连接类型new PDO("sqlite:database/datbase.db","","",array(
PDO::ATTR_PERSISTENT => true
));
到
new PDO("sqlite:datbase.db"));
我的数据库文件上也有 *.sqlite3 扩展名。
我希望它能帮助别人。
非常奇怪,但对我来说,这是由于没有将新的 PDO 语句包装在 try/catch 块中造成的。