2017-03-20 6 views
1

私はサーバにPHPを持っており、問題が見つかった(解決済み)。問題は、文字列に保存された長い整数と、Equalを使うことができないことの間の比較であり、私は同じを使用する必要があります。しかし、文字列との比較であれば、なぜ私はそれを使わなければならないのか分かりません。異なるPHPサーバの文字列間のPHPの比較

私はテストを行い、ローカルホストとサーバーで2つの異なる結果が得られます。

ServerのPHPのバージョン:5.3.10-1ubuntu3.10

ローカルPHPのバージョン:5.6.30-7 + deb.sury.org〜xenial +ここ

1マイルコードです:

サーバーで
<?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

(文字列)1285615000003961035!=(文字列)1285615000003961023

1285615000003961035!== 1285615000003961023

(文字列)1285615000003961035!==(文字列)1285615000003961023

+1

私はこのコードを7.0.15-1〜dotdeb + 8.1でテストしました。これはあなたのローカル結果と同じです。私は何かが5.3と5.6の間で変わったと言いたい。一般的に、PHPの大(長い)数値の正確な比較は悪夢であり、すべてのコストをかけて避けるべきです。 –

+0

@DmitryPonkin私はそれを避けなければならないことを知っています。しかし、この大きな数は外部サービスのIDなので、他のオプションはありません。 – Pestana

答えて

2

PHP 5.4以降、リリースノートによると、浮動小数点数にオーバーフロー整数文字列がもはや等しいと見なされません、浮動小数点数が内部的に表現されるためです。詳細については

以下のリンクを参照してくださいする場合ので、あなたは(あなたが使用しているとして)文字列を比較するためのstrcmpや===を使用する必要があります

http://php.net/manual/en/language.operators.comparison.php(例後に警告のセクション) http://php.net/manual/en/types.comparisons.php#108264

+0

ありがとうございました。 – Pestana

0

を== PHPは型変換を行います。

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

編集:ルーカス・メンデスは、前述したように、これはPHP 5.4の後に部分的にしか真実である - しかし、まだ文字列を比較するために、デフォルトでは型変換をしない演算子を使用する方が安全です。

関連する問題