2013-01-16 14 views
-2
<?php 
$config['db'] = array (
'host'      => 'localhost', 
'username'     => 'root', 
'password'     => '', 
'dbname'     => 'pdologin' 
); 

$db = new PDO("mysql:host={$config['db']['host']};dbname={$config['db']['dbname']}", 
     $config['db']['username'], $config['db']['password']); 
$query = $db->query("SELECT * 'firstname' FROM 'login'"); 
while ($row = $query->fetch(PDO::FETCH_ASSOC)){ 
echo $row['firstname'], '<br>'; 
} 
?> 

當我運行代碼時,出現錯誤「致命錯誤:致電到位於第12行的C:\ webroot \ wamp \ www \ index.php中的非對象上的成員函數fetch()。pdo未返回輸出。致命錯誤:調用成員函數fetch()在第12行的C: webroot wamp www index.php中的非對象上

什麼使它出錯?我唯一能想到的就是SQL查詢。

+2

這是整個相關邊欄的約2/3的欺騙。請做適當的研究,你會發現根本原因。 – Charles

回答

0

此SQL查詢在兩個語法錯誤:

$query = $db->query("SELECT * 'firstname' FROM 'login'"); 

不能使用一個字符串作爲一個表FROM子句。

說明:不同類型的引號在SQL中執行不同的操作。

  • 單引號總是字符串文字或日期文字的分隔符。
  • 在MySQL中,反標記是表標識符(以及列和其他元數據對象)的分隔符。
  • 雙引號是標準SQL中表標識符的分隔符,如果設置爲SQL_MODE=ANSI_QUOTES,則雙引號是MySQL中的分隔符。但在MySQL中默認情況下,雙引號與單引號相同,分隔字符串和日期。

您也有'firstname'在您的查詢在一個無效的地方。我不知道是否你想要命名一個列(如果是這樣,你再次得到的報價類型錯誤),或者如果你的意思是它是一個列別名(如果是這樣,你不能別名*,你可以僅別名一個特定列)。

所以您的查詢應該是這樣的:

$query = $db->query("SELECT * FROM `login`"); 

腳本中的另一個錯誤是,你不驗證$query是對它調用PDOStatement對象方法之前類型PDOStatement對象的對象。如果SQL中有錯誤,PDO :: query()將返回falsefalse是一個原始值,而不是一個對象,所以它自然不會有任何方法可以調用。所以你總是必須在做任何事情之前檢查返回值。

例如:

$query = $db->query("SELECT * FROM `login`"); 
if ($query === false) { 
    die(print_r($db->errorInfo(), true)); 
} 
相關問題