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

时间:2015-12-30 08:14:38

标签: 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

我认为导致了致命错误,因为没有为varDump返回任何行。

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

1 个答案:

答案 0 :(得分:2)

库(SQLite vs PDO)在语义上几乎相同,但是有一些差异。

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

$result->fetchArray();

你基本上在做:

true->fetchArray();

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

$stmt->fetchAll();