2013-06-27 32 views
1

我試着通過PHP和PDO查詢以獲得從MySQL數據庫是這樣的:通過PDO查詢存儲在對象中的MySQL數據庫的每一行?

return array(
    "Jungle Book" => new Book("Jungle Book", "R. Kipling", "A classic book."), 
    "Moonwalker" => new Book("Moonwalker", "J. Walker", ""), 
    "PHP for Dummies" => new Book("PHP for Dummies", "Some Smart Guy", "") 
); 

數據庫的每一行應該存儲在一個對象。 任何人都可以幫助我嗎?

我嘗試這樣做:

return array(
    foreach ($dbh->query("SELECT * FROM books") as $row) { 
     $row['name'] => new Book($row['name'], $row['author'], $row['description']); 
    } 
) 

...的foreach,但沒有在陣列允許...

背景:學習的目的,我下面這個教程:http://php-html.net/tutorials/model-view-controller-in-php/和我現在嘗試用代碼與真實數據庫一起替換靜態列表。

+0

您需要'$ dbh-> query(「SELECT * FROM books」) - > fetchAll(PDO :: FETCH_ASSOC)'才能使其工作。 Foreach是爲數組而製作的。你想要foreach一個對象(PDOStatement)。 –

+0

@ N.B。,你不應該將fetchAll()鏈接到query(),因爲query()不能保證返回一個PDOStatement對象。它在錯誤時返回「false」。 –

+0

@BillKarwin - 人在學習過程中,拋出像我們這樣的術語暫時沒有幫助。我知道如何使用手冊並對不起,如果我聽起來粗魯,但我個人確實知道。 –

回答

3

這個問題有沒有關係MVC或PDO實際上,而是用PHP語法可言。

你的任務是相當簡單的,只是你需要的是從構思在一個單一的運營商不要有所有代碼的:

$data = array(); 
$stmt = $dbh->query("SELECT * FROM books"); 
foreach ($stmt->fetchAll() as $row) { 
    $data[$row['name']] = new Book($row['name'], $row['author'], $row['description']); 
} 
return $data; 

雖然PDO對你有一個語法糖,在我看來,一個必須先學習基本的基本陳述。

+0

感謝您的意見和您的代碼。當我用一個簡單的賦值運算符替換第4行中的雙箭頭時,該代碼完全適用於我。 (如果不改變6個以上的字符,我不能編輯它)。我認爲這只是筆的一部分?或者我做錯了什麼? 你說得對,我在PHP中並沒有那麼強大,只是試着學習一些操作示例中的oop,mvc和pdo概念......也許我必須先回到一些PHP基礎知識。 – johnnydoe82

+0

謝謝,這是我的代碼中的一個錯字。 –

3

您可以將獲取類型設置爲FETCH_CLASS。

在單個語句中創建和返回數組是一種人爲和不必要的要求。我不會那麼做,它會讓代碼很難調試,很難測試,並且很難維護。此外,query()方法可能會返回錯誤false,所以如果您嘗試在foreach語句中使用它,將會是一個致命錯誤。

$stmt = $dbh->query("SELECT * FROM books"); 
if ($stmt === false) { /* do something to handle the error */ } 
$results = $stmt->fetchAll(PDO::FETCH_CLASS, 'Book'); 
return $results; 

或者,如果你想有一個結果數組按名稱索引:

$stmt = $dbh->query("SELECT * FROM books"); 
if ($stmt === false) { /* do something to handle the error */ } 
$results = array(); 
while ($book = $stmt->fetch(PDO::FETCH_CLASS, 'Book')) { 
    $results[$book->name] = $book; 
} 
return $results; 
+0

非常感謝您的回答! 我認爲不是通過單個語句返回數組是絕對有意義的。 – johnnydoe82

0

您可能想要返回關聯數組值。在您當前的代碼中,您不能在數組內部運行foreach。但你可以這樣做:

return $dbh->query("SELECT * FROM books")->fetchAll(PDO::FETCH_ASSOC); 
+0

Upvoter,小心解釋一下? –

相關問題