【问题标题】:Cannot execute SQLite query on a file无法对文件执行 SQLite 查询
【发布时间】:2014-10-16 10:33:19
【问题描述】:

我有一个奇怪的问题,我无法在 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

它在$dbh->prepare 行抛出错误:“致命错误:未捕获的异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:14 无法打开数据库文件'”。

同样,上面的代码在另一个数据库文件上运行正常。

另一个信息:我可以在 MesaSQLite(Mac 上的 SQLite 文件查看器)中正常打开有问题的文件。

我有什么想念的吗?

【问题讨论】:

    标签: php sql sqlite pdo


    【解决方案1】:

    我使用这样的东西。不知道有没有用

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 似乎无法在$dbh-&gt;prepare 行打开数据库文件。连接到数据库文件时没有发现问题,这很奇怪。上面的代码适用于不同的数据库文件。
      • @user173457 这是因为连接后设置了错误属性尝试这种方法$dbh = new PDO("sqlite:$db", null, null,array(PDO::ATTR_ERRMODE=&gt;PDO::ERRMODE_EXCEPTION));,你会看到错误!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2016-01-27
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多