2012-03-05 39 views
0

當在傳統的PHP mysql中有SQL語法錯誤時,查詢不會沒有任何其他效果。但在mysqli的,它會與致命錯誤如何在PHP mysqli中跳過非對象錯誤?

mysql_query("SELECT title, misspelled_column FROM posts"); 

$mysqli->query("SELECT title, misspelled_column FROM posts"); 

殺PHP腳本在第一種情況下,它會顯示其他查詢和PHP輸出;但第二種情況下殺死由

Fatal error: Call to a member function fetch_assoc() on a non-object 

腳本的問題與虛假查詢返回non-object。我可以跳過通過

if($result){$row = $result->fetch_assoc();} 

這個錯誤,但我的問題是,爲什麼我沒有需要此檢查在經典mysql?有了更先進的系統,人們希望新功能不會遺漏我們所擁有的功能。

+6

修復錯誤。問題解決了。 – 2012-03-05 02:04:21

+0

您不應該需要處理MySQL語法錯誤,因爲在開發階段應該關注這些錯誤。永遠不要使用錯誤抑制運算符來實現類似的功能。 – rdlowrey 2012-03-05 02:13:00

+0

請包含錯誤消息。 – kapa 2012-03-05 08:13:39

回答

1

MySQL產生的錯誤不應該停止執行。事實上,您可以通過使用$mysqli->error(假設$mysqli是您的數據庫連接,如您的示例中)那樣讓您的腳本顯示任何SQL錯誤。但是,可能發生的情況是您的mysqli錯誤導致不創建特定的對象,然後在該對象上調用方法將導致致命的PHP錯誤。例如:

$dbconn = new mysqli("localhost", $username, $password, $dbname); 
$stmt = $dbconn->prepare("bluh"); // not a valid statement. fails to create a mysqli statement object in $stmt. 
echo($dbconn->error); // your script is still running, and this will show your MySQL syntax error. 
$stmt->execute(); 

,因爲你做一個SQL錯誤這會死,而是因爲$stmt爲空,並沒有預期的​​方法。就像其他人所說的那樣,檢查你的日誌,看看實際的錯誤是什麼。

使用@來忽略錯誤將被命中或者遺漏,直到找出哪個特定的命令正在創建錯誤。

更新:如果您知道錯誤在查詢中,那麼您可以檢查查詢是否成功,然後再嘗試對它進行任何操作。一種方法是檢查error參數;另一個是檢查以確保它實際上返回了你想要的那種對象。

這裏都是例子:

$result = $db->query("select firstname, lastname from people where firstname = 'egbert';"); 
if($db->error == '') { 
    // the query worked, so fetch results from $result and do stuff with them. 
} 
else { 
    // the query didn't work, so don't try to do anything with $result 
} 

// alternately: 
if(gettype($result) == "object") { 
    // the query worked. 
} 
else { 
    // it didn't. 
} 
+0

我跟着我的錯誤,他們正是由於你引用的原因;但我不知道如何避免由於mysqli無對象輸出造成的致命錯誤。 – Googlebot 2012-03-05 02:50:38

+0

在這種情況下,它可能會幫助您發佈實際上會給您帶來錯誤的代碼 - 您在問題中給出的示例代碼是不夠的。 – octern 2012-03-05 02:54:41

+0

我把這個問題編輯爲一個非常基本的例子。 – Googlebot 2012-03-05 05:37:13

0

在我的經驗中,一個SQL錯誤並不能殺死mysqli。我懷疑你在相關聲明中實際上有一個PHP錯誤。檢查你的錯誤日誌。

在PHP中,您可以使用@來抑制錯誤。這是不好主意在這裏使用它。但是,如果這就是你真正想要的,那就記錄在http://php.net/manual/en/language.operators.errorcontrol.php

+1

它不是「通常」,但總是一個壞主意。這顯然不是OP所需要的。 – 2012-03-05 02:22:40

+1

一個平常的「我只讀問題的標題,不要錯過自己閱讀身體」的答案。 「如何忽略錯誤」關鍵字觸發自動答案。沒有介入。我想知道爲什麼沒有這樣的功能已經編程,使發燒友過時。 – 2012-03-05 02:25:43

+0

@ Col.Shrapnel這個故事不像你說的。由於語法錯誤,我的PHP設置中應該有一些內容導致致命錯誤。由於我最近從mysql移到mysqli;我問是否有人可以給我一個提示如何設置PHP以避免這種情況。 – Googlebot 2012-03-05 02:37:51