php - PDO 和 SQLite3 中准备好的查询有区别吗?

标签 php pdo sqlite parameterized-query

我一整天都在为此抓狂。我在 Windows 和 Linux 上看到了相同的行为。

此站点和其他站点上的简单示例完美地演示了参数化查询如何与 SQLite 配合使用(使用 SQLite3 类)。然而,使用 PDO 类时,相同的示例不起作用 - 它们返回零行。我找不到任何理由。

这是我的测试 PHP 脚本,它有效地执行了两次相同的操作 - 一次通过 SQLite3 连接,然后使用 PDO。第一个返回插入的行,第二个则不返回,尽管插入的行存在于数据库中。我做错了什么?

<?php
echo "connecting via SQLite3<BR>";

unlink('mysqlitedb.db');
$db = new SQLite3('mysqlitedb.db');

$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");

$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);

$result = $stmt->execute();
var_dump($result->fetchArray());

echo "<P>Connecting via PDO<BR>";

unlink('mysqlitepdo.db');
$db = new PDO('sqlite:mysqlitepdo.db');

$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");

$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);

$result = $stmt->execute();
var_dump($result->fetchArray());

?>

执行此脚本时,它返回:

connecting via SQLite3
array(2) { [0]=> string(14) "This is a test" ["bar"]=> string(14) "This is a test" }
Connecting via PDO

Fatal error: Call to a member function fetchArray() on a non-object in D:\docs\LRRSA\LRRSA_site\MCC\foobar.php on line 28

我认为 fatal error 是因为 varDump 没有返回任何行而引起的。

我确信这是显而易见的事情,但如果是这样的话,对我来说就太明显了:-)

最佳答案

这些库(SQLite 与 PDO)在语义上几乎相同,但在本质上存在一些差异。

例如,对于 PDO,PDOStatement returns either false or trueexecute() 方法而不是结果集。所以当你这样做时:

$result->fetchArray();

你基本上在做:

true->fetchArray();

这当然不是一个有效的方法(因为 true 没有任何方法,是一个 bool 值)。您可以使用 fetchAll() 从执行的 PDO 语句中获取结果。语句本身的方法:

$stmt->fetchAll();

关于php - PDO 和 SQLite3 中准备好的查询有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34525508/

相关文章:

php - 将多个变量传递给 View ?

php - 是否存在这样的 SQL 查询?

php - phpunit 有默认位置吗?或者当我想使用它时,我是否必须继续在命令行中导出路径?

php - 从表中选择日期范围内的行

java - 如何在 Ubuntu 下为 Java 设置 SQLite?

php - 在 PHP-PhantomJS 中执行 PhantomJS 程序时出错

php - 将mysql转换成PDO格式

php - PDO 结果到数组

python - 将 Chrome 历史文件 (sqlite) 中的日期时间字段转换为可读格式

java - SQLite (1) 没有这样的表