PHP數(shù)字與字符串比較

2018-09-18
參考文獻(xiàn):
Darry_Zhao: PHP數(shù)字與字符串比較的誤區(qū)

今天工作中發(fā)現(xiàn)提供的訂單查詢接口有bug
編寫時(shí)認(rèn)為當(dāng)

  • 需要下載時(shí)今缚,查詢條件中的 $is_download=1
  • 不需要下載時(shí)田巴,不傳 $is_download$is_download=0

但是對(duì)方是這樣處理: $is_download="download" 和 不傳
結(jié)果導(dǎo)致 $download==0 成立矛洞,從而進(jìn)入了錯(cuò)誤的分支

搜索后發(fā)現(xiàn)

將一個(gè)無(wú)法轉(zhuǎn)換為數(shù)字的字符串轉(zhuǎn)化為數(shù)字匙铡,結(jié)果總是為0 愕撰,所以將其與0總是返回true篡撵。

處理方式

使用強(qiáng)類型判斷

延伸閱讀

PHP中比較運(yùn)算符的規(guī)則

  1. 當(dāng)兩個(gè)字符進(jìn)行比較時(shí)拴孤,比較這兩個(gè)字符的ASCII碼
  2. 當(dāng)兩個(gè)字符串進(jìn)行比較時(shí),從第一個(gè)字符開始挨個(gè)比較對(duì)應(yīng)的ASCII碼讨便,知道某一位置兩個(gè)字符ASCII碼不一致時(shí)給出結(jié)果充甚,如'ba'>'az','10'<'a'
  3. 當(dāng)一個(gè)數(shù)字與一個(gè)字符/字符串比較時(shí),首先將字符/字符串轉(zhuǎn)化為數(shù)字霸褒,再與數(shù)字進(jìn)行比較伴找,如12<'21as', 'dsa'=0,同理 'a'+10=10;
  4. 當(dāng)兩個(gè)數(shù)字字符串進(jìn)行比較時(shí),首先將兩個(gè)字符串當(dāng)做數(shù)字废菱,并且用科學(xué)計(jì)數(shù)法存儲(chǔ)這兩個(gè)字符串技矮,科學(xué)計(jì)數(shù)法保留小數(shù)點(diǎn)后16位,再進(jìn)行比較殊轴。

由此就會(huì)產(chǎn)生一個(gè)bug

如:

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

(最后一位不一樣)

在比較時(shí)會(huì)先將兩個(gè)字符串用科學(xué)計(jì)數(shù)法進(jìn)行儲(chǔ)存衰倦,因?yàn)楸A?6位小數(shù),所以結(jié)果為

$str1=1.2345678901234567E+17旁理;
$str2=1.2345678901234567E+17樊零。

結(jié)果再比較就會(huì)產(chǎn)生 $str1 等于 $str2 這樣的結(jié)果;

解決辦法為使用 === 或者 strcmp 等字符串比較函數(shù)進(jìn)行強(qiáng)類型判斷

另外孽文,長(zhǎng)度不同驻襟、在字符串中加非數(shù)字字符等等都會(huì)引起兩個(gè)字符串的不等。例如:

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

此時(shí) $str1$str2 就不相等芋哭,因?yàn)榇嬖?a 這個(gè)非數(shù)字字符沉衣,所以系統(tǒng)不會(huì)講兩個(gè)字符串當(dāng)成數(shù)字字符串進(jìn)行比較,而是使用 2. 中兩個(gè)字符串比較方法减牺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豌习,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烹植,更是在濱河造成了極大的恐慌斑鸦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草雕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡固以,警方通過(guò)查閱死者的電腦和手機(jī)墩虹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門嘱巾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诫钓,你說(shuō)我怎么就攤上這事旬昭。” “怎么了菌湃?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵问拘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惧所,道長(zhǎng)骤坐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任下愈,我火速辦了婚禮纽绍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘势似。我一直安慰自己拌夏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布履因。 她就那樣靜靜地躺著障簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栅迄。 梳的紋絲不亂的頭發(fā)上卷谈,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音霞篡,去河邊找鬼世蔗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朗兵,可吹牛的內(nèi)容都是我干的污淋。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼余掖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寸爆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盐欺,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赁豆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后冗美,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魔种,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年粉洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了节预。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叶摄。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖安拟,靈堂內(nèi)的尸體忽然破棺而出蛤吓,到底是詐尸還是另有隱情,我是刑警寧澤糠赦,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布会傲,位于F島的核電站,受9級(jí)特大地震影響拙泽,放射性物質(zhì)發(fā)生泄漏淌山。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一奔滑、第九天 我趴在偏房一處隱蔽的房頂上張望艾岂。 院中可真熱鬧,春花似錦朋其、人聲如沸王浴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氓辣。三九已至,卻和暖如春袱蚓,著一層夾襖步出監(jiān)牢的瞬間钞啸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工喇潘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留体斩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓颖低,卻偏偏與公主長(zhǎng)得像絮吵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忱屑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容