Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak sprawdzic czy string to int ?
Forum PHP.pl > Forum > PHP
R3B3L
Witam

wiem ze brzmi to troche dziwnie, ale ...

Sytuacja wyglada nastepujaco:
jesli wysylam w formularzu z pola input zmienna to w globalnej zmiennej $_POST i $_GET jest ona traktowana jako string. Czy istnieje jakaś wbudowana funkcja sprawdzajaca czy zawartosc tej zmiennej (np. $_GET['a'] ) jest typu integer questionmark.gif
Wiem o istnieniu funkcji is_int() ale ona powie ze to nie jest int tylko string.
moj sposob na rozwiazanie tego problemu to narazie:
  1. <?php
  2. $buf = (int) $_GET['a'];
  3. if($buf == $_GET['a'] ) ...
  4. ?>

takie coś działa ale chciałbym wiedzieć czy nie istnieje jakiś wbudowany mechanizm.

z gory dzieki za pomoc
R3B3L
Cytat(bela_666 @ 2005-12-02 21:18:51)

to prawie to

is_numeric sprawdza czy string jest liczba, ale np 3.5 tez potraktuje jako liczbe, a mi chodzi o to rzeby sprawdzic czy to jest int.
strife
  1. <?php
  2.  
  3. $string = 3.5;
  4.  
  5. if ( is_int( $string ) )
  6. {
  7. echo 'TRUE';
  8. }
  9. else
  10. {
  11. echo 'FALSE';
  12. }
  13.  
  14. ?>

A to chodzi?
R3B3L
Cytat(scarface @ 2005-12-02 21:38:10)
  1. <?php
  2.  
  3. $string = 3.5;
  4.  
  5. if ( is_int( $string ) )
  6. {
  7. echo 'TRUE';
  8. }
  9. else
  10. {
  11. echo 'FALSE';
  12. }
  13.  
  14. ?>

A to chodzi?

wiem ze w takiej formie to zadziala ale sproboj zrobic to dla zmiennej globalnej $_POST albo $_GET (np: $_POST['a'] )
u ciebie w przykladzie
$string = 3.5
sproboj $string = "3.5" bo w wlasnie takiej formie otrzymasz dane z formularza
strife
No to użyj eval" title="Zobacz w manualu php" target="_manual
R3B3L
Cytat(scarface @ 2005-12-02 21:50:01)

sorki chyba czegos nie rozumiem ;(

jak moze mi to pomoc ? jak mam tego uzyc ?
strife
  1. <form method="post">
  2. <input type="text" name="test" />
  3. <input type="submit" />
  4. </form>
  5.  
  6. <?php
  7. $string = $_POST['test'];
  8. eval("$string = $string;");
  9.  
  10. if ( is_int( $string ) )
  11. {
  12. echo 'TRUE';
  13. }
  14. else
  15. {
  16. echo 'FALSE';
  17. }
  18.  
  19. ?>

I teraz zostaną wywalone "" z $_POST co umożliwi rozpoznanie czy dana liczba jest int czy nie. O to chodziło prawda?
Lars
  1. <?php
  2. settype($variable, 'integer');
  3. ?>

nie trzeba juz sprawdzać, od razu dostajesz inta

"is_numeric sprawdza czy string jest liczba, ale np 3.5 tez potraktuje jako liczbe, a mi chodzi o to rzeby sprawdzic czy to jest int. "

no bo 3.5 to też liczba laugh.gif

============

to wlasciwie jest bez sensu bo zmienna w php nie moze posiadać kilku
typów na raz, albo int albo string, bool czy coś innego!
R3B3L
to juz by bylo to czego szukalem ale jeszcze pozostaje kwestia zabespieczenia tego jakos.

sprobojcie uruchomic powyrzszy przyklad dla 3a

jak zabezpieczyc sie przed czyms takim questionmark.gif
Lars
Cytat(R3B3L @ 2005-12-02 21:05:53)
to juz by bylo to czego szukalem ale jeszcze pozostaje kwestia zabespieczenia tego jakos.

sprobojcie uruchomic powyrzszy przyklad dla 3a

jak zabezpieczyc sie przed czyms takim questionmark.gif

jeżeli chodzi o mój post to w tym przypadku dostaniesz 3 - inta. ciągle źle?
R3B3L
Cytat(Lars @ 2005-12-02 22:03:09)
  1. <?php
  2. settype($variable, 'integer');
  3. ?>

nie trzeba juz sprawdzać, od razu dostajesz inta

"is_numeric sprawdza czy string jest liczba, ale np 3.5 tez potraktuje jako liczbe, a mi chodzi o to rzeby sprawdzic czy to jest int. "

no bo 3.5 to też liczba laugh.gif

============

to wlasciwie jest bez sensu bo zmienna w php nie moze posiadać kilku
typów na raz, albo int albo string, bool czy coś innego!

wiem ze mozna to zrobic to w ten sposob. ale chodzi mi o to zeby nie przekonwertowywac tej zmiennej a tylko sprawdzic czy ma odpowiedni typ.
przyklad ktory podalem na poczatku dziala ale szukam jakiegos wbudowanego mechanizmu.
Lars
  1. <?php
  2. if(gettype($var)=='integer') {
  3. echo 'OK?';
  4. }
  5. ?>


cuś takiego?
R3B3L
Cytat(Lars @ 2005-12-02 22:12:38)
  1. <?php
  2. if(gettype($var)=='integer') {
  3. echo 'OK?';
  4. }
  5. ?>


cuś takiego?

to akurat zadziala dla $var = 3; ale dla $var = "3"; juz nie zadziala, a dane z formularza dstajemy w lasnie w tej drugiej wersji, nawet jesli w polu input wpisalismy 3 to wartosc $_POST['var'] bedzie rowna "3"
strife
Możesz najpierw pojechać $string htmlspecialchars" target="_blank wywalić wszystkie znaki prócz liczb i kropek z niego (2.5). Niestety takiego wyrażenia Ci nie ułożę bo nie czuje się mocny z regami.

Jest rozwiązanie którego nie polecam, jeśli nie chcesz komunikatu o błędzie wstaw przed eval => @ wtedy błąd będzie, ale nie będziesz go widział...

@DeyV - Ta... i zawsze wychodzi, że najlepsze jest naprostsze.. :]

