Uncaught PDOException для SQLite - невозможно открыть файл базы данных - PullRequest
1 голос
/ 15 октября 2019

У меня есть сайт php с базой данных SQLite. Этот код открывает и запрашивает базу данных без ошибок:

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();

получает ошибку:

Неустранимая ошибка: Uncaught 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;
    }
}

Оба примерато, как я запрашиваю базу данных, похоже на меня, но я не понимаю, почему во втором примере выдается ошибка открытия той же базы данных.

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 15 октября 2019

Информация для рассмотрения:

SQLite использует блокировки чтения / записи для всего файла базы данных. Это означает, что если какой-либо процесс читает из какой-либо части базы данных, все другие процессы не могут записывать любую другую часть базы данных. Точно так же, если какой-либо один процесс записывает в базу данных, все другие процессы не могут читать любую другую часть базы данных. Для многих ситуаций это не проблема. Каждое приложение выполняет свою работу с базой данных быстро и движется дальше, и никакая блокировка не длится более нескольких десятков миллисекунд. Но есть некоторые приложения, которым требуется больше параллелизма, и эти приложения могут искать другое решение.

Также попробуйте добавить PDO::ATTR_PERSISTENT => true в свой класс SQLiteConnection:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...