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 true
的 execute()
方法而不是结果集。所以当你这样做时:
$result->fetchArray();
你基本上是在做:
true->fetchArray();
这当然不是有效方法(因为 true 没有任何方法,是一个布尔值)。您可以使用语句本身的 fetchAll() 方法从已执行的 PDO 语句中获取结果:
$stmt->fetchAll();
我一整天都为此焦头烂额。我在 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 true
的 execute()
方法而不是结果集。所以当你这样做时:
$result->fetchArray();
你基本上是在做:
true->fetchArray();
这当然不是有效方法(因为 true 没有任何方法,是一个布尔值)。您可以使用语句本身的 fetchAll() 方法从已执行的 PDO 语句中获取结果:
$stmt->fetchAll();