Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> klasa validator
skubekk
post
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 8.08.2003
Skąd: Częstochowa

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


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()


Ten post edytował skubekk 2.11.2006, 09:59:35
Go to the top of the page
+Quote Post
NuLL
post
Post #2





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Troche duzo pisania wg mnie smile.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
acztery
post
Post #3





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


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..
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


  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. ?>


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
skubekk
post
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 8.08.2003
Skąd: Częstochowa

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


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.
Go to the top of the page
+Quote Post
devonpl
post
Post #6





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 8.04.2007

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


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





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 25.09.2006

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


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. ?>


--------------------
skocz.org - system skracania linków
Go to the top of the page
+Quote Post
MOniToR
post
Post #8





Grupa: Zarejestrowani
Postów: 182
Pomógł: 2
Dołączył: 16.11.2003
Skąd: Wrocław / Skokowa

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


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


--------------------
Go to the top of the page
+Quote Post
cojack
post
Post #9





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


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.
Go to the top of the page
+Quote Post
cbagov
post
Post #10





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

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


Taki hinduski kod. Chyba dopiero zaczynasz, jesli tak... to skasuj to cos a jesli nie to polecam nervosol. winksmiley.jpg
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 Aktualny czas: 19.08.2025 - 17:12