Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]isint || (int)
--marshal--
post
Post #1





Goście







witam

czy uzywanie if(isint($var)) jest rownoznaczne z if((int)$var)? Jak sie domyslam, drugi sposob ma przewage pod wzgledem wydajnosci?

Chodzi mi o uzywanie tego do walidacji danych od usera.
Go to the top of the page
+Quote Post
blooregard
post
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Nie jest.

is_int() sprawdza, czy zmienna jest typu int.
(int)$var RZUTUJE zmienną do int-a - w przypadku float po prostu ucina część ułamkową, jeśli float mieści się w zakresie przewidzianym architekturą dla liczby całkowitej (jeśli jest większy, wynik takiego rzutowania jest nieokreślony).

Na przykładzie zmiennej typu float można sprawdzić, że is_int($var) != (int)$var

  1. $var = 1.23;
  2.  
  3. if (is_int($var)) echo "pierwszy warunek true<br />";
  4. if ((int)$var) echo "drugi warunek true<br />";



wynik:
Cytat
drugi warunek true
Powód edycji: [blooregard]:
Go to the top of the page
+Quote Post
--marshal--
post
Post #3





Goście







Dzieki za odpowiedz

do walidacji w sumie mozna by bylo tego uzywac, prawda?
Go to the top of the page
+Quote Post
blooregard
post
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Tak, jeśli spodziewasz się zmiennej liczbowej typu całkowitego, is_int() załatwia sprawę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
by_ikar
post
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Do walidacji danych używaj is_numeric(); jeden z mankamentów dynamicznego typowania.

Kod
<?php

var_dump(is_int(2423)); //true
var_dump(is_int('2423')); //false

var_dump(is_numeric(2423)); //true
var_dump(is_numeric('2423')); //true
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@by_ikar: is_numeric zwróci TRUE również w przypadku wartości 11e4, a to w większości takich przypadków jest niepożądane.
Go to the top of the page
+Quote Post
croc
post
Post #7





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Pamiętajcie, że taka instrukcja:

  1. echo is_int('1') ? 'TAK' : 'NIE';


Wypisze nam NIE. Dlatego w PHP funkcja is_int nie nadaje się do walidacji danych, które przeważnie są łańcuchem znaków. is_numeric też się nie nadaje, z powodów które podał kolega powyżej.

Ja napisałem sobie taką prostą funkcję:

  1. function is_integer_2($value) { // głupia nazwa funkcji, nie? :)
  2. return preg_match('/^[1-9][0-9]*$/', $value);
  3. }


Ta funkcja odrzuci też wartości z zerami wiodącymi, które dla mnie liczbami nie są.

Ten post edytował croc 19.10.2011, 11:58:02
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@croc: Pomijając fakt, że użycie wyrażeń regularnych do czegoś takiego jest po prostu głupie (w momencie gdy wystarczy return $val == (int) $val;) to na prawdę uważasz, że 0 czy -5 to nie są liczby całkowite?
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Crozin drzazgę w oku u brata swego widzisz, a belki we własnym nie dostrzegasz...
  1. $val = '4r';
  2. if ($val == (int) $val) echo 'ok';

(IMG:style_emoticons/default/wink.gif)

ps: dla potomnych
  1. $val = '4r';
  2. if ($val === (string)(int) $val) echo 'ok';


a jesli dane nie będą szły wyłącznie z forma, to wówczas można dodac jeszcze (string) do lewej strony
  1. $val = '4r';
  2. if ((string)$val === (string)(int) $val) echo 'ok';

Go to the top of the page
+Quote Post
croc
post
Post #10





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Masz rację, ja tego używałem do sprawdzania ID. Funkcja powinna się nazywać is_natural_number (IMG:style_emoticons/default/tongue.gif)

nospor - Twoja wersja też jest nie teges (IMG:style_emoticons/default/biggrin.gif) Sprawdź dla $var = 4.

Ten post edytował croc 19.10.2011, 12:12:52
Go to the top of the page
+Quote Post
kaem
post
Post #11





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


Najlepiej jak croc napisał używać wyrażeń regularnych. Ja mam tak
  1. return (!preg_match(self::$regExp['integer'], $var)) ? false : true;
, gdzie $regExp['integer'] ma wartość '/^[0-9]+$/'. Jeśli liczba będzie miała jakieś zera na początku to i tak zostanę one 'olane'.
Ewentualnie do walidacji polecam zapoznać się z wbudowaną w php funkcją filter_var .
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@kaem twoje wyrażenie leje na liczby ujemne, o których wspominał Crozin

@croc
po pierwsze: mowa tu o danych z forma, które zawsze są tekstem
po drugie: sprawdź edita, który był zanim pojawił się twój post (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
croc
post
Post #13





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Zastanawia mnie tylko czy takie żonglowanie typami danych nie jest powolniejsze od wyrażeń regularnych (IMG:style_emoticons/default/biggrin.gif) Może zrobimy teścik?
Go to the top of the page
+Quote Post
Crozin
post
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@nospor: Ah, mój błąd. Durne rzutowanie na INT przy porównywaniu. Właśnie sobie przypomniałem dlaczego nie znoszę tak dynamicznych języków. (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
croc
post
Post #15





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Ja też nie lubię braku restrykcji w typach danych!!!
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Może zrobimy teścik?
Zamiast się głupio pytać to już dawno byś go zrobił i nam przedstawił wyniki (IMG:style_emoticons/default/tongue.gif)
Cytat
Ja też nie lubię braku restrykcji w typach danych!!!
Lizus.... Crozin i tak nie pójdzie z Tobą do kina (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
croc
post
Post #17





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Wyniki testu:

Test REGEX: 0.0897271633 - return preg_match('/^(?:-?[1-9][0-9]*|0)$/', $value);
Test TYPE: 0.0464580059 - return (string) $value === (string) intval($value);
Test NATURAL: 0.0816020966 - return preg_match('/^[1-9][0-9]*$/', $value);

Czyli rzutowanie wygrało (IMG:style_emoticons/default/smile.gif)

EDIT
Sprawdziłem z (int) zamiast intval i jest jeszcze szybciej - 0.0353209972.

Ten post edytował croc 19.10.2011, 12:45:39
Go to the top of the page
+Quote Post
--marshal--
post
Post #18





Goście







Sie rozpisalo;p

Dzieki za odpowiedzi.
Korzystajac z okazji zapytam jeszcze - walidujecie w kontrolerze(powiedzmy controllers/sites/userPage.php), czy w klasie(users::get_byId)?
Go to the top of the page
+Quote Post
croc
post
Post #19





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Tam gdzie masz obsługę błędów. Ja bym zrobił w klasie, a klasa zwracałaby błąd.
Go to the top of the page
+Quote Post
--marshal--
post
Post #20





Goście







Czyli dobrze zrobilem.

z tym, ze jesli ID nie przejdzie walidacji, to nie bawie sie w zwracanie bledu typu "niepoprawny format atrybutu ID", tylko "return FALSE" i tyle;p

jak jest blad typu "niepoprawny format adresu e-mail", albo "nick musi zawierac conajmniej 3 znaki", to wtedy robie $this->errors[]='invalidMail'; i return FALSE
errors is public
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 10:00