![]() |
![]() ![]() |
![]() |
--marshal-- |
![]()
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. |
|
|
![]()
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
wynik: Cytat drugi warunek true
Powód edycji: [blooregard]:
|
|
|
--marshal-- |
![]()
Post
#3
|
Goście ![]() |
Dzieki za odpowiedz
do walidacji w sumie mozna by bylo tego uzywac, prawda? |
|
|
![]()
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)
|
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Pamiętajcie, że taka instrukcja:
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ę:
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 |
|
|
![]()
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?
|
|
|
![]()
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...
(IMG:style_emoticons/default/wink.gif) ps: dla potomnych
a jesli dane nie będą szły wyłącznie z forma, to wówczas można dodac jeszcze (string) do lewej strony
|
|
|
![]()
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 |
|
|
![]()
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
, 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 . |
|
|
![]()
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) |
|
|
![]()
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?
|
|
|
![]()
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)
|
|
|
![]()
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!!!
|
|
|
![]()
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)
|
|
|
![]()
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 |
|
|
--marshal-- |
![]()
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)? |
|
|
![]()
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.
|
|
|
--marshal-- |
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 10:00 |