2017-03-20 38 views
1

我有一個服務器的PHP,我發現一個問題(解決)。問題出在一個字符串中保存的長整數之間進行比較,我不能使用Equal,我必須使用Identical。但是我不知道爲什麼我必須使用它,如果它是字符串之間的比較。PHP比較

我做了一個測試,在本地主機和服務器上得到了兩個不同的結果。

服務器PHP版本:5.3.10-1ubuntu3.10

本地PHP版本:5.6.30-7 + deb.sury.org〜xenial + 1

這裏是MI代碼:

<?php 
    $a = "1285615000003961035"; 
    $b = "1285615000003961023"; 
    if($a == $b) 
    { 
     echo "$a == $b<br>"; 
    } 
    else 
    { 
     echo "$a != $b<br>"; 
    } 

    if((string)$a == (string)$b) 
    { 
     echo "(string)" . (string)$a . " == (string)" . (string)$b . "<br>"; 
    } 
    else 
    { 
     echo "(string)" . (string)$a . " != (string)" . (string)$b . "<br>"; 
    } 

    if($a === $b) 
    { 
     echo "$a === $b<br>"; 
    } 
    else 
    { 
     echo "$a !== $b<br>"; 
    } 

    if((string)$a === (string)$b) 
    { 
     echo "(string)" . (string)$a . " === (string)" . (string)$b . "<br>"; 
    } 
    else 
    { 
     echo "(string)" . (string)$a . " !== (string)" . (string)$b . "<br>"; 
    } 

    ?> 

在服務器我得到:

1285615000003961035 == 1285615000003961023

(串)1285615000003961035 ==(串)1285615000003961023

1285615000003961035 == 1285615000003961023

(串)1285615000003961035 ==(串)1285615000003961023

和地方:!

1285615000003961035 = 1285615000003961023

(string)1285615000003961035!=(string)1285615000003961023

1285615000003961035!== 1285615000003961023

(串)1285615000003961035!==(串)1285615000003961023

+1

我7.0.15-1〜dotdeb + 8.1測試此代碼,這是相同的局部結果。我會說在5.3和5.6之間有所變化。一般來說,精確比較PHP中的大(長)數是一場噩夢,應該不惜一切代價避免。 –

+0

@DmitryPonkin我知道我必須避免它。但是這是必要的,因爲這個大數字是來自外部服務的id,並且我沒有其他選項。 – Pestana

回答

0

您應該使用STRCMP或===比較字符串(如您已使用),因爲當你使用== PHP將做類型轉換。

http://php.net/manual/en/language.operators.comparison.php

編輯:盧卡斯·門德斯如上所述,這僅僅是部分PHP 5.4之後真的 - 但它畢竟是更安全的使用操作符默認情況下不進行類型轉換比較字符串。