Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa validator
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
skubekk
Klasy do walidacji zmiennych. Za pomocą klas mozemy sprawdzic czy zmienna jest jest liczbą, tekstem, poprawnym emailem.... Jak wam podoba sie to rozwiązanie? Prosze o opinie na jej temat:]
  1. <?php
  2. class LogicException extends Exception{}
  3. class InvalidArgumentException extends LogicException{}
  4. abstract class validator
  5. {
  6. protected $wymagane = TRUE;
  7. protected $min;
  8. protected $max;
  9. protected $zmienna;
  10.  
  11. public function __construct($zmienna)
  12. {
  13. $this->zmienna = $zmienna;
  14. }
  15. public function min( $min )
  16. {
  17. $validacja = new integerValidator($min);
  18. if (!$validacja->sprawdz())
  19. {
  20. throw new InvalidArgumentException ("argument funkcji min() musi być liczba");
  21. }
  22. $this->min = $min;
  23. }
  24. public function max( $max )
  25. {
  26. $validacja = new integerValidator($max);
  27. if (!$validacja->sprawdz())
  28. {
  29. throw new InvalidArgumentException ("argument funkcji max() musi być liczba");
  30. }
  31. $this->max = $max;
  32. }
  33. public function wymagane($wymagane)
  34. {
  35. if (!is_bool($wymagane))
  36. {
  37. throw new InvalidArgumentException ("argument funkcji wymagane() musi być typu boolean");
  38. }
  39. $this->wymagane = $wymagane;
  40. }
  41. protected function typ(){}
  42. protected function dlugosc($dlugosc)
  43. {
  44. $min = $this->min;
  45. $max = $this->max;
  46.  
  47. if ( !empty( $min ) AND !empty( $max ) )
  48. {
  49. if ( $dlugosc < $min OR $dlugosc > $max )
  50. {
  51. return FALSE;
  52. }
  53. }
  54. if( !empty( $min ) )
  55. {
  56. if ( $dlugosc < $min )
  57. {
  58. return FALSE;
  59. }
  60. }
  61.  
  62. if( !empty( $max ) )
  63. {
  64. if ( $dlugosc > $max )
  65. {
  66. return FALSE;
  67. }
  68. }
  69.  
  70. return TRUE;
  71.  
  72. }
  73. public function sprawdz()
  74. {
  75. if ( empty( $this->zmienna ) AND $this->wymagane == TRUE )
  76.  {
  77.  return FALSE;
  78.  }
  79.  if( !empty( $this->zmienna ) )
  80. {
  81. if ( !$this->typ() )
  82. {
  83. return FALSE;
  84. }
  85. if ( !$this->dlugosc() )
  86.  {
  87.  return FALSE;
  88.  }
  89. }
  90.  
  91. return TRUE;
  92. }
  93. }
  94.  
  95. class stringValidator extends Validator
  96. {
  97. protected function dlugosc()
  98. {
  99. $dlugosc = strlen( $this->zmienna );
  100. if (!parent::dlugosc($dlugosc))
  101. {
  102. return FALSE;
  103. }
  104. return TRUE;
  105. }
  106.  
  107. protected function typ()
  108. {
  109. if ( ctype_digit( (string)$this->zmienna ) )
  110. {
  111. return FALSE;
  112. }
  113. return TRUE;
  114. }
  115. }
  116. class emailValidator extends stringValidator
  117. {
  118.  
  119. public function typ()
  120. {
  121. if ( eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$", $this->zmienna ) )
  122. {
  123. return FALSE;
  124. }
  125. return TRUE;
  126. }
  127. }
  128. class integerValidator extends Validator
  129. {
  130. protected function dlugosc()
  131. {
  132. $dlugosc = $this->zmienna;
  133. if (!parent::dlugosc($dlugosc))
  134. {
  135. return FALSE;
  136. }
  137. return TRUE;
  138. }
  139.  
  140. protected function typ()
  141. {
  142. if ( !ctype_digit( (string)$this->zmienna ) )
  143. {
  144. return FALSE;
  145. }
  146. return TRUE;
  147. }
  148. }
  149. class passValidator extends stringValidator
  150. {
  151. public function __construct($pass,$pass2)
  152. {
  153. $this->zmienna["pass"] = $pass;
  154. $this->zmienna["pass1"] = $pass2;
  155. }
  156.  
  157. protected function porownanie()
  158. {
  159. if ($this->zmienna["pass"] == $this->zmienna["pass1"])
  160. {
  161. return TRUE;
  162. }
  163. return FALSE;
  164. }
  165.  
  166. public function sprawdz()
  167. {
  168. if (!$this->porownanie())
  169. {
  170. return FALSE;
  171. }
  172. $this->zmienna = $this->zmienna["pass"];
  173. if (!parent::sprawdz())
  174. {
  175. return FALSE;
  176. }
  177. return TRUE;
  178. }
  179.  
  180.  
  181. }
  182.  
  183. class peselValidator extends integerValidator
  184. {
  185. protected function dlugosc()
  186. {
  187. $this->min(11);
  188. $this->max(11);
  189. $dlugosc = strlen( $this->zmienna );
  190. if (!parent::dlugosc($dlugosc))
  191. {
  192. return FALSE;
  193. }
  194. return TRUE;
  195. }
  196. protected function typ()
  197. {
  198.  
  199. }
  200. }
  201. class nipValidator extends integerValidator
  202. {
  203. protected function dlugosc()
  204. {
  205. $this->min(10);
  206. $this->max(10);
  207. $dlugosc = strlen( $this->zmienna );
  208. if (!parent::dlugosc($dlugosc))
  209. {
  210. return FALSE;
  211. }
  212. return TRUE;
  213. }
  214. protected function typ()
  215. {
  216. if (!parent::typ())
  217. {
  218. return FALSE;
  219. }
  220.  
  221. $arrSteps = array(6, 5, 7, 2, 3, 4, 5, 6, 7);
  222. $intSum=0;
  223. for ($i = 0; $i < 9; $i++)
  224. {
  225. $intSum += $arrSteps[$i] * $str[$i];
  226. }
  227. $int = $intSum % 11;
  228.  
  229. $intControlNr=($int == 10)?0:$int;
  230. if ($intControlNr == $str[9])
  231. {
  232. return true;
  233. }
  234. return false;
  235. }
  236. }
  237. class regonValidator extends integerValidator
  238. {
  239. protected function dlugosc()
  240. {
  241. $this->min(9);
  242. $this->max(9);
  243. $dlugosc = strlen( $this->zmienna );
  244. if (!parent::dlugosc($dlugosc))
  245. {
  246. return FALSE;
  247. }
  248. return TRUE;
  249. }
  250. protected function typ()
  251. {
  252. if (!parent::typ())
  253. {
  254. return FALSE;
  255. }
  256.  
  257. $arrSteps = array(8, 9, 2, 3, 4, 5, 6, 7);
  258. $intSum=0;
  259. for ($i = 0; $i < 8; $i++)
  260. {
  261. $intSum += $arrSteps[$i] * $str[$i];
  262. }
  263. $int = $intSum % 11;
  264. $intControlNr=($int == 10)?0:$int;
  265. if ($intControlNr == $str[8]) 
  266. {
  267. return true;
  268. }
  269. return false;
  270. }
  271. }
  272. class nrbValidator extends integerValidator
  273. {
  274. public function __construct($zmienna)
  275. {
  276. $this->zmienna = str_replace(' ', '', $zmienna);
  277. }
  278. protected function dlugosc()
  279. {
  280. $this->min(26);
  281. $this->max(26);
  282. $dlugosc = strlen( $this->zmienna );
  283. if (!parent::dlugosc($dlugosc))
  284. {
  285. return FALSE;
  286. }
  287. return TRUE;
  288. }
  289. protected function typ()
  290. {
  291. if (!parent::typ())
  292. {
  293. return FALSE;
  294. }
  295.  
  296. $aWagiCyfr = array(1, 10, 3, 30, 9, 90, 27, 76, 81, 34, 49, 5, 50, 15, 53, 45, 62, 38, 89, 17, 73, 51, 25, 56, 75, 71, 31, 19, 93, 57);
  297. // Dodanie kodu kraju (w tym przypadku dodajemu kod PL)
  298. $iNRB = $iNRB.'2521';
  299. $iNRB = substr($iNRB, 2).substr($iNRB, 0, 2); 
  300. $iSumaCyfr = 0;
  301. for($i = 0; $i < 30; $i++) 
  302. {
  303. $iSumaCyfr += $iNRB[29-$i] * $aWagiCyfr[$i];
  304. }
  305. return ($iSumaCyfr % 97 == 1);
  306. }
  307. }
  308.  
  309.  
  310.  
  311. ?>


Przykład wykorzystania:
  1. <?php
  2. $tekst = "jakis tekst";
  3. $validacja = new stringValidator($tekst);
  4. $validacja->min(2);
  5. $validacja->max(10);
  6. $validacja->wymagane(FALSE);
  7. if ( $validacja->sprawdz() )
  8. {
  9. echo "Wszystko ok";
  10. }else{
  11. echo "Błąd. Nieprawidłowe dane";
  12. }
  13. ?>


Klasy napisane są obiektowo pod php5 które mozemy dowolnie rozszerzac i dodawac nowe typy walidacji.
Dla większej czytelnosci kodu zamieszczam strukture klas:
  1. abstract class validator
  2. {
  3.      protected $wymagane = 1;
  4.      protected $min;
  5.      protected $max;
  6.      protected $zmienna;
  7.  
  8.      public function __construct($zmienna)
  9.      public function min( $min )
  10.      public function max( $max )
  11.      public function wymagane($wymagane)
  12.      protected function typ(){}
  13.      protected function dlugosc($dlugosc)
  14.      public function sprawdz()
  15.  
  16. class stringValidator extends Validator
  17.      protected function dlugosc()
  18.      protected function typ()
  19.  
  20. class emailValidator extends stringValidator
  21.      public function typ()
  22.  
  23. class integerValidator extends Validator
  24.      protected function dlugosc()
  25.      protected function typ()
  26.  
  27. class passValidator extends stringValidator
  28.      public function __construct($pass,$pass2)
  29.      protected function porownanie()
  30.      public function sprawdz()
  31.  
  32. class peselValidator extends integerValidator
  33.      protected function dlugosc()
  34.      protected function typ()
  35.  
  36. class nipValidator extends integerValidator
  37.      protected function dlugosc()
  38.      protected function typ()
  39.  
  40. class regonValidator extends integerValidator
  41.      protected function dlugosc()
  42.      protected function typ()
  43.  
  44. class nrbValidator extends integerValidator
  45.      public function __construct($zmienna)
  46.      protected function dlugosc()
  47.      protected function typ()
NuLL
Troche duzo pisania wg mnie smile.gif
acztery
fajne ale rowniez mysle ze dalo by sie krocej. jedyne co sie rzuca mi w oczy nazywnictwo zmiennych np $dlugosc, $zmienna ... takt o mysle ze jest ok, nie wglebiajac sie w kod..
dr_bonzo
  1. <?php
  2. $validacja->wymagane(1);
  3. ?>


Czemu nie zastosujesz boolean'ow -- po to zostaly stworzone , szczegolnie ze potem porownujesz do TRUE

  1. <?php
  2. AND $this->wymagane == TRUE )
  3. ?>

co jest mylace (wiem ze 1== TRUE, ale juz nie 1 === TRUE, ale to ma byc jasne i przejrzyste)

juz lepiej dac
  1. <?php
  2. AND $this->wymagane)
  3. ?>


