我一整天都在为此抓狂。我在 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 true
的 execute()
方法而不是结果集。所以当你这样做时:
$result->fetchArray();
你基本上在做:
true->fetchArray();
这当然不是一个有效的方法(因为 true 没有任何方法,是一个 bool 值)。您可以使用 fetchAll() 从执行的 PDO 语句中获取结果。语句本身的方法:
$stmt->fetchAll();
关于php - PDO 和 SQLite3 中准备好的查询有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34525508/