国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

json_decode 整型溢出解決方法

2024-09-04 11:47:50
字體:
來源:轉載
供稿:網友

這個有點像mysql int類型超過了就溢出,而我們只要用bigint就可以了,那么因為php中int數據范圍的問題,所以就也有可能出現這類問題。

編碼過程中遇到個錯誤,就是在處理json時,數值較大的int值在解碼后數據被損壞,比如:

  1. $array = array
  2.     "id1" => 2147483647, 
  3.     "id2" => 2147483648 
  4. ); 
  5. $json = json_encode($array); 
  6. $out = json_decode($json, true); 
  7. var_dump($out); 
  8. 理論上應該看到: 
  9. array(2) { 
  10.     ["id1"]=>int(2147483647) 
  11.     ["id2"]=>int(2147483648) 
  12. 但實際在我的電腦上卻得到: 
  13.  代碼如下 復制代碼 
  14. array(2) { 
  15.     ["id1"]=>int(2147483647) 
  16.     ["id2"]=>int(-2147483646) 

這是由PHP整數值范圍決定的,而這個范圍依賴于操作系統。在32位操作系統中,PHP的整數最大值是2147483647,你可以通過輸出PHP_INT_MAX看到。

一般情況下,你賦值一個很大的數,PHP會自動判定這個數值的范圍并自動轉換類型,如:

  1. $large_number = 2147483647; 
  2. var_dump($large_number);      // int(2147483647) 
  3.  
  4. $large_number = 2147483648; 
  5. var_dump($large_number);       // float(2147483648) 
  6.  
  7. $million = 1000000; 
  8. $large_number =  50000 * $million
  9. var_dump($large_number);      // float(50000000000) 

但是在json_decode方法中沒有進行這種檢測,這是PHP(舊版本)的bug,在5.3以后的版本,就不存在這個問題了。

如果你不想更新你的PHP,那還有個辦法,就是將數字轉為字符串。還是以上面的代碼為例:

  1. $array = array
  2.     "id1" => 2147483647, 
  3.     "id2" => 2147483648 
  4. ); 
  5. $json = json_encode($array); 
  6.  
  7. $json = preg_replace('/("idd":)(d{9,})/i''${1}"${2}"'$json); 
  8.  
  9. $out = json_decode($json, true); 
  10. var_dump($out); 

當然,這個怎么替換是按需而定的,而且需要比較細致的測試。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通化县| 当雄县| 乡宁县| 江油市| 奉化市| 昭平县| 美姑县| 清流县| 集贤县| 嵊州市| 三穗县| 秀山| 南投市| 新龙县| 万山特区| 尉氏县| 石门县| 达日县| 祁阳县| 宁海县| 永新县| 奇台县| 思茅市| 鲁山县| 开鲁县| 邵阳县| 西充县| 双城市| 洞口县| 蒙山县| 红河县| 微博| 于田县| 科技| 靖州| 体育| 富锦市| 尼玛县| 东光县| 襄城县| 栾城县|