Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 13 odgovora
  • 4.790 pregleda

Najnovija ↓

PHP bug ili mi nesto nije jasno 20.09.2011. u 23:55 · pre 183 meseca #1
Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true

$ip = '127.1.1.1';
echo $ip == intval($ip); // false
 


I kada sam prijavio bug dobio sam odgovor da to nije bug i da treba da procitam manual.

Uopste mi nije jasno kojom logikom radi. Oba slucaja MORAJU da daju false.
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 00:28 · pre 183 meseca
izmenjeno 1 put, poslednji put Zlatni_bg 21.09.2011. u 00:39
  1. Zlatni_bg21.09.2011. u 00:39zapis iz teksta poruke
#2
Ne bi trebalo da bude false, jer ti "==" automatski konvertuje promenljivu iz stringa u integer pri poredjenju. Samim tim, 127 = 127 u prvom slucaju. Ne znam zasto i u drugom slucaju nije true, moje misljenje je da ima veze sa zaokruzivanjem.

http://php.net/manual/en/function.intval.php - ovde mozes naci dosta informacija :)
Potpis
THE ONLY EASY DAY WAS YESTERDAY
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 12:39 · pre 183 meseca #3
Izgleda da nije problem u intval nego u ==.
Posto je sa jedne strane integer PHP sa druge strane da stavi broj pa uradi prvo float pa int.
i onda se dodje na :
Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true
//radi ovo posto je sa desne strane int
echo floatval($ip) == intval($ip); // jos uvek false ali ce da pokusa int u sledecem koraku
echo intval($ip) == intval($ip); // i dobije se true
 


druga ip gde nije 0 drugi broj
Code (php):

$ip = '127.1.1.1';
echo $ip == intval($ip); // true
//radi ovo posto je sa desne strane int
echo floatval($ip) == intval($ip); // jos uvek false ali ce da pokusa int u sledecem koraku
echo intval($ip) == intval($ip); // intval nije prosao
 


Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 12:56 · pre 183 meseca #4
Ako izbacimo intval i stavimo samo brojeve, imamo:

Code:

<?php
$ip = '127.0.1.1';

echo  $ip==127;

$ip='127.1.1.1';

echo $ip==127;

?>


Ovo daje isto kao i kod u inicijalnom postu. Na php.net piše da se kod operatora == promenljive postavljaju na zajednički tip (ovde valjda integer), ali biće da uzima decimalu iza tačke, tj u prvom slučaju 127.0, a u drugom 127.1.
Kao da rezultat intval pri poređenju tretira kao floatval.
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 13:28 · pre 183 meseca #5
Pa cak i da uzima float, trebalo bi u oba slucaja da daje true...
Potpis
THE ONLY EASY DAY WAS YESTERDAY
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 14:50 · pre 183 meseca #7
Citat:
maksvel: Nagađam, ali mi se čini da za 127.0 konta da je isto što i 127, a za 127.1 da nije. :)


Pa 127 je jednako sa 127.0 ali je problem kako dodje do 127.0.
Cim je sa leve strane pretvorio 127.0.1.1 u 127.0 treba da konta da to nije to i da stane.
Drugo je da sam imao 127.0 kao string i on ga pretvorio u 127.0 kao broj pa to je isto i onda moze dalje da poredi.
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: PHP bug ili mi nesto nije jasno 21.09.2011. u 18:27 · pre 183 meseca #8
Ali radi se o tome da uopste ne treba da radi sa float vrednostima, trebalo bi sve da konveruje u integer posto je "intval" funkcija iskoriscena u poredjenju... a i kako god da poredi, poredi 2 iste vrednosti koje se konvertuju opet na ISTI nacin, tako da bi trebalo da daju iste konvertovane vrednosti... ako ima neko logicno objasnjenje za ovaj drugi slucaj bilo bi lepo da se javi.. :)
Potpis
THE ONLY EASY DAY WAS YESTERDAY
Re: PHP bug ili mi nesto nije jasno 22.09.2011. u 00:02 · pre 183 meseca #9
Zaista i piše u manual-u objašnjenje za ovakvo ponašanje:

String conversion to numbers
Citat:
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.

Type Juggling
Citat:
If either operand is a float, then both operands are evaluated as floats, and the result will be a float.

Što će reći da se string 127.1.1.1 konvertuje u float jer sadrži tačku, a zatim se u poređenju sa int-om int konvertuje u float. Dakle, dešava se:
1) '127.1.1.1' == 127
2) 127.1 == 127
3) 127.1 == 127.0
=>false
Potpis
Pera električar 0637129710, BG, preporučujem.
Re: PHP bug ili mi nesto nije jasno 22.09.2011. u 00:32 · pre 183 meseca #10
Da, ali ja nisam radio matemtaicku operaciju po kojoj je on mogao da zakljuci da li ja radim sa brojevima ili stringovima
jer nema matemtaickih operacija sa stringovima.
Radio sam operaciju poredjenja i to je moguce sa stringovima.
Ne znam na koji nacin sam ga naveo da on razmislja sa float-ovima.
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Re: PHP bug ili mi nesto nije jasno 22.09.2011. u 15:31 · pre 183 meseca
izmenjeno 1 put, poslednji put omega_bg88 22.09.2011. u 19:58
  1. omega_bg8822.09.2011. u 19:58zapis iz teksta poruke
#12
Nevezano da li se radi o aritmetičkoj ili logičkoj operaciji između stringa i broja (int ili float), sa stringom se dešava sledeće:
- ako sadrži broj na svom početku, biva cast-ovan u int
- ako sadrži broj iza koga sledi na početku iza koga se nalazi '.' , biva cast-ovan u float
- ako sadrži bilo koji drugi karakter na početku, tretira se kao 0

Npr.

'2' + 2 = 4;
'2.5' + 2 = 4.5;
'.5' + 1 = 1.5;
'2somestring' + 2 = 4;
'somestring' + 2 = 2;
Re: PHP bug ili mi nesto nije jasno 10.10.2011. u 22:04 · pre 183 meseca #13
nije bug, vilyu je lepo objasnio zasto takav rezultat.

za sta ti ovo tacno treba?

da bi se osigurao eksplicitno kastuj i levu stranu u int

Code (php):

$ip = '127.0.1.1';
echo $ip == intval($ip); // true

$ip = '127.1.1.1';
echo (int)$ip == intval($ip); // true
 


ili mozda jos bolje da koristis sledecu proveru (da li $ip pocinje sa 127)

Code (php):

\strpos($ip, '127') === 0
 

PS. obavezno koristi === da ne bi dobio lazno tacno poredjenje
Potpis
look
closer

DON'T
PANIC
Re: PHP bug ili mi nesto nije jasno 11.10.2011. u 11:26 · pre 183 meseca #14
Meni ne treba da je 127 jednako sa 127 nego da je 127 razlicito od 127.0.0.1.
Tako da (int) ili === mi nista ne znaci.
Nije mi logicno da on sam pretvara string u integer. Logicnije mi je da integer pretvori u string prilikom poredjenja jer se pri takvom poredjenju sadrzaj varijabli ne menja.

Resio sam tako sto sam mu naredio da je onaj intval string.
Potpis
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme