Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa][php] Validation
PiotrekM
post 23.03.2010, 19:29:55
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Witam,
napisałem dla siebie klasę walidacji. Nigdy nie korzystałem z walidacji, tak więc nie wiem czy jest dobrze napisane.
kod się nie zmieścił, więc wrzuciłem na stronę typu no-paste
na nopaste.pl
na wklej.org
Użycie:
  1. validation::checkString(array('test' => 'lorem ipsum dolor sit amet'));
  2.  
  3. validation::setValidations(array('test' => array(
  4. 'maxlenght' => 3,
  5. 'minlenght' => 100,
  6. 'between' => array(10,11),
  7. 'type' => 'bool',
  8. 'maxtimechar' => 'a[spilit]0',
  9. 'required' => true,
  10. 'regex' => '/([0-9]+)/'
  11. )));
  12.  
  13. echo (validation::isValid('test')) ? 'true' : 'false';
  14.  
  15. if( count( @validation::$error['test']) > 0) {
  16.  
  17. echo '<ul>';
  18.  
  19. foreach( validation::$error['test'] as $error) {
  20.  
  21. echo '<li>' . $error . '</li>';
  22. }
  23.  
  24. echo '</ul>';
  25. }

Opcje walidacji
Kod
maxlenght - maksymalna ilość znaków w stringu
minlenght - minimalna ilość znaków
between - w tablicy: minimalna oraz maksymalna ilość znaków
type - typ
maxtimechar - maksymalna liczba wyrazów bądź znaków w stringu (słowo oddzielone od liczby [spilit] (a[spilit]5))
required - string nie może być pusty, jeżeli damy true
regex - regex

pola z błędami są publicznie dostępne, także można jest dowolnie zmieniać.

Ten post edytował PiotrekM 23.03.2010, 19:32:36
Go to the top of the page
+Quote Post
Moli
post 23.03.2010, 19:38:48
Post #2





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Moim zdaniem klasa niepotrzebnie jest statyczna. Dorób metodę która sprawdzi wszystkie elementy po kolei czy są dobre, przydaje się taka funkcjonalność smile.gif
Go to the top of the page
+Quote Post
Fifi209
post 23.03.2010, 20:12:30
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Jest niepotrzebnie statyczna, w dodatku nie wiem czemu dziedziczysz po exception, te wyjątki robią tam zbędny chaos, ich użycie jest źle przemyślane.

Ja bym zrobił coś na ten wzór:
  1. <?php
  2.  
  3. interface i_validation {
  4. public function isValid($name);
  5. public function setValidation($options);
  6. }
  7.  
  8. class validation {
  9.  
  10. public function check($name, i_validation $obj) {
  11. return $obj->isValid($name);
  12. }
  13.  
  14. }
  15.  
  16. class validation_string implements i_validation {
  17.  
  18. private $status=false;
  19. private $options;
  20.  
  21. public function isValid($name) {
  22. if ($this->status != false) {
  23. if (preg_match($this->options['regex'], $name) && strlen($name) >= $this->options['minlenght'] && strlen($name) <= $this->options['maxlenght']) {
  24. return true;
  25. }else{
  26. return false;
  27. }
  28. }
  29. }
  30.  
  31. public function setValidation($options) {
  32. $keys = array('minlenght', 'maxlenght', 'regex');
  33. if (count(array_diff($keys, array_keys($options))) == 0) {
  34. $this->options = $options;
  35. }else{
  36. return false;
  37. }
  38. $this->status = true;
  39. return true;
  40. }
  41.  
  42. }
  43.  
  44. $obj = new validation();
  45.  
  46. $string = new validation_string();
  47. $string->setValidation(array('regex' => '#^[\w]+$#i', 'minlenght' => 4, 'maxlenght' => 6));
  48.  
  49. var_dump($obj->check('jakis tekst', $string)); // bool(false)
  50. var_dump($obj->check('jakisd', $string)); // bool(true)
  51.  
  52. ?>


Dla każdego typu możesz sobie odpowiedni obiekt przekazać w zależności od tego co potrzebujesz sprawdzać.

Ten post edytował fifi209 23.03.2010, 20:32:01


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
PiotrekM
post 23.03.2010, 21:49:39
Post #4





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


jest statyczna, bo w moim frameworku chce móc się odwoływać statycznie do klas
Go to the top of the page
+Quote Post
Zyx
post 23.03.2010, 22:02:56
Post #5





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Ale tu nie chodzi o to, czy chcesz się tak odwoływać, tylko czy daje Ci to coś konkretnego. Jak ja mam ochotę dziedziczyć klasę do wysyłania e-maili po PDO, to tego mimo wszystko nie robię, bo nie będzie to miało żadnego sensu smile.gif. Klasy stosuje się w konkretnym celu do uzyskania konkretnego efektu, podobnie jak elementy statyczne i wiele innych rzeczy. Jeśli to ma zostać w takim kształcie, to za bardzo nie widzę potrzeby uzasadniającej istnienie tego kodu. To samo masz we wbudowanym rozszerzeniu filter, tyle że na funkcjach - wprowadzasz wartość, podajesz reguły i dostajesz odpowiedź czy jest dobrze czy źle. Dobra, filter nie generuje komunikatów błędów, ale to nie jest funkcjonalność tłumacząca np. podwójnie zagnieżdżony foreach.

Druga rzecz to błąd merytoryczny:

Kod
if( is_integer(self::$checkString[$arrays])) {


Poczytaj sobie, co robi funkcja is_integer(), bo na pewno nie to, co myślałeś, pisząc ten kod smile.gif. Polecam przeanalizować ten krótki skrypt i wynik jego działania:

  1. <?php


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
gothye
post 23.03.2010, 22:16:34
Post #6





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


hmm ,tworząc klasę do vaidacji formularza podeszłem do tego inaczej : http://wklej.org/id/302832/ ogólnie spisuję sie ok ale musze znaleść czas aby dopracować ją ,wszelkie uwagi milę widziane


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
Zyx
post 23.03.2010, 22:26:01
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


I robisz dokładnie ten sam błąd, co kolega wyżej:

Kod
if(is_float($this->Source[$name]))


is_float() nie robi tego, co myślałeś, pisząc ten kod, że robi. Ponadto stosujesz jakąś archaiczną składnię obiektową smile.gif.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
gothye
post 23.03.2010, 22:34:15
Post #8





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


W jakim sensie archaiczną ?


--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
PiotrekM
post 23.03.2010, 22:42:09
Post #9





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Dzięki serdeczne za odpowiedzi smile.gif
Cytat(Zyx @ 23.03.2010, 22:02:56 ) *
Druga rzecz to błąd merytoryczny:

Kod
if( is_integer(self::$checkString[$arrays])) {


Poczytaj sobie, co robi funkcja is_integer(), bo na pewno nie to, co myślałeś, pisząc ten kod smile.gif. Polecam przeanalizować ten krótki skrypt i wynik jego działania:

  1. <?php

Nie rozumiem co masz na myśli, is_integer() zwraca wartość bool - wiem o tym. Jeżeli chodzi o jakiegoś typu serializowanie tego ifem, to dałem tak, gdyż wraz ze zwrotem false zgłasza błąd smile.gif
Go to the top of the page
+Quote Post
flip
post 24.03.2010, 01:19:20
Post #10





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 13.03.2010

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


Cytat(PiotrekM @ 23.03.2010, 22:42:09 ) *
Nie rozumiem co masz na myśli, is_integer() zwraca wartość bool - wiem o tym. Jeżeli chodzi o jakiegoś typu serializowanie tego ifem, to dałem tak, gdyż wraz ze zwrotem false zgłasza błąd smile.gif


is_integer() na stringu zawsze zwróci bool i zawsze zwróci false:)
Go to the top of the page
+Quote Post
Zyx
post 24.03.2010, 07:40:19
Post #11





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


gothye -> archaiczną, bo a'la PHP4. Dobry zwyczaj nakazuje, aby nie stosować słowa var na rzecz modyfikatorów dostępu i Tobie by się to przydało o tyle, że masz parę pól prywatnych zadeklarowanych przez to jako publiczne. Dobry zwyczaj nakazuje też umieszczać modyfikatory dostępu przy funkcjach.

PiotrekM -> a sprawdziłeś, JAKĄ wartość logiczną zwraca? Dla Twojej informacji, jeśli będziesz próbował w ten sposób sprawdzać np. $_GET, to tam początkowo wszystkie pola mają typ string (z wyjątkiem tablic). Typów PHP się nie wykorzystuje w sprawdzaniu, ponieważ nie są one miarodajne i tak naprawdę niewiele mówią o tym, co się w danym polu zawiera.

Ten post edytował Zyx 24.03.2010, 07:41:27


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
PiotrekM
post 24.03.2010, 13:56:11
Post #12





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Cytat(Zyx @ 24.03.2010, 07:40:19 ) *
PiotrekM -> a sprawdziłeś, JAKĄ wartość logiczną zwraca? Dla Twojej informacji, jeśli będziesz próbował w ten sposób sprawdzać np. $_GET, to tam początkowo wszystkie pola mają typ string (z wyjątkiem tablic). Typów PHP się nie wykorzystuje w sprawdzaniu, ponieważ nie są one miarodajne i tak naprawdę niewiele mówią o tym, co się w danym polu zawiera.

no dlatego do sprawdzania $_GET jest numeric.
Go to the top of the page
+Quote Post
marcio
post 24.03.2010, 14:24:35
Post #13





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Ja u mnie rozwiazalem to tak: http://3paste.com/s/1601 mam do poprawy jeszcze tylko jedna rzecz a dokladniej jak na jedno pole jest kilka warunkow a takich pol jest wiecej zwraca tylko pierwsze zle pola czy jakos tak musze do konca przetestowac.
A tak wyglada akcja komponentu Auth metoda Auth razem z walidacja:
  1. public function Auth() {
  2.  
  3. if($this -> validation -> Submitted('log')) {
  4.  
  5. $this -> inputfilter -> Filter();
  6.  
  7. $this -> validation -> AddRules('login', 'Login', 'required');
  8. $this -> validation -> AddRules('password', 'Haslo', 'required');
  9. $this -> validation -> AddRules('login', 'Login', 'AlphaDigit');
  10. $this -> validation -> AddRules('password', 'Haslo', 'AlphaDigit');
  11.  
  12. $this -> validation -> Validation();
  13.  
  14. $errors = $this -> validation -> getValidationErrors();
  15.  
  16. if(empty($errors)) {
  17.  
  18. if($this -> AuthModel -> Login($_POST['login'], $_POST['password'])) {
  19.  
  20. $this -> Redirect('/index.php');
  21.  
  22. }
  23.  
  24. }
  25.  
  26. else {
  27.  
  28. $this -> view -> AddVar('error', $errors);
  29.  
  30. }
  31.  
  32. }
  33.  
  34. $user = $this -> auth -> GetUserType();
  35. return $this -> view -> Layout('Auth', 'component', $user);
  36.  
  37. }


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Zyx
post 24.03.2010, 15:05:43
Post #14





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


PiotrekM -> ech, przeczytaj wszystko jeszcze raz, ale ze zrozumieniem... mówimy właśnie o tym Twoim "numeric", które nie zadziała, bo do sprawdzenia czy pole zawiera liczbę użyłeś funkcji is_int(). Nie rozumiesz w ogóle, jak ta funkcja działa - ona nie sprawdza, czy wartość jest liczbą, tylko czy wartość zmiennej PHP ma aktualnie typ liczbowy, a to dwie różne rzeczy:

  1. <?php
  2. var_dump(is_integer('15')); // TAK WŁAŚNIE WYGLĄDA LICZBA W $_GET!


Piszemy przecież cały czas, że w tablicach $_GET, $_POST wszystkie wartości są ciągami tekstowymi, więc bez względu na to, jaką wartość będą zawierać, is_int() zwróci Ci dla nich false i możesz pożegnać się np. ze sprawdzeniem czy przekazany do skryptu ID jest poprawny... do takiego sprawdzania się używa wyrażeń regularnych i funkcji z rodziny ctype_xxx().


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
PiotrekM
post 24.03.2010, 17:10:31
Post #15





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


przepraszam, rozumiem.
można by użyć is_numeric, ale gdy liczba nie jest liczbą całkowitą, to dupa.
zaraz to poprawie

edit:
próbowałem dać settype dla stringu, lecz nawet gdy liczba nie jest liczbą całkowitą, zwraca true - jakieś sugestie?

Ten post edytował PiotrekM 24.03.2010, 17:30:49
Go to the top of the page
+Quote Post
Fifi209
post 24.03.2010, 18:03:10
Post #16





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(PiotrekM @ 24.03.2010, 17:10:31 ) *
przepraszam, rozumiem.
można by użyć is_numeric, ale gdy liczba nie jest liczbą całkowitą, to dupa.
zaraz to poprawie

edit:
próbowałem dać settype dla stringu, lecz nawet gdy liczba nie jest liczbą całkowitą, zwraca true - jakieś sugestie?

Ogólnie to marne szanse, php to język w którym nie musisz dbać o typy i jak widać to się mści. smile.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual 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: 20.07.2025 - 20:40