Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Funkcja is_int nie rozponaje cyfry jako cyfry
Forum PHP.pl > Forum > Przedszkole
Bojakki
Mam funkcję:

  1. public function int()
  2. {
  3. if (strlen($this->_data) > 0){
  4. if(is_int($this->_data))
  5. {
  6. $this->reportTrue($this->_data);
  7. return true;
  8. } else {
  9. $this->reportFalse($this->_data);
  10. return false;
  11. }
  12. }else{
  13. $this->reportTrue($this->_data);
  14. return true;
  15. }
  16. }


Słuzy ona do sparwdzania pola w formularzu. Powinna zwracac true gdy pole jest puste lub gdy jest tam wpisana liczba całkowita. Problem jest taki, że wpisując w pole formularza liczbę np. "10" zwraca false. Myślałem, że może coś tam się przywłóczyło razem z cyfrą z formularza (jakas spacja czy cos). Licze liczbę znaków w tym stringu - wychodzi 2, biore by w raporcie wypluowało wpisaną cyfrę pod zmienną $this->_data, wyskakuje 10, mimo tego pokazuję tę 10 jako false, czyli nie int.

Jak wezme jednak przefiltruje tę zmienna $this->_data intvalem to jest OK, gdy wpiszę zamiast

  1. if(is_int($this->_data))


  1. if(is_int(10))


też jest OK,a przecież $this->_data to jest właśnie "10" z formularza.
Daiquiri
Potrzebujesz pewnie is_numeric. Sprawdź wartość poprzez var_dump() smile.gif.
abort
Odsyłam do http://forum.php.pl/index.php?showtopic=187629

Ty masz taki sam problem.
is_int (podobnie jak empty) sprawdza, czy dana ZMIENNA jest "jakaś" (is_int sprawdza, czy jeśli liczbą, empty - czy zmienna jest "pusta").

TO NIE DZIAŁA NA WŁAŚCIWOŚCIACH OBIEKTU!!! Właściwość obiektu to nie zmienna

Przypisz właściwość obiektu do zmienna tymczasowa i ją (tę zmienną tymczasową) sprawdzaj.
Bojakki
Cytat(Daiquiri @ 14.11.2011, 22:44:17 ) *
Potrzebujesz pewnie is_numeric. Sprawdź wartość poprzez var_dump() smile.gif.

is_numeric działa normalnie, ale wtedy przechodzą liczby będące ułamkiem

Cytat(abort @ 14.11.2011, 22:51:48 ) *
Odsyłam do http://forum.php.pl/index.php?showtopic=187629

Ty masz taki sam problem.
is_int (podobnie jak empty) zprawdza, czy dana ZMIENNA jest "jakaś" (is_int sprawdza, czy jesli liczbą, empty - czy zmienna jest "pusta").

TO NIE DZIAŁA NA WŁAŚCIWOŚCIACH OBIEKTU!!! Właściwość obiektu to nie zmienna

Przypisz właściwość obiektu do zmiennaj tymczasowaj i ją (tę zmienną tymczasową) sprawdzaj.


Zmieniłem funkcje na:

  1. public function int()
  2. {
  3.  
  4. $zmienna = $this->_data;
  5. if (strlen($zmienna) > 0){
  6. if(is_int($zmienna))
  7. {
  8. $this->reportTrue($zmienna);
  9. return true;
  10. } else {
  11. $this->reportFalse($zmienna);
  12. return false;
  13. }
  14. }else{
  15. $this->reportTrue($zmienna);
  16. return true;
  17. }
  18. }


Jest jak było.
abort
O, dziwne.
Ale... przestudiowałem http://pl2.php.net/manual/pl/function.is-int.php - popatrz na przykład #1 - ist_int ("23") daje... FALSE. Tak, mnie to też zaskoczyło.
Jeśli masz PEWNOŚĆ, że tam się nie przypałęta inny znak od cyfry, to zrób rzutowane na typ int
  1. $zmienna = (int) $this->_data;


i tę zmienną testuj jak w poprzednim przykładzie. Jeśli nie masz pewności czy tam są tylko cyfry, to to sprawdź (np. za pomocą preg_match).
Ufam, że to załatwi sprawę.
Bojakki
jak dałem $zmienna = (int) $this->_data; to przechodzi, ale niestety wszystko. ktos wpisze 5.5 a mi do bazy doda się 55.

Zmieniłem funkcję tak:

  1. public function int()
  2. {
  3. $zmienna = $this->_data;
  4. if (strlen($zmienna) > 0){
  5. if($zmienna == '10')
  6. {
  7. $this->reportTrue($zmienna);
  8. return true;
  9. } else {
  10. $this->reportFalse($zmienna);
  11. return false;
  12. }
  13. }else{
  14. $this->reportTrue($zmienna);
  15. return true;
  16. }
  17. }


Wpisałem w pole formularza "10" i działa. czyli te 10 to 10 nie wiem więc dlaczego nie przechodzi is_int
abort
Cytat(Bojakki @ 14.11.2011, 23:15:47 ) *
jak dałem $zmienna = (int) $this->_data; to przechodzi, ale niestety wszystko. ktos wpisze 5.5 a mi do bazy doda się 55.


toż przecież pisałem, żeby sprawdzić wcześniej, czy zmienna zawiera tylko cyfry jako znaki. Choć zaproponowałem preg_match, to chyba jednak lepiej (a na pewno szybciej) będzie zrobić to za pomocą ctype_digit: http://pl2.php.net/manual/pl/function.ctype-digit.php
Bojakki
O dziwo teraz działa. Zmieniłem is_int na ctype_digit i otrzymałem działanie jakie planowałem. W przykładzie funkcji jets napisane:
  1. <?php
  2.  
  3. $numeric_string = '42';
  4. $integer = 42;
  5.  
  6. ctype_digit($numeric_string); // true
  7. ctype_digit($integer); // false
  8.  
  9. is_numeric($numeric_string); // true
  10. is_numeric($integer); // true
  11. ?>


i nie byłem pewien czy zadziała, ale kombinuje różne warianty i przechodzą tylko całkowite dodatnie lub puste pole. Troche paranormalne dla mnie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.