这是一个问题的第一篇文章。试图在这里找到答案,但所有相关的帖子似乎过时或使用弃用的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.
答案 0 :(得分:0)
这已经解决了。代码应该有效(现在就可以)。它不是
- 目录问题
- 权限问题
- tmp目录中的debug_kit.sqlite文件,或tmp目录中的任何文件。
- SCP或“同步”目录问题
我修改了代码并捕获了一个异常(第一个是“坏”DB然后是好的):
<?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;
?>
这引发了原始数据库(MySqlitedb1)和PDO异常的错误:
SQLSTATE[HY000]: General error: 11 database disk image is malformed
现在,DESPITE分析在数据库上运行的工具,说它“很好”并能够使用“DB Browser for SQLite”之类的工具处理数据库,没有任何问题,也没有创建其他数据库的问题,SOMETHING是错误的文件。这导致查询失败并始终返回布尔值'false',因此代码失败。
我们通过将数据库转储到sql文件,然后导入它(使用“DB Browser for SQLite”)来修复数据库,以创建一个包含数据的新数据库(newsqlite2.db)。使用该数据库,代码运行正常,提取数据等。
关于数据库为何/如何变得“腐败”或者是什么奇怪的腐败,我没有任何线索。 :)
乔C.