2011-11-10 12 views
7

che sto confrontando due stringhe in questo modo:Integer confronto di stringhe sono uguali (bug PHP?)

<?php 

$Str1 = '111122223333444455556666'; 
$Str2 = '111122223333444455557777'; 

if($Str1 != $Str2){ 
    // Do something 
} else { 
    // Do something else 
} 

?> 

Ovviamente, $ Str1 non è lo stesso di $ Str2, ma ancora esegue sempre l'altro blocco. So che dovrei semplicemente usare === o !== per confrontare qui, ma mi chiedo perché (in pratica) qualsiasi altro valore che cerco, in realtà, valuti il ​​modo in cui è previsto.

Ho letto anche questo nella documentazione "Se la stringa non contiene nessuno dei caratteri '.', 'E' o 'E' e il valore numerico si adatta ai limiti del tipo intero (come definito da PHP_INT_MAX), la stringa sarà valutata come un intero. ", quindi suppongo che non dovrebbe essere inferiore o uguale al valore di PHP_INT_MAX (che è di gran lunga inferiore alle stringhe che sto valutando sopra) - assumendo che sia ciò che significano da "si inserisce". Quindi, perché le stringhe sopra vengono valutate come stesse? Potrebbe essere un bug PHP o c'è qualcosa che mi manca?


Sto usando la versione 5.3.8 di PHP da ieri, proveniente da PHP 5.3.6. Funzionando su Windows XP.

+0

Non riesco a ricreare questo sulla mia installazione 5.3.5. Le stringhe si confrontano con "non uguale" e "non non diseguale". –

+0

L'ho ricreato su PHP 5.2.5 (http://codepad.org/BJZT1KM1) e PHP 5.3.9-dev (http://codepad.viper-7.com/MxwYQw). –

risposta

7

Quello che sta succedendo qui è che i numeri vengono convertiti in float (poiché non si adattano agli ints) ei float capita di essere gli stessi. Vedi the PHP source.

This script indica che i galleggianti analizzati hanno effettivamente lo stesso valore.

+0

Che strano fenomeno. Stavo cercando di capirlo (ovviamente in una sceneggiatura molto più complessa) per ore, e si è scoperto che questo era l'unico problema. PHP può davvero morderti a volte nel culo. Ciò risponde comunque alla mia domanda - ed è una buona risposta. Grazie! – user966939

1

Questo è ciò che sembra, se faccio questo:

$Str1 = '111122223333444455556666 '; 
$Str2 = '111122223333444455557777 '; 

Esce bene (notare lo spazio)

Così deve essere la conversione di numero e non vedere la differenza a causa della lunghezza

1

Si potrebbe pensare che PHP sia un po 'rilassato in queste conversioni ?! Ancora una volta, preferisci il buon vecchio rigoroso controllo dei caratteri?

Non così avanzato come sopra, ma ancora abbastanza da afferrare un'ora del mio tempo di recente.

<? 
$a_var = 0; 
if ($a_var=="WHATEVER") 
    echo "WATCH OUT! This will be printed!"; 
//- as "whatever" is converted to an int 

if ((string)$a_var=="WHATEVER") 
    echo "OK, this will of course not be printed!"; 

$a_var = "0"; 
if ($a_var=="WHATEVER") 
    echo "OK, this will of course also not be printed!"; 
?> 

Conclusione: ATTENZIONE al casting automatizzato in PHP. Ogni tanto può giocare brutti scherzi, e i bug possono essere molto difficili da tracciare. Il casting esplicito una volta troppi potrebbe essere più intelligente a volte, piuttosto che basarsi sulla nostra grande comprensione di PHP. ;-)

+0

OMG questo mi stava facendo impazzire !!!! Avevo 'if ($ var ==" E ") {echo" questo stampato quando $ var era int (0) "; } ' – SublymeRick

Problemi correlati