0

@画面にエラーが表示されていないにもかかわらず、PHP のエラー サプレッサーがまだカスタム エラー ハンドラーをトリガーしているようです。

例:

@json_decode(array());

これにより、画面にエラー メッセージは出力されませんが、エラー ハンドラは実行されます (たとえば、「実際の」エラーが発生したかのように、エラーをログに記録し、電子メールを送信し、スクリプトの実行を終了します)。

@完全に沈黙する方法はありますか?

4

2 に答える 2

4

有効なjsonを検出しようとしている場合は、渡す「param」がjson_decode文字列型であることを確認してください。

php.net からの引用:

適切な PHP タイプで json にエンコードされた値を返します。値 true、false、および null (大文字と小文字を区別しない) は、それぞれ TRUE、FALSE、および NULL として返されます。json をデコードできない場合、またはエンコードされたデータが再帰制限よりも深い場合は、NULL が返されます。

そのため、デコードできないNULLかどうかを探しています。JSONしたがって、無効な JSON です。ただし、配列やブール値などの他の型ではなく、文字列を渡すようにしてください。それは決してうまくいかないからです。

そして、私はあなたの問題を理解しています。@ 記号はエラー メッセージを抑制しますが、実際のコード フローは抑制しません。うまくいかない場合でも終了します。ただし、@ 記号を手放す必要があります。

とにかく、あなたはおそらくあなたが呼び出すある種の関数を持っているでしょうjson_decode. これは単なる例ですが、私の言いたいことを理解していただけるはずです。

<?php

// will fail, because it's not a string
$str1 = array ( "nooblol" ); 

// Will succeed. This is valid json
$str2 = '{"example":"value"}';

// Will fail, is of type string, but still an invalid json format
$str3 = 'invalid json string';

function saveData ( $json )
{
    // Check if the variable that we're about to pass
    // to json_decode() is an actual string. Otherwise we
    // have invalid json data anyway.
    if ( !is_string ( $json ) )
    {
        echo 'Invalid json (or invalid type)';
        return;
    }

    if ( !$obj = json_decode ( $json ) )
    {
        echo 'fail';
        return;
    }

    // Print json object
    print_r($obj);
}

saveData ( $str3 );

?>

実際の例: http://codepad.viper-7.com/KJL8stsaveDataパラメータを$str1orに 変更して$str2、異なる結果を確認してください。

これは、有効な json があるかどうかを確認する方法です。json_decode()有効なデータであるかどうかを判断するために、関数だけに依存しないでください。これは関数であり、単に文字列を期待しています。そのため、必ず文字列を渡してください。そうして初めて、それが有効なjsonであるかどうかがわかります。

于 2012-08-11T21:06:25.213 に答える
2

によって抑制されたエラーがエラー ハンドラに表示されないようにすることはできないと思います@

ただし、これらのエラーを分離して、自己責任で無視することはできます。

エラー ハンドラに次のコードを追加します。

// get the current error reporting level
$level = error_reporting();

// if error was supressed or $errno not set in current error level
if ($level == 0 || ($level & $errno) == 0) {
    return true;
}

$errnoがエラー ハンドラ コールバックの最初の引数であることに注意してください。

于 2012-08-11T19:27:33.730 に答える