Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Typy danych - jak nad nimi panowac
Forum PHP.pl > Forum > PHP
Beynar
Macie moze jakies wlasne metody do zapamowania nad typami danych? Moze z jednej strony to dobre, ze w php nie trzeba sztywno deklarowac zmiennych i same się konwertują w niektorych okoliczonsciach ale czasem to sprawia problemy i nie wiemy czy to np. integer czy string.

Konkretnie mam teraz problem z danymi pochodzacymi z formularza. Form zawsze zwroci mi string a ja mam tam pola ktore sa przeznaczone jednoznacznie na wartosci liczbowe.
Przy odbiorze tych danych wszystko konwertowac funkcja settype?
Nie macie na to opracowanych jakichs sprawdzonych sposobow?
Cysiaczek
Np.

  1. <?php
  2. $id=(integer) $_GET['id'];
  3. ?>
Grzyw
Beynar, przykład, który Cysiaczek pokazał, wiąże się z rzutowaniem typu.
Poczytaj:
http://wortal.php.pl/wortal/artykuly/php/p...zutowanie_typow

Zastosowanie rzutowania:
  1. <?php
  2. $liczbaNaPewo = (int)$ktoWieCzyLiczba;
  3. ?>

jest jedną z operacji ochrony przed SQL Injection - jeżelli do bazy ma być wsadzana liczba, a w formularz został wpisany/wklejony string, to wartość zmiennej $liczbaNaPewno wyniesie 0.
Beynar
Widze, ze to dziala jak settype()
Czyli wszystko pięknie ładnie ale
1. jesli user poda "," zamiast "." w stringu reprezentujacym wartosc to przy konwersji ucięte zostanie wszystko od przecinka w prawo.
2. Jeśli klient wpisze np. wartość: "fc24w1a4" to funkcja zwroci mi 0 choć w dokumentacji pisze:
Cytat
Zwraca TRUE w przypadku sukcesu, FALSE w przypadku porażki.
Nie wiem czy skonwertowania fc24w1a4 do 0 można nazwać powodzeniem.
Jak wtedy moge rozróżnić czy user rzeczywiscie podał 0 czy nic czy moze jakiś string.... settype we wszystkich trzech wypadakach zwróci zero!

pozostaja eregi i zanim przejde do konwersji, moge sprawdzac co tam rzeczywiscie bylo...
ale operacje na stringach nie naleza do najszybszych
.chudy.
To nie jest dokońca tak że false równa się 0. Możesz sprawdzać czy wynik jest prawdziwy np przez if($result). I tutaj php odrózni czy wynik wyszedł zero czy się operacja nie wykonała poprawnie.
Beynar
Wlasnie sprawdzam co ona zwraca (is_bool) i to nie jest boolowski falsz i php nie konwertuje go na 0 tylko po prostu ta funkcja zwraca 0 (float lub int), zaleznie od tego co wybiore przy konwertowaniu.

Błąd w dokumentacji?
No chyba ze przykladową konwersje stringa "hj345k354jk" do integera ktora da rezultat 0 nalezy uwazac za udaną smile.gif

Czyzby błąd w dokumentacji?
vokiel
To może zamiast tego używać intval, nie koniecznie samej fukncji, ale tam w komentarzach są ciekawe propozycje.
andrew1985
Nie ptrzebnie komplikujecie.
I w dokumentacji nie ma błedu po prostu 0 == false
Ja sprawdzam czy dane z formularza są liczbą funkcją is_numeric() która zwraca true jeżeli tak lub flase jeżeli nie. Sprawdzasz tą funkcją czy dane pole jest liczbą jeżeli nie to informujesz użytkownika o tym i nie wykonujesz dalej kodu.
Kiera
Ja bym uzyl wyrazen regularnych. np. jak w polu formularza ma byc wpisana tylko i wylacznie liczba :

  1. <?php
  2. if (ereg('[0-9]+ , $_POST['wiek]))
  3. //OK
  4. else
  5. //POPRAW FORMULARZ
  6. ?>


a jesli np. tylko male i wielkie litery alfabetu plus polskie znaki z ogonkami:

  1. <?php
  2. if (ereg('[a-zA-ZąćęłńóśżźĄĆĘŁŃÓŚŻŹ ]+ , $_POST['nazwisko]))
  3. //OK
  4. else
  5. //POPRAW FORMULARZ
  6. ?>


Polecam artykuł:

http://www.gajdaw.pl/php/walidacja-formularzy/p1.html
phpion
@Kiera - Twoje wyrażenia regularne są dziurawe. Przykładowo: [0-9]+ przepuści np. a123b. Zapomninasz o oznaczeniu początku (^) oraz końca ($) wzorca. Poprawny zapis powinien wyglądać tak: ^[0-9]+$
Kiera
Cytat(phpion.com @ 28.12.2007, 16:37:18 ) *
@Kiera - Twoje wyrażenia regularne są dziurawe. Przykładowo: [0-9]+ przepuści np. a123b. Zapomninasz o oznaczeniu początku (^) oraz końca ($) wzorca. Poprawny zapis powinien wyglądać tak: ^[0-9]+$



Szczerze to nie wiem dlaczego nie przekopiowalo mi poprawnie czyli z z +$ na koncu. ^ na poczatku nie jest potrzebny. Mi taki skrypt dziala i nic oprocz cyfr nie da sie wklepac do formularza.

  1. <?php
  2. if (ereg('[0-9]+$ , $_POST['wiek]))
  3. //OK
  4. else
  5. //POPRAW FORMULARZ
  6. ?>


Ja oczywiscie raczkuje i moge sie mylic co do teori. Pisze jak to w praktyce wychodzi.
Beynar
  1. <?
  2. // ustawiamy zmienna
  3. $string="vfd67vfd9.43";
  4. echo "<p>ustawiamy wartosc string: \"".$string."\"</p>";
  5.  
  6. //ustawiamy jej typ na int
  7. echo " ustawiamy jej typ na int";
  8. $a=settype($string, "int");
  9.  
  10. if($a===true)
  11. echo "<p>settyp zwraca bool true</p>";
  12. else if($a===false)
  13. echo "<p>settype zwraca bool false</p>";
  14.  
  15. // teraz badamy ustawiony typ zmiennej
  16. if(is_string($string))
  17. echo "<p>string dalej jest stirngiem</p>";
  18. else if (is_int($string))
  19. echo "<p>string teraz jest liczba calkowita</p>";
  20.  
  21. echo "<p>wartosc zmiennej to: \"".$string."\"</p>";
  22. ?>


Przyklad wydrukuje:
Cytat
ustawiamy wartosc string: "vfd67vfd9.43"
ustawiamy jej typ na int
settyp zwraca bool true
string teraz jest liczba calkowita
wartosc zmiennej to: "0"


kowersja stringu vfd67vfd9.43 do int 0 mozna uznac za true? Tak zwraca settype choć:
Cytat
Zwraca TRUE w przypadku sukcesu, FALSE w przypadku porażki.
http://pl2.php.net/manual/pl/function.settype.php
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.