2013-07-24 65 views
0

好吧,我從來沒有使用動態函數,不知道爲什麼,我從來沒有喜歡使用爆炸(),內爆()等PHP使用while循環來獲取項目,使用動態選擇功能?

但我試過了,出了點問題。

public function fetch($table, array $criteria = null) 
    { 
     // The query base 
     $query = "SELECT * FROM $table"; 

     // Start checking 
     if ($criteria) { 
      $query .= ' WHERE ' . implode(' AND ', array_map(function($column) { 
       return "$column = ?"; 
      }, array_keys($criteria))); 
     } 

     $check = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query); 
     $check->execute(array_values($criteria)); 

     $fetch = $check->fetch(PDO::FETCH_ASSOC); 

     return $fetch; 
    } 

這是我的查詢。

基本上我會返回包含獲取方法的變量$fetch

,然後某處,在這裏我想用while循環來獲取數據,我將使用:

$r = new Database(); 

while ($row = $r->fetch("argonite_servers", array("server_map" => "Wilderness"))) 
{ 
    echo $row['server_map']; 
} 

現在,我沒有得到任何錯誤,但是瀏覽器加載和加載永遠,並且最終會由於內存不足而卡住。

這是因爲循環運行和運行沒有停止。 它爲什麼這樣做?我怎樣才能使這個動態查詢工作?

編輯:

$r = new Database(); 
$q = $r->fetch("argonite_servers", array("server_map" => "Wilderness")); 

while ($row = $q->fetch(PDO::FETCH_ASSOC)) 
{ 
    echo $row['server_map']; 
} 
+0

'的foreach($ R->取(....)爲$項目){}' –

回答

1

,這是因爲你打電話給你取功能在一個循環中,並重新開始,每次查詢。您需要調用$ check-> fetch()in循環。

,或者換句話說,如果你的抓取功能(這可能應該有一個不同的名稱)將返回$檢查,然後對返回的對象,你應該調用取()在一個循環:

$r = new Database(); 
$q = $r->fetch(...); 
while($q->fetch()){...} 

你還需要編輯您的抓取功能,就這樣結束:PDO的

$check->execute(array_values($criteria)); 
    return $check; 
} 
+0

獲得阿塔爾·錯誤:調用一個非對象的成員函數fetch(),閱讀我的編輯 –

+0

是因爲你需要改變你的讀取函數,所以它的結束應該看起來像這樣:$ check-> execute(array_values($ criteria)); return $檢查} – Gavriel

+0

這也工作,謝謝很多Gavriel。 –

1

一個不錯的功能是,PDOStatement實現Traversable。這意味着你可以直接遍歷它:

// `$check` is a `PDOStatement` object 
$check = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query); 
$check->execute(array_values($criteria)); 

$check->setFetchMode(PDO::FETCH_ASSOC); 

return $check; 

使用它:

$statement = $r->fetch("argonite_servers", array("server_map" => "Wilderness")); 
foreach ($statement as $row) { 

} 
+0

工作得很好,謝謝! –

+0

如果我想要取一個項目而沒有循環,該怎麼辦? –

+0

只需調用'$ row = $ statement-> fetch();' – bitWorking