我整天都在用头发撕掉我的头发。我在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返回任何行。
我确定这是显而易见的事情,但如果是这样,那对我来说太明显了: - )
答案 0 :(得分:2)
库(SQLite vs PDO)在语义上几乎相同,但是有一些差异。
例如,PDO是PDOStatement returns either false
or true
的execute()
方法,而不是结果集。所以当你这样做时:
$result->fetchArray();
你基本上在做:
true->fetchArray();
这当然不是一个有效的方法(因为真的没有任何方法,是一个布尔值)。您可以使用语句本身上的fetchAll()方法从已执行的PDO语句中获取结果:
$stmt->fetchAll();