PDO 和 SQLite3 中准备好的查询之间有区别吗?

Is there a difference between prepared queries in PDO and SQLite3?

我一整天都为此焦头烂额。我在 Windows 和 Linux.

上看到相同的行为

本网站和其他网站上的简单示例可以很好地演示参数化查询如何与 SQLite 一起工作(使用 SQLite3 class)。但是,相同的示例在使用 PDO class 时不起作用 - 它们 return 零行。我找不到任何理由。

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

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

?>

执行此脚本时 returns:

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

我认为致命错误是因为没有行被 returned 用于 varDump。

我确定这很明显,但如果是这样的话,对我来说就太明显了:-)

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

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

$result->fetchArray();

你基本上是在做:

true->fetchArray();

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

$stmt->fetchAll();