2017-03-05 50 views
2

我有一個PHP腳本從數據庫讀取記錄並返回一個json對象。我在腳本中有錯誤處理,這樣如果發生異常或發生其他錯誤,我仍然返回格式正確的json響應(帶有錯誤代碼和全部)。這工作。防止破解json解析器的PHP警告和錯誤?

但是:如果PHP覺得有什麼可說的話,它在發送json響應後仍然會說。這打破了客戶端的json解析器。因此,而不是ajax調用成功,並顯示錯誤消息,如「數據庫文件未找到」,調用失敗,帶有json解析器錯誤,這是沒有用的(因爲它覆蓋原始,保存錯誤信息):

SyntaxError: JSON.parse: unexpected non-whitespace character 
after JSON data at line 1 column 120 of the JSON data 

我可以用來抑制PHP的消息error_reporting(0) - 但有沒有更好的方法?代碼(輪廓)如下:

<?php 
header('Content-type: application/json'); 
const RESP_OK = 0; 
const RESP_EXCEPTION = 1; 
try { 
    // do the database stuff and build $response  
    $response['exitcode'] = RESP_OK; 
} catch (Exception $e) { 
    // put error info in the response 
    $response['exitcode'] = RESP_EXCEPTION; 
    $response['error'] = 'code: ' . $e->getCode() . ' (line ' . 
     $e->getLine() . ') message: ' . $e->getMessage(); 

} finally { 
    // always send back a response 
    echo json_encode($response); 
    error_reporting(0); 
    // also close the db here etc. 
} 
?> 
+0

我會迴應Maarten的答案 - 防止來自PHP的錯誤和警告的最佳方式是追蹤導致它們的原因,而不是尋找解決方法。 –

+0

我同意。關鍵是,我已經在檢查(全部)錯誤。這就像例外:一旦你使用try/catch來處理它們,你不希望發生默認的異常行爲(例如,你希望自己的錯誤信息在你自己的應用程序中正確顯示)。我可以捕捉異常,但沒有嘗試/捕獲PHP的警告和通知(是嗎?),所以即使我檢查所有結果並相應地繼續,PHP仍然發佈它們,並打破了應用程序。 –

+0

返回的JSON數據是什麼?那麼我們如何尋找那些產生這個意想不到的空白字符的東西呢? :) –

回答

2

錯誤報告是一個調試的功能,因此,它可以/應該/將在生產環境中關閉,而不是在你的發展。

您應該以您的代碼覆蓋您的代碼的方式編寫代碼。

分析每一個錯誤和警告,並看到現在可以這樣處理,'PHP不覺得它有話要說'。

+0

這就是我正在做的事情:編寫錯誤處理程序,並在這裏引入錯誤以有意測試它們: $ db = new SQLite3('bad.db',SQLITE3_OPEN_READONLY); - 在失敗時拋出異常,我可以捕獲它。但是: $ result = $ db-> querySingle('SELECT [badcolumn] FROM [badtable] etc ...'); - 在這裏,如果查詢無效,會發生兩件事:$ result爲空,PHP發出警告。我不想要這個警告,因爲我正在檢查結果(並且可以詢問sqlite3的lastErrorCode)。 我是新來的PHP,所以我需要聽到可以在這裏抑制這種冗長:-) –

+0

在這種情況下禁用警告。請參閱http://php.net/manual/en/function.error-reporting.php或不顯示它們ini_set('display_errors',0)請參閱http://stackoverflow.com/questions/9729000/setting-display-錯誤-0和 - 對數誤差-1-而不-PHP-INI –