Иногда я получаю следующую ошибку:
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;
И проверьте, не имеет ли значение 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(); } }
Если кто-либо имеет одно и то же сообщение при повторном использовании соединения PDO и все еще имеет проблемы, возможно, это связано с тем, что вы сохраняете изображения, полученные из fopen (), и забыли оператор fclose (). В этом конкретном случае сообщение об ошибке действительно вводит в заблуждение. Вот вопрос для того же сообщения об ошибке, которое мне удалось решить через несколько дней после устранения неполадок. SQLSTATE [HY000] [14]: невозможно открыть базу данных, поскольку слишком много соединений уже открыты
Очень странно, но для меня это было вызвано не обертыванием новой инструкции PDO в блок try / catch.