【问题标题】:Simple Query using sqlite 3, php and PDO fails使用 sqlite 3、php 和 PDO 的简单查询失败
【发布时间】:2017-08-18 12:47:11
【问题描述】:

这是一个问题的第一篇文章。试图在这里找到答案,但所有相关帖子似乎都已过时或使用不推荐使用的 mysql。

sqlite 新手,请原谅可能看起来很愚蠢的内容,但下面代码中的查询永远不会起作用。注意:我们在现场使用 php 5.6 运行 sqlite3 和 PDO。 创建数据库的程序运行良好。应用程序“Db Browser for SQL Lite”可以很好地显示数据库、表和数据。但是这个:

<?php
//open the database
$myPDO = new PDO('sqlite:MySqlitedb1');
print "<p>db opened</p>";
$result = $myPDO->query('SELECT * FROM users');

//if the query works
if ($result !== FALSE) {
   print "<p>query ran</p>";   
   foreach($result as $row){
   print "<p>".$row."</p>"; 
   }  
 } else {
 // when the query fails
 print "<p>query failed</p>"; 
}  //end if

// close the database connection
$myPDO = NULL;
?>

总是导致“查询失败”。对存在的特定记录的查询也会失败。

还使用 fetch 和 fetchall 在上面的代码中尝试了一些其他测试,它们产生了如下错误:

mod_fcgid: stderr: PHP Fatal error: Call to a member function fetchAll() 
on boolean in (path emoved)/testpdo2.php on line 27

我确定这是由于查询失败导致 $result 为 null/false 我显然在这里遗漏了一些愚蠢的东西?

乔 C.

【问题讨论】:

  • 您如何确保您使用的是正确的目录?

标签: php pdo sqlite


【解决方案1】:

解决了。代码应该可以工作(现在可以了)。不是

  • 目录问题
  • 权限问题
  • tmp 目录中的 debug_kit.sqlite 文件,或 tmp 目录中的任何文件。
  • SCP 或“同步”目录问题

我更改了代码并捕获了一个异常(第一个是“坏”数据库,然后是好一个):

<?php

$myPDO = NULL;              //close db just in case...

//open the database
$myPDO = new PDO('sqlite:newsqlite2.db');

//throw exceptions
$myPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if ($myPDO != null)
    print "<p>db connected</p>";
else
    print "<p>db did not connect</p>";
// result: db does open

//1st test
try
{
     $result0=$myPDO->query('SELECT * from  users');
     print "<p>query ran</p>";
}
catch(PDOException $e)
{
     echo "Statement failed: " . $e->getMessage();
     return false;
}

// close the database connection
$myPDO = NULL;

?>

这引发了原始 DB (MySqlitedb1) 的错误和 PDO 异常:

SQLSTATE[HY000]: General error: 11 database disk image is malformed

现在,尽管在数据库上运行的分析工具说它“很好”,并且能够使用“SQLite 数据库浏览器”之类的工具在数据库上工作,没有任何问题,也没有创建其他数据库的问题,但还是有问题文件。这导致查询失败并始终返回布尔值“false”,因此代码失败。

我们通过将数据库转储到 sql 文件来修复数据库,然后将其导入(使用“用于 SQLite 的数据库浏览器”)以创建一个包含数据的新数据库 (newsqlite2.db)。使用该数据库,代码运行良好,提取数据等。

至于数据库为什么/如何变得“损坏”或者奇怪的损坏是什么,我不知道。 :)

乔 C.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2012-07-25
    • 2012-08-27
    • 2020-02-10
    • 2011-05-26
    • 2017-12-16
    相关资源
    最近更新 更多