2017-03-05 8 views
2

私は、データベースからレコードを読み取り、jsonオブジェクトを返すPHPスクリプトを持っています。私はスクリプトでエラー処理をしているので、例外がスローされたり、他のエラーが発生したりすると、(エラーコードとすべてで)うまく形成されたjsonレスポンスが返されます。これは機能します。PHPの警告とエラーがjsonパーサを破損しないようにしますか?

しかし、もし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 ...'); - ここでは、クエリが無効な場合、2つのことが起こります:$ resultが空で、PHPが警告を出します。私は結果をチェックしているので(そして、lastErrorCodeのためにsqlite3に問い合わせることができるので)、その警告は欲しくない。 私はphpを使い慣れていないので、ここでこの冗長性を抑えるのは大丈夫です:-) –

+0

その場合は警告を無効にしてください。 http://php.net/manual/en/function.error-reporting.phpを参照するか、ini_set( 'display_errors'、0)で表示しないでください。http://stackoverflow.com/questions/9729000/setting-display- errors-0-and-log-errors-1-without-php-ini –

関連する問題