2012-12-12 239 views
1

當我有以下功能:錯誤返回準備語句結果

class Forums { 
     public function getForum($id) { 
      $database = new Database(); 
      $mysqli = $database->databaseConnection(); 
      $stmt = $mysqli->prepare("SELECT name, description FROM forums WHERE id = ?"); 
      $stmt->bind_param("i", $id); 
      $stmt->execute(); 
      return $stmt; 
     } 
} 

我調用它是這樣的:

$forums = new Forums(); 
$result = $forums->getForum($_GET["id"]); 
$result->bind_result($name, $description); 
$result->fetch(); 

然後,因爲它僅返回一行,調用$name$description每當我需要它。

不過,我得到以下錯誤在我的瀏覽器(Chrome):

錯誤324(淨值:: ERR_EMPTY_RESPONSE):服務器關閉了連接不發送任何數據「

此。如果我擺脫了函數並連接到數據庫並直接在使用結果的文件中創建預準備語句,則不會發生。

這是怎麼回事?

回答

2

看起來像是variable scope問題。方法執行getForum()後直接銷燬對象$mysqli。因此,此時打開的數據庫連接也被破壞。但$result->fetch();需要連接仍然打開。

+0

嗯,有趣。但是我怎麼去解決這個問題,同時仍然保持面向對象? – Eleeist

+0

你的代碼與封裝規則不兼容(在我看來)。雖然'getForum()'隱藏數據庫交互,它應該*完全*隱藏在裏面。你可以返回一個乾淨的數組(我的意思是內存限制)。另一種方法是在'getForum()'內部傳遞任何回調函數,通過'$ stmt-> fetch()'操作來迭代數據庫行。 –

+0

你是對的 - 通過重構我的函數來返回數組並返回最終結果來解決問題。感謝提示! – Eleeist