就爱编程论坛

标题: intval()极限 [打印本页]

作者: admin    时间: 2012-4-6 05:51:30     标题: intval()极限

intval()极限

intval()可以把任何其它类型的数值转换成整型。对于初学者灵活的变量类型是PHP的一个优点。而今天这种灵活也存在着一些缺陷。我们经常使用intval()函数对URL上传来的ID号转化成整型来保证不会有黑客传递字符串。

然后在工作中我们终于发现,如下的代码存在缺陷。

./limit /intval.php

1.
<?php

2.

3.
$string = pow(2, 31) - 1;

4.
echo "string=$string";

5.
$integer = intval($string);

6.
echo "<br/>integer=$integer";

7.

8.
echo "<hr/>";

9.

10.
$string = pow(2, 31);

11.
echo "string=$string";

12.
$integer = intval($string);

13.
echo "<br/>integer=$integer";

14.

15.
?>


对于2^31-1的数字转换前后是没有问题的,但是对于2^31-1之后的数字就会返回错误的数字,造成程序中出现意外错误。如果观察不够细致是很难发现问题的。

一种也不太好的解决办法是使用floatval()函数,但也只是上限比较高而已。

./limit/floatval.php

16.
<?php

17.

18.
$string = pow(2, 31) - 1;

19.
echo "string=$string";

20.
$float = floatval($string);

21.
echo "<br/>float=$float";

22.

23.
echo "<hr/>";

24.

25.
$string = pow(2, 31);

26.
echo "string=$string";

27.
$float = floatval($string);

28.
echo "<br/>float=$float";

29.

30.
echo "<hr/>";

31.

32.
$string = pow(2, 39);

33.
echo "string=$string";

34.
$float = floatval($string);

35.
echo "<br/>float=$float";

36.

37.
echo "<hr/>";

38.

39.
$string = pow(2, 40);

40.
echo "string=$string";

41.
$float = floatval($string);

42.
echo "<br/>float=$float";

43.

44.
?>

另外一种解决办法是用正则表达式验证输入内容是否合法。







欢迎光临 就爱编程论坛 (http://bbs.waibc.com/) Powered by Discuz! X2