【问题标题】:Can't get PHP to query anything with sqlite using PDO无法让 PHP 使用 PDO 使用 sqlite 查询任何内容
【发布时间】:2013-08-14 04:38:15
【问题描述】:

我要离开 Zend 教程 here。它已经过时了几年,并且给定的 PHP 代码不起作用。我已经从命令行设置了 sqlite 数据库。通过谷歌搜索,我决定尝试 PDO,结果如下:

<?php
$filepath = $_SERVER['DOCUMENT_ROOT'] . "/phpstuff/sqlitedb/testdb.db";
$db = new PDO('sqlite:' . $filepath) or die('Could not open database');
$query = "SELECT * FROM books";
$result = $db->query($query);

echo "<table cellpadding=10 border=1>";
foreach($result as $row) {
    echo "<tr>";
    echo "<td>" . $row[0] . "</td>";
    echo "<td>" . $row[1] . "</td>";
    echo "<td>" . $row[2] . "</td>";
    echo "</tr>";
}
echo "</table>";

$db = NULL;
?>

我在每个页面上包含的页眉和页脚仍然出现,但没有表出现,所以我认为是查询不起作用。我不知道为什么。相反,我尝试使用 while ($row = $result-&gt;fetchArray()) 作为我的循环条件,但也失败了。

我确实运行了phpinfo() 来查看是否安装了 PDO 驱动程序,并运行了extension_loaded 来查看是否安装了 sqlite3。两人都退房了。我还在表格打印输出之前和之后运行了简单的echo 语句,并且都有效。只是根本没有生成表。这可能与我的文件路径有关吗?权限? PHP/sqlite 版本?我的服务器正在运行 Ubuntu 12.04 服务器,该文件位于上面列出的 phpstuff 目录中。 /sqlitedbtestdb.db 权限均设置为 777。

更新:将文件路径更改为简单的/sqlite/testdb.db 会产生错误SQLSTATE[HY000] [14] unable to open database file。目前正在检查这是否是权限问题以及如何更改它

【问题讨论】:

  • 不要将or die() 与 PDO 一起使用(或任何与此相关的东西)。如果无法连接,PDO 构造函数将抛出 PDOException
  • 您还应该在开发过程中启用错误报告。把它放在你脚本的顶部ini_set('display_errors', 'On'); error_reporting(E_ALL);
  • @Phil 谢谢。这给出了Warning: Invalid argument supplied for foreach() in /var/www/phpstuff/phpsqlite.php on line 30。似乎 PHP 由于某种原因无法从数据库中读取数据

标签: php sqlite pdo


【解决方案1】:

这可能不是一个解决方案,但是 cmets 部分太小了。无论如何,它应该可以帮助您找到问题的根源。

首先,启用错误报告

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

一旦投入生产,您就可以删除这些行。

尝试使用更好的文件路径(我一直发现DOCUMENT_ROOT 不可靠,特别是如果您想通过非网络方法访问脚本)。另外,设置 PDO 抛出异常

$db = new PDO('sqlite:' . __DIR__ . '/sqlitedb/testdb.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

很有可能,您的查询失败了,因此$resultfalse。启用正确的错误处理来自 PDO 的异常应该会为您指明正确的方向。

【讨论】:

  • 谢谢。我能够从错误消息SQLSTATE[HY000]: General error: 26 file is encrypted or is not a database 中找到解决方案。 PHP 使用的是 sqlite3,但不知何故数据库是 sqlite2,显然,sqlite3 不向后兼容。但是,这是怎么发生的?根据forum.linode.com/viewtopic.php?p=39974 的说法,一个命令应该可以处理所有事情,但我还必须明确获取 sqlite3 才能使其工作。
猜你喜欢
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2012-01-30
  • 2017-03-13
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多