2011-03-07 78 views
0

我想學習使用PDO,而不是庫MySQLi數據庫訪問,我有麻煩了從數據庫中選擇數據PDO數據庫訪問。我想用:

$STH = $DBH->query('SELECT * FROM ratings WHERE title=$title ORDER BY date ASC'); 
$STH->setFetchMode(PDO::FETCH_ASSOC); 

while($row = $STH->fetch()) { 
    echo $row['title']; 
} 

,但我得到這個錯誤:

Fatal error: Call to a member function setFetchMode() on a non-object in /home/owencont/public_html/owenstest.com/ratemystudents/index.php on line 6

如果我參加了WHERE語句,它工作正常。我如何根據它的值是否與變量匹配來選擇一行?

感謝,

歐文

回答

2

這很可能是SQL語法錯誤,因爲您忘記引用$title。它結束了在查詢(也甚至沒有插爲字符串)裸字,從而導致錯誤。而您的PDO連接未配置爲報告錯誤。使用 - >報價()的參數的前 - >查詢():

$title = $DBH->quote($title); 
$STH = $DBH->query("SELECT * FROM ratings WHERE title=$title "); 

或者更好的是,使用參數化的SQL:

$STH = $DBH->prepare("SELECT * FROM ratings WHERE title=? "); 
$STH->execute(array($title)); 
+0

不應該這樣來工作呢? \t $ title ='the title'; \t \t $ title = $ DBH-> quote($ title); \t $ STH = $ DBH-> prepare(「SELECT * FROM ratings WHERE title =?ORDER BY date ASC」); \t $ STH-> execute(array($ title)); \t \t while($ row = $ STH-> fetch(PDO :: FETCH_ASSOC)){ \t \t echo $ row ['title']; \t \t} – 2011-03-07 18:13:47

+0

@Owen:不,只做其中的一個。用 - > prepare和 - >執行 - >引用或'?'綁定參數。 – mario 2011-03-07 18:17:39

+0

謝謝你的幫助,你的方法似乎是最好和最安全的。 – 2011-03-07 18:22:52

0

刪除變量出來的SQL語句,因爲它的一個PHP變量

$STH = $DBH->query('SELECT * FROM ratings WHERE title=' . $title . 'ORDER BY date ASC'); 
+0

爲什麼會這樣得到downvote?答案在技術上是正確的... – 2011-03-07 18:05:50

+0

這是SQL連接,沒有轉義,也沒有引用 - 它要求SQL注入。 PDO已經準備好了佔位符的聲明,並且應儘可能使用這些聲明。 「正確」答案不應包含安全漏洞和最差做法。 – Charles 2011-03-07 18:11:58

+0

你有很多downvoting然後做:P讓社區投票更正確的答案,教這些方法,並節省downvotes完全錯誤的答案。這只是我的看法。 – 2011-03-07 18:18:15

1

的看看PDO::preparePDOStatement::execute。用戶的內容添加到查詢的最安全的方法是準備一個基本的語句和參數綁定到它。示例(請注意SQL語句中的問號):

$STH = $DBH->query('SELECT * FROM ratings WHERE title=? ORDER BY date ASC'); 
$STH->execute(array($title)); 

while($row = $STH->fetch(PDO::FETCH_ASSOC)); 
0

使用雙引號而不是單引號作爲查詢方法的參數。

你得到這個錯誤的原因是因爲查詢方法失敗,所以$ STH對象未創建。你應該實現一些錯誤處理。