2012-07-29 82 views
2

我用OOP方式使用mysqli預處理語句。一切都按預期工作,但我似乎無法找到任何有關如何在while循環中檢測並拋出異常的文檔。這是我的代碼目前的狀態,它完美的工作。如何在獲取mysqli結果時在while循環中拋出異常?

$rslt=array(); 
$data=array(); 
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']); 
while($stmt->fetch()){ 
    $data[]=$rslt; 
} 

但是它不包含拋出異常的方法。這就是我如何在類似的腳本中拋出一個異常,它只限於1個結果(因此我不需要在這個例子中循環它們)。

$rslt=array(); 
$data=array(); 
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']); 
if(!$stmt->fetch()){ 
    throw new Exception('Failed to fetch results', 1); 
} 
$data[]=$rslt; 

我幾乎想要做的是在下面的代碼,但它引發以下錯誤: -

"Parse error: syntax error, unexpected T_THROW in xxx/xxx/includes/_xxxClass.php on line 95

while($stmt->fetch()){ 
    $data[]=$rslt or throw new Exception('Failed to fetch results', 1); 
} 

我正在尋找的是一個方法,如果提取結果時出錯,然後在我的while循環中拋出一個異常。

在此先感謝!

+0

你說的*意味着什麼不起作用*? – Shoe 2012-07-29 11:11:50

+0

你指的是代碼塊#3嗎?我得到一個PHP錯誤告訴我,我所做的包含無效的語法。這應該是正確的嗎? – Grenville 2012-07-29 11:14:24

+0

你能提供錯誤嗎? – Shoe 2012-07-29 11:14:53

回答

0

您正在執行的測試存在缺陷。 mysqli::fetch()在失敗時返回false,所以while循環會在它看到false時立即退出。如果沒有返回結果,那麼循環將不會執行,並且$ data將爲空。

你需要做的,而不是什麼是測試如果$數據while循環後填充,然後把你的異常,如果它是空: -

while($stmt->fetch()){ 
    $data[]=$rslt; 
} 
if(empty($data)) throw new Exception('Failed to fetch results', 1); 

細想,你不應該拋出異常只是因爲沒有結果返回,只需返回空數組: -

例外情況用於處理異常情況,空結果集也不例外。

+0

我正在使用Mysqli準備的語句,而不是PDO。但根據文檔http://www.php.net/manual/en/mysqli-stmt.fetch.php,fetch()方法在失敗時也返回FALSE。那麼從理論上講,我可以運用上面提到的相同的邏輯? – Grenville 2012-07-29 11:34:31

+0

對不起,我的錯誤,但是,同樣的邏輯適用。 – vascowhite 2012-07-29 11:35:06

+0

太棒了,謝謝。如果發生錯誤,這是在我的while()語句的每個循環中檢查的更好選擇。當然,這對資源來說肯定會更好? – Grenville 2012-07-29 11:36:08

0

考慮$mysqli您的mysqli處理程序,你可以嘗試使用:

if ($mysqli->errno) { // an error occurred, throw exception } 
+0

我會在我的while循環或之前使用這個例子將是理想的,謝謝 – Grenville 2012-07-29 11:25:31

+0

在你的while循環 – Shoe 2012-07-29 11:29:44

+0

感謝您的幫助,所以這將是一個正確的使用,如果聲明?http://pastebin.com/1nRqTGSq – Grenville 2012-07-29 11:31:18

相關問題