a juz najlepiej poslugiwac sie booleanami
  1. <?php
  2. $validacja->wymagane();
  3. // i druga opcja
  4. $validacja->nieWymagane();
  5.  
  6. // lub
  7. $validacja->wymagane( TRUE );
  8. ?>
skubekk
Cytat(dr_bonzo @ 2.11.2006, 02:13:43 ) *
  1. <?php
  2. $validacja->wymagane(1);
  3. ?>


Czemu nie zastosujesz boolean'ow -- po to zostaly stworzone , szczegolnie ze potem porownujesz do TRUE

  1. <?php
  2. AND $this->wymagane == TRUE )
  3. ?>

co jest mylace (wiem ze 1== TRUE, ale juz nie 1 === TRUE, ale to ma byc jasne i przejrzyste)

juz lepiej dac
  1. <?php
  2. AND $this->wymagane)
  3. ?>


a juz najlepiej poslugiwac sie booleanami
  1. <?php
  2. $validacja->wymagane();
  3. // i druga opcja
  4. $validacja->nieWymagane();
  5.  
  6. // lub
  7. $validacja->wymagane( TRUE );
  8. ?>


dr_bonzo Poprawiłem juz to zgodnie z twoją sugestią.
Null paradygmat obiektowy juz taki jest ze jest wiecej logiki niz samego kodu ale za to klasy można bardzo łatwo rozszerzac.
devonpl
Po 1. Da sie to zrobic krocej, lepiej i podzielic na mniejsze czesci;)

