无法对文件执行SQLite查询

时间:2014-10-16 10:33:20

标签: php sql sqlite pdo

我有一个奇怪的问题,当代码在另一个文件上工作时,我无法在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(Mac上的SQLite文件查看器)中正常打开有问题的文件。

我会错过什么吗?

2 个答案:

答案 0 :(得分:0)

我使用这样的东西。不知道它是否会有所帮助

<?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);
}

答案 1 :(得分:0)

他们返回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));