2016-11-03 189 views
-2

有沒有辦法區分查詢形成不正確時與MySQL返回的錯誤信息VS用戶輸入錯誤輸入?查詢錯誤時出現錯誤VS輸入錯誤時

例如:

//WRONG QUERY 
try {  
    INSERT into table_name ('clm1','clm2') values('val1','val2'); //BAD query 
    } 
catch (PDOException $e) { 
     echo $e->getMessage(); //display the error message returned 
} 

VS.

//wrong user input 

try { 
    INSERT INTO table_name ('unique_clm1') value('duplicate_value_from_user'); 
} 

    catch (PDOException $e) { 
      echo $e->getMessage(); //display the error message returned 
    } 

原因:

如果在開發者編寫的查詢時出現錯誤;錯誤需要顯示爲原始MySQL錯誤以進行調試......而不良用戶條目需要顯示爲錯誤消息給用戶而不會中斷正常的代碼流程.....

+1

用戶輸入在到達數據庫之前應進行驗證和消毒。換句話說,當你運行db查詢時,壞的用戶輸入應該*理想地*不會是一個因素。 –

+0

我不確定依靠數據庫進行用戶輸入驗證是個好主意。您應該在代碼中執行此操作,並在用戶進入DB INSERT – Galz

+0

輸入驗證之前警告用戶。然後告訴用戶出了什麼問題,然後重試。 – Irvin

回答

1

您有幾種選擇:

1.使用INSERT IGNORE

用ignore意味着查詢將不會重複鍵失敗。所以失敗意味着查詢中存在問題。 要知道是否有重複,您只需要獲取受影響的行數。 0意味着什麼都沒有插入(所以有一個重複的值)。 1意味着插入了一行。

2.使用測試,以趕上不好的查詢代碼

壞查詢呆壞,直到固定。對於某些用戶來說他們不會有好處,然後對其他用戶不利。 所以如果你有到位一些測試,測試將趕上BUGS而錯誤代碼中的處理將趕上「出事了」,可能是重複的條目,DB連接等

3.閱讀錯誤消息

在您的代碼中,您可以閱讀$ e的內容並進行相應處理。如果$ e包含duplicate key或相關錯誤代碼,請通知用戶。 否則將錯誤記錄爲其他內容(不一定是錯誤的查詢 - 數據庫連接是運行時可能出現的錯誤的另一個很好的示例)。