CleverCode近期遇到一個PHP項目整形轉化問題,mysql有一個字段id是bigint的,里面有長整型,如id = 5147486396。可是php代碼因為歷史原因卻部署在多台機器中,當中A機器32位系統中,B機器64系統中。如今的問題是64系統中頁面訪問正常。32位系統中訪問出錯了。原因是php整形溢出。
1 A機器演示
1.1 獲取A機器系統位數
# getconf LONG_BIT
1.2 整形轉化代碼
<?php $id = 5147486396; echo '$id:'.$id."\r\n"; $value = (int)$id; echo '(int)$id:'.$value."\r\n"; $value = intval($id); echo 'intval($id):'.$value."\r\n"; $value = filter_var($id, FILTER_VALIDATE_INT); echo 'filter_var($id, FILTER_VALIDATE_INT):'."\r\n"; var_dump($value); ?>
1.3 執行結果
(int)5147486396的結果是852519100。intval(5147486396)的結果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)結果是false。

2 B機器演示
2.1 獲取B機器系統位數
# getconf LONG_BIT

2.2 整形轉化代碼
<?php $id = 5147486396; echo '$id:'.$id."\r\n"; $value = (int)$id; echo '(int)$id:'.$value."\r\n"; $value = intval($id); echo 'intval($id):'.$value."\r\n"; $value = filter_var($id, FILTER_VALIDATE_INT); echo 'filter_var($id, FILTER_VALIDATE_INT):'."\r\n"; var_dump($value); ?>
2.3 執行結果
(int)5147486396的結果是5147486396。intval(5147486396)的結果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)結果是5147486396。

3 結論
整型數的字長和平台有關。雖然通常最大值是大約二十億(32 位有符號)。
64 位平台下的最大值一般是大約 9E18。
PHP 不支持無符號整數。Integer 值的字長能夠用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5后。最大值能夠用常量 PHP_INT_MAX 來表示。
版權聲明:
1)原創作品,出自"CleverCode的博客",嚴禁轉載,否則追究版權法律責任。2)原創地址: http://blog.csdn.net/clevercode/article/details/46423103。
3)分類地址(PHP程序猿技術精粹): http://blog.csdn.net/clevercode/article/category/3169943(博客持續添加。關注請收藏)。
4)歡迎大家關注CleverCode博客很多其它的精彩內容: http://blog.csdn.net/CleverCode。
5)歡迎大家關注CleverCode的微博: http://weibo.com/CleverCode。