2011-11-16 62 views
1

當我需要知道在插入之前是否有獨特的東西。我通常只是試圖插入它,然後如果失敗,檢查是否mysql_errno()是1062.如果它是我知道它作爲重複鍵失敗,我可以做任何我需要做的事情。mysql surpress dupe關鍵錯誤

最常見的地方是在用戶表中。我將電子郵件設置爲與登錄時的「用戶名」一樣唯一。在處理註冊表單時,我並沒有運行額外的查詢來檢查唯一性,而只是編譯查詢,執行並檢查1062錯誤號。如果1062失敗,我很好地告訴用戶電子郵件已註冊,並且一切都很好。

但是我最近設置了一個非常基本的MITM sql查詢函數,它爲系統上的其他開發人員提供了查詢時間的訪問權限,頁面底部所有sql查詢的日誌,最重要的是函數它根據需要建立mysql連接到正確的數據庫(而不是手動連接和傳遞鏈接標識符)。

在sql錯誤查詢日誌中這個函數在磁盤上創建,是我所有的重複條目。這顯然不會讓其他人看到錯誤(即使在處理和預期的情況下)。有沒有一種方法來抑制錯誤,但仍然能夠檢查mysql_errno()?

+4

爲什麼不搜索表中的密鑰,並發現它被找到時重複?所以不會發生錯誤,而且您不需要抑制它。 – Nobody

+0

,因爲那是額外的mysql查詢和附加代碼。如果我將用戶名從電子郵件更改爲指定的用戶名,會發生什麼。我將不得不在需要知道該唯一密鑰的任何地方修改代碼。性能明智,我想它只有幾毫秒的幫助,但我想保持我的查詢計數儘可能低。 – Lee

+0

你已經創建了一個記錄事物的函數,並且抱怨記錄太多了?這是你的功能...你不能修改它不記錄「無關」的錯誤? –

回答

1

雖然在我的帳戶上做了一些家務活,但我認爲最好用我的發現來回答這個問題,這樣我就可以關閉它了。這基本上是我上面最後一條評論的結論。

如果你(像我一樣)在你的應用程序中使用某些錯誤代碼來減少驗證查詢或代碼(重複鍵是我發現的最常見的鍵)。阻止錯誤被拋出的唯一方法是捕獲mysql內部的錯誤並處理它。我不會進入如何到這裏,但一個良好的開始是:

http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

注:只是爲新開發的擺在那裏,也不要忘記檢查「ON DUPLICATE KEY」(谷歌它)。這是我在其他地方盲目建議的東西。它不適合這個例子,但我已經使用它來保存年份,以便在插入之前保存重複記錄的檢查(它不會在重複條目上返回失敗,所以它只有在您想使用重複錯誤處理程序取而代之的是執行更新...因此在這裏找到你的方式)