美文网首页
PHP数字与字符串比较

PHP数字与字符串比较

作者: moralok | 来源:发表于2018-09-18 14:37 被阅读0次

2018-09-18
参考文献:
Darry_Zhao: PHP数字与字符串比较的误区

今天工作中发现提供的订单查询接口有bug
编写时认为当

  • 需要下载时,查询条件中的 $is_download=1
  • 不需要下载时,不传 $is_download$is_download=0

但是对方是这样处理: $is_download="download" 和 不传
结果导致 $download==0 成立,从而进入了错误的分支

搜索后发现

将一个无法转换为数字的字符串转化为数字,结果总是为0 ,所以将其与0总是返回true。

处理方式

使用强类型判断

延伸阅读

PHP中比较运算符的规则

  1. 当两个字符进行比较时,比较这两个字符的ASCII码
  2. 当两个字符串进行比较时,从第一个字符开始挨个比较对应的ASCII码,知道某一位置两个字符ASCII码不一致时给出结果,如'ba'>'az','10'<'a'
  3. 当一个数字与一个字符/字符串比较时,首先将字符/字符串转化为数字,再与数字进行比较,如12<'21as', 'dsa'=0,同理 'a'+10=10;
  4. 当两个数字字符串进行比较时,首先将两个字符串当做数字,并且用科学计数法存储这两个字符串,科学计数法保留小数点后16位,再进行比较。

由此就会产生一个bug

如:

$str1 = "123456789012345678";
$str2 = "123456789012345679";

(最后一位不一样)

在比较时会先将两个字符串用科学计数法进行储存,因为保留16位小数,所以结果为

$str1=1.2345678901234567E+17;
$str2=1.2345678901234567E+17。

结果再比较就会产生 $str1 等于 $str2 这样的结果;

解决办法为使用 === 或者 strcmp 等字符串比较函数进行强类型判断

另外,长度不同、在字符串中加非数字字符等等都会引起两个字符串的不等。例如:

$str1 = "a123456789012345678";
$str2 = "a123456789012345679";

此时 $str1$str2 就不相等,因为存在 a 这个非数字字符,所以系统不会讲两个字符串当成数字字符串进行比较,而是使用 2. 中两个字符串比较方法。

相关文章

  • PHP数字与字符串比较

    2018-09-18参考文献:Darry_Zhao: PHP数字与字符串比较的误区 今天工作中发现提供的订单查询接...

  • linux shell中的比较符号与特殊符号介绍

    shell字符串比较、判断是否为数字 二元比较操作符,比较变量或者比较数字。注意数字与字符串的区别。 整数比较 -...

  • 2018-10-25

    字符串与数字: 数字与数字 字符串与boolean(真假类型) 字符串与字符串 数字与boolean(真假类型)

  • JavaScript == 相等运算符自动转换的4种简单情形

    情景1:比较数字和字符串 比较数字和字符串时,都要将字符串转换为数据,再两个数字进行比较 比如无法转换为数字,是字...

  • Lottery

    解题思路 原理 其中 win_numbers 是随机生成的数字字符串。使用 PHP 弱类型松散比较,以"1"为例,...

  • Java 字符串_1

    数字与字符串相转换 平时开发的时候经常会遇到需要将字符串转成数字或者数字转换成字符串的情况,这个知识点比较简单,所...

  • 2019-03-14关于PHP弱类型转化

    php中有两种比较的符号 == 与 === === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较 =...

  • 关于JavaScript的隐式转换

    一、 数字与数字之间的转换 1.字符串加数字,数字就会转成字符串。 2.数字减字符串,字符串转成数字。如果字符串不...

  • PHP(一)

    PHP is_numeric()函数is_numeric() 函数用于检测变量是否为数字或数字字符串。语法:boo...

  • php比较运算符

    一,比较的注意事项 1,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照...

网友评论

      本文标题:PHP数字与字符串比较

      本文链接:https://www.haomeiwen.com/subject/exbunftx.html