Pozdrawiam!
bela
Jak tam zawsze rzutuje i dodaje slasze i działa. Tu nie ma żadnej filozofii.
R3B3L
Cytat(scarface @ 2005-12-02 22:31:12)
Możesz najpierw pojechać $string żeby się zabezpieczyć, a potem wyrażeniami regularnymi <a href="http://pl.php.net/preg_replace">preg_replace wywalić wszystkie znaki prócz liczb i kropek z niego (2.5). Niestety takiego wyrażenia Ci nie ułożę bo nie czuje się mocny z regami.

Jest rozwiązanie którego nie polecam, jeśli nie chcesz komunikatu o błędzie wstaw przed eval => @ wtedy błąd będzie, ale nie będziesz go widział...

Pozdrawiam!

żeczywiście innego wyjścia chyba nie ma.
myślałem że istnieje jakiś gotowy mechanizm który rozwiązał by ten problem.

wszystkie te operacje o których mówisz będe musiał zrobić dla jakiejś zmiennej pomocniczej bo chodzi mi o to zeby sprawdzic czy ta znienna ma odpowiedni typ ale nie modyfikowac jej.

THX 4 ALL
DeyV
a wiec najpierw sprawdzasz czy jest numeric ( is_numeric() )
A następnie sprawdzasz, czy ciąg nie zawiera kropki.
I masz pewność, że jest to int, lub nie.
Ewentualnie można sprawdzić jeszcze wielkość wprowadzonej liczby, by nie przekroczyć zakresu int winksmiley.jpg


scarface - a coś ty za bzdury z tym eval wymyślił?
Tak bardzo nie lubisz mieć bezpiecznego kodu?
sobstel
a mzoe po prostu ctype_digit" title="Zobacz w manualu php" target="_manual ?
FiDO
Cytat(sopel @ 2005-12-03 12:54:58)

I to jest jedyna sluszna odpowiedz, ktora powinna byla sie pojawic w tym temacie.. reszta kombinatorow powinna tez czasem zajrzec do manuala winksmiley.jpg
Vengeance
Albo połączenie is_numeric() z is_float() ?
dtb
ctype_digit zawiedzie w przypadku liczb zmiennoprzecinkowych

  1. <?php
  2. jest_liczba ($liczba)
  3. {
  4. $liczba = str_replace ('.', NULL, $liczba);
  5. return ctype_digit ($liczba);
  6. }
  7. ?>
Radarek
Niestety ctype_digit" title="Zobacz w manualu php" target="_manual dla liczb ujemnych tez zwroci false (w koncu zawiera znak '-' ktory nie jest cyfra).

Uzycie settype zaproponowane jest wystarczajaco dobre. Jesli koniecznie chcesz sprawdzic czy napis jest liczba i tylko liczba (calkowita) to wystarczy przetestowac go odpowiednim wyrazeniem regularnym, np takim:

/^[0-9\-]+$/

Przyklad:
  1. <?php
  2. header("Content-type: text");
  3. $strings = array('1820.20', '10002', 'wsl!12', '-120');
  4. foreach ($strings as $testcase) {
  5. if (preg_match('/^[0-9-]+$/', $testcase)) {
  6. echo "$testcase jest liczba calkowitan";
  7. } else {
  8. echo "$testcase nie jest liczba calkowitan";
  9. }
  10. }
  11. ?>


zwroci nam:

Cytat
1820.20 nie jest liczba calkowita
10002 jest liczba calkowita
wsl!12 nie jest liczba calkowita
-120 jest liczba calkowita


Ewentualnie mozesz testowac czy napis zawiera niedozwolone znaki za pomoca regexa:
/[^0-9\-]/

  1. <?php
  2.  
  3. if (preg_match('/[^0-9-]/', $string)) {
  4.  echo "To nie jest liczba calkowita";
  5. } else {
  6.  echo "To jest liczba calkowita";
  7. }
  8.  
  9. ?>
sobstel
@Radarek, wg. twojego skryptu ciag "---" to takze liczba calkowita ;-) dlatego twoj pattern powinien wygladac raczej tak
Kod
'#^\-?[0-9]+$#'
Radarek
Cytat(sopel @ 2005-12-03 15:17:47)
@Radarek, wg. twojego skryptu ciag "---" to takze liczba calkowita ;-) dlatego twoj pattern powinien wygladac raczej tak
Kod
'#^\-?[0-9]+$#'

No fakt, pospieszylem sie za bardzo :-).

Kod
'#^-?[0-9]+$#'

'-' nie trzeba eskejpowac poza klasa znakow [] - to tak na marginesie smile.gif.
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.