У меня странная проблема, когда я не могу выполнить самый простой запрос к файлу базы данных SQLite, пока код работает с другим файлом. Нет ошибки при создании нового экземпляра PDO. Разрешение достаточно только для чтения (644).
try
{
$dbh = new PDO("sqlite:$db");
}
catch(PDOException $e)
{
echo $e->getMessage();
echo "Database not loaded successfully. ";
die();
}
Но когда я бегу:
$sth = $dbh->prepare('select * from message');
$result = $sth->execute();
или же
$result = $dbh->query('select * from message');
оба возвращаются FALSE
,
Выдает ошибку: «Неустранимая ошибка: необработанное исключение« PDOException »с сообщением« SQLSTATE [HY000]: общая ошибка: 14 невозможно открыть файл базы данных »» в $dbh->prepare
линия.
Опять же, приведенный выше код работает нормально на другом файле базы данных.
Другая информация: я Можно просто откройте проблемный файл в MesaSQLite (программа просмотра файлов SQLite на Mac).
Я что-то пропустил?
Я использую что-то вроде этого. Не знаю, поможет ли это
<?php
try {
// create a new instance of a PDO connection
$db = new PDO("sqlsrv:Server=localhost;Database=myDatabase", $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql='SELECT * FROM message';
$stmt = $db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row) {
echo "<pre>";var_dump($row);echo"</pre>";
}
}
catch(PDOException $e) {
// if the connection fails, display an error message
echo 'ERROR: ' . $e->getMessage();
$errmsg = $e->getMessage();
error_log('$errmsg-> '.$errmsg);
}
Есть веская причина, по которой они возвращают false, когда это происходит, вы должны проверить ошибки и исправить их:
С помощью prepare()
:
try
{
$dbh = new PDO("sqlite:$db");
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth = $dbh->prepare('select * from message');
if(!$sth) {
echo "prepare failed() :\n";
print_r($dbh->errorInfo());
die();
}
$success = $sth->execute();
if(!$success) {
echo "execute failed() :\n";
print_r($dbh->errorInfo());
die();
}
$result = $sth->fetchAll();
var_dump($result);
}
catch(PDOException $e)
{
echo "PDO Exception caught: ";
echo $e->getMessage();
die();
}
С помощью query()
:
try
{
$dbh = new PDO("sqlite:$db");
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth = $dbh->query('select * from message');
if(!$sth) {
echo "query() failed :\n";
print_r($dbh->errorInfo());
die();
}
$result = $sth->fetchAll();
if($result) {
var_dump($result);
}else{
echo "No result !";
}}
catch(PDOException $e)
{
echo "PDO Exception caught: ";
echo $e->getMessage();
die();
}
Чтобы установить режим ошибки при создании соединения:
$dbh = new PDO("sqlite:$db", null, null,
array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));