ja mam klase validacji zrobiona w ten sposob ze wywoluje sprawdzanie tak:
Validate::Chek($_GET,"id:isDigit:Pole nie jest poprawnym id","pass:Strcmp=%pass2%,Length>5<31:Podane haslo jest bledne","poleN:ValidatorN,ValidatorN+1,...:BladN");

w odpowiedzi dostaje TRUE lub tablice z błedami np.
Array ( [0] => Array ( 'pole' =>'pass", 'error' =>"Haslo nie poprawne" ), [1] => Array ( 'pole' =>'id", 'error' =>"Komunikat..." )

Druga sprawa, ze porownaj sobie swoja klasa dwa hasla:
"123456" i "123456."

zobacz wynik smile.gif

Pozdro
darektbg
Cytat(devonpl @ 8.04.2007, 08:30:30 ) *
Druga sprawa, ze porownaj sobie swoja klasa dwa hasla:
"123456" i "123456."


  1. <?php
  2. $this->zmienna["pass"] == $this->zmienna["pass1"]
  3. ?>

zamiast '==', lepiej chyba dać '==='

  1. <?php
  2. 1 == '1dwatrzy' //true
  3. 1 === '1dwatrzy' //false
  4. ?>
MOniToR
Witam

Wiem, że odkopuję stary wątek, jednak jest on bardzo ciekawy i myślę, że to o co poproszę pomoże nie tylko mi. Mianowicie mógłby mi ktoś napisać przykład kodu dla walidacji całego formularza składającego się z paru pól? Np. login, hasło, email ? Bardzo mi się przyda ta klasa ale nie chciałbym dla każdego pola osobno pisać tego :

  1. <?php
  2. $tekst = "jakis tekst";
  3. $validacja = new stringValidator($tekst);
  4. $validacja->min(2);
  5. $validacja->max(10);
  6. $validacja->wymagane(FALSE);
  7. if ( $validacja->sprawdz() )
  8. {
  9. echo "Wszystko ok";
  10. }else{
  11. echo "Błąd. Nieprawidłowe dane";
  12. }
  13. ?>

Tylko chciałbym zrobić to w miarę zgrabnie i żeby tylko raz używać funkcji if, jeżeli to jest możliwe, a nie dla każdego pola osobno. Z góry dzięki za pomoc smile.gif
cojack
Sam jestem w trakcie pisania classy do weryfikacji ogólnej dla formularzy, różne zmienne itp, nie żebym się czepiał ale nie podoba mi sie Twój styl pisania. Jak classa veryfikacji to classa veryfikacji a nie 30 class veryfikacji.
cbagov
Taki hinduski kod. Chyba dopiero zaczynasz, jesli tak... to skasuj to cos a jesli nie to polecam nervosol. winksmiley.jpg
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.