国产探花免费观看_亚洲丰满少妇自慰呻吟_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); 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙坡区| 辽中县| 松江区| 麻城市| 资阳市| 呈贡县| 正定县| 盐亭县| 建阳市| 怀远县| 仁寿县| 平谷区| 清原| 化德县| 苏尼特右旗| 清徐县| 武隆县| 万安县| 彭泽县| 库伦旗| 剑阁县| 介休市| 湖北省| 玛纳斯县| 濮阳县| 江华| 海门市| 夏河县| 和林格尔县| 会理县| 黑龙江省| 高要市| 习水县| 株洲市| 青岛市| 庆城县| 宝坻区| 土默特左旗| 济源市| 宜宾县| 博乐市|