我一直在用這件事撕掉我的頭髮。我在Windows和Linux上看到了相同的行爲。在PDO和SQLite3中準備好的查詢有區別嗎?
本網站和其他網站上的簡單示例非常好地演示了參數化查詢如何與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返回的致命錯誤引起的。
我敢肯定,這是顯而易見的事情,但即便如此它太明顯了,我:-)
謝謝。這當然有效,儘管我從來沒有使用過fetchAll(),並且一直使用PDO連接到數據庫。這是唯一的區別,這是我經常使用的: $ qq = $ db-> prepare($ sql); (數組())或死(print_r($ db-> errorInfo(),true));foreach($ qq as $ row){.....} 和完美的工作是prepare()和execute()之間的bindValue()。 明天我會花更多的時間檢查PDO訪問。 –
我現在明白我做錯了什麼。我與PDO連接,但後來搜索幫助查詢集中在SQLite,而不是PDO。 –