Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Typy danych - jak nad nimi panowac
Beynar
post 26.12.2007, 11:03:41
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


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?
Go to the top of the page
+Quote Post
Cysiaczek
post 26.12.2007, 11:08:05
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Np.

  1. <?php
  2. $id=(integer) $_GET['id'];
  3. ?>


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Grzyw
post 26.12.2007, 11:11:16
Post #3





Grupa: Zarejestrowani
Postów: 561
Pomógł: 75
Dołączył: 19.08.2004
Skąd: Wrocław

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


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.

Ten post edytował Grzyw 26.12.2007, 11:13:18


--------------------
Idąc po czyichś śladach, nie zajdziesz ani kroku dalej...
Go to the top of the page
+Quote Post
Beynar
post 26.12.2007, 11:32:41
Post #4





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


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

Ten post edytował Beynar 26.12.2007, 11:34:12
Go to the top of the page
+Quote Post
.chudy.
post 26.12.2007, 13:35:54
Post #5





Grupa: Zarejestrowani
Postów: 70
Pomógł: 3
Dołączył: 15.06.2003
Skąd: kosmosu?

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


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.

Ten post edytował .chudy. 26.12.2007, 13:36:35


--------------------
Warsztat#1 ::drum and bass:: Apache2.2 :: PHP 5.2 ::
Go to the top of the page
+Quote Post
Beynar
post 28.12.2007, 10:51:14
Post #6





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


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?

Ten post edytował Beynar 26.12.2007, 13:50:30
Go to the top of the page
+Quote Post
vokiel
post 28.12.2007, 11:14:21
Post #7





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


To może zamiast tego używać intval, nie koniecznie samej fukncji, ale tam w komentarzach są ciekawe propozycje.


--------------------
Go to the top of the page
+Quote Post
andrew1985
post 28.12.2007, 12:43:11
Post #8





Grupa: Zarejestrowani
Postów: 48
Pomógł: 4
Dołączył: 28.12.2007

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


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.
Go to the top of the page
+Quote Post
Kiera
post 28.12.2007, 16:18:32
Post #9





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.12.2007

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


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
Go to the top of the page
+Quote Post
phpion
post 28.12.2007, 16:37:18
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@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]+$
Go to the top of the page
+Quote Post
Kiera
post 28.12.2007, 21:46:38
Post #11





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 28.12.2007

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


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.

Ten post edytował Kiera 28.12.2007, 21:48:16
Go to the top of the page
+Quote Post
Beynar
post 30.12.2007, 01:18:23
Post #12





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


  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
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 15.07.2025 - 06:58