2015-12-30 63 views
1

我一直在用這件事撕掉我的頭髮。我在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返回的致命錯誤引起的。

我敢肯定,這是顯而易見的事情,但即便如此它太明顯了,我:-)

回答

2

的庫(SQLite的VS PDO)在語義上是幾乎相同的,但引擎蓋下有一定的差異。

例如,使用PDO​​方法的PDOStatement returns either false or true而不是結果集。所以,當你這樣做:

$result->fetchArray(); 

你基本上做:

true->fetchArray(); 

這當然不是一個有效的方法(因爲真正沒有任何方法,是一個布爾值)。您可以在執行的PDO語句中使用fetchAll()方法從語句本身獲取結果:

$stmt->fetchAll(); 
+0

謝謝。這當然有效,儘管我從來沒有使用過fetchAll(),並且一直使用PDO連接到數據庫。這是唯一的區別,這是我經常使用的: $ qq = $ db-> prepare($ sql); (數組())或死(print_r($ db-> errorInfo(),true));foreach($ qq as $ row){.....} 和完美的工作是prepare()和execute()之間的bindValue()。 明天我會花更多的時間檢查PDO訪問。 –

+0

我現在明白我做錯了什麼。我與PDO連接,但後來搜索幫助查詢集中在SQLite,而不是PDO。 –