ホームページ >バックエンド開発 >PHPチュートリアル >json_decode 整数オーバーフロー ソリューション_PHP チュートリアル

json_decode 整数オーバーフロー ソリューション_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:55:06923ブラウズ

これは、MySQL の int 型が超えるとオーバーフローするのと似ており、bigint を使用するだけで済みます。その場合、PHP の int データ範囲の問題により、この種の問題も発生する可能性があります。

json の処理中にエラーが発生しました。デコード後に次のような大きな int 値のデータが破損しました。

コードは次のとおりですコードをコピー
$配列 = 配列(

"id1" => 2147483647,
"id2" => 2147483648
);
$json = json_encode($array);
$out = json_decode($json, true);
var_dump($out);
理論的には次のようになります:

配列(2) {

["id1"]=>int(2147483647)
["id2"]=>int(2147483648)
}

しかし、実際に私のコンピュータでは次のようになります:

コードは次のとおりですコードをコピー配列(2) {
["id1"]=>int(2147483647)
["id2"]=>int(-2147483646)
}

これは、オペレーティング システムに依存する PHP 整数値の範囲によって決まります。 32 ビット オペレーティング システムでは、PHP の最大整数値は 2147483647 であり、これは PHP_INT_MAX を出力することで確認できます。

一般に、大きな数値を割り当てると、PHP は値の範囲を自動的に決定し、次のように型を自動的に変換します。

コードは次のとおりです$large_number = 2147483647; var_dump($large_number); PHP を更新したくない場合は、数値を文字列に変換する別の方法があります。上記のコードを例として見てみましょう:
コードをコピー
$large_number = 2147483648;
var_dump($large_number);
百万ドル = 1000000;
$large_number = 50000 * 百万ドル;
var_dump ($large_number);



ただし、この検出は json_decode メソッドでは実行されません。これは PHP (古いバージョン) のバグです。5.3 以降のバージョンでは、この問題は存在しません。


コードは次のとおりです

コードをコピー$配列 = 配列( "id2" => 2147483648 ); $json = json_encode($array);
"id1" => 2147483647,

$json = preg_replace('/("idd":)(d{9,})/i', '${1}"${2}"', $json);

$out = json_decode($json, true);
var_dump($out);




もちろん、これを置き換える方法はニーズによって異なり、より詳細なテストが必要です。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632266.html技術記事これは、MySQL の int 型を超えるとオーバーフローするのと似ており、bigint を使用するだけで済みます。PHP の int データ範囲の問題により、この種の問題も発生する可能性があります。 コーディング...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。