Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa][php] Validation
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
PiotrekM
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ć.
Moli
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
Fifi209
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ć.
PiotrekM
jest statyczna, bo w moim frameworku chce móc się odwoływać statycznie do klas
Zyx
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
gothye
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
Zyx
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.
gothye
W jakim sensie archaiczną ?
PiotrekM
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
flip
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:)
Zyx
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.
PiotrekM
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.
marcio
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. }
Zyx
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().
PiotrekM
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?
Fifi209
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
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-2024 Invision Power Services, Inc.