Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Walidacja formularzy ., Czyli Ja kontra klasy , pierwsze starcie .
nekomata
post 2.06.2011, 15:48:17
Post #1





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


Witam , dzisiaj rano postanowiłem zagłębić się troszeczkę w klasy php , wcześniej wiedziałem tylko jak używać gotowych więc trochę poczytałem i spróbowałem własnych sił z klasą która przejrzy za mnie dane z formularza. W sumie jest to bardziej funkcja w formie klasy niż profesjonalna klasa , ale jak pisałem dopiero zacząłem pisanie klas . Dobra przejdźmy do kodu :
  1. <?php
  2. class form_validator{
  3. private $form;
  4. private $boundaries;
  5. public $errors = array();
  6. public function load_form($form){
  7. if(!is_array($form))die('Form to validate is not an array.');
  8. $this->form = $form;
  9. }
  10. public function boundaries($boundaries){
  11. if(!is_array($boundaries))die('Validator data is not an array.');
  12. $this->boundaries = $boundaries;
  13. }
  14. public function validate(){
  15. foreach($this->boundaries as $k => $v){
  16. if(isset($this->form[$k])){
  17. foreach($v as $key=>$value){
  18. switch($key){
  19. case 'length':
  20. $lengths = (explode('-',$value));
  21. if(strlen($this->form[$k])<$lengths[0]||strlen($this->form[$k])>$lengths[1]){
  22. $this->errors[$k][$key]=true;
  23. }
  24. break;
  25. case 'allowed_characters':
  26. $value = str_replace(array('\\','[',']','^','$','.','|','?','*','+','(',')'),array('\\\\','\[','\]','\^','\$','\.','\|','\?','\*','\+','\(','\)'),$value);
  27. if(!preg_match('#^['.$value.']{1,}$#',$this->form[$k])){
  28. $this->errors[$k][$key]=true;
  29. }
  30. break;
  31. case 'type':
  32. switch($value){
  33. case 'numbers':
  34. if(!is_numeric($this->form[$k])){
  35. $this->errors[$k][$key]=true;
  36. }
  37. break;
  38. case 'e-mail':
  39. if(!filter_var($this->form[$k],FILTER_VALIDATE_EMAIL)){
  40. $this->errors[$k][$key]=true;
  41. }
  42. break;
  43. case 'ip':
  44. if(!filter_var($this->form[$k],FILTER_VALIDATE_IP)){
  45. $this->errors[$k][$key]=true;
  46. }
  47. break;
  48. case 'ipv4':
  49. if(!filter_var($this->form[$k],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)){
  50. $this->errors[$k][$key]=true;
  51. }
  52. break;
  53. case 'ipv6':
  54. if(!filter_var($this->form[$k],FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)){
  55. $this->errors[$k][$key]=true;
  56. }
  57. break;
  58. }
  59. break;
  60. case 'regex':
  61. if($value[0]!==$value[strlen($value)-1]){$value = '#'.$value.'#';}
  62. if(!preg_match($value,$this->form[$k])){
  63. $this->errors[$k][$key]=true;
  64. }
  65. break;
  66.  
  67. }
  68. }
  69. }
  70. else{
  71. $this->errors[$k]['isset']=true;
  72. }
  73. }
  74. if(empty($this->errors)){
  75. return true;
  76. }
  77. else{
  78. return false;
  79. }
  80. }
  81. }
  82. ?>
Do użycia klasy potrzebne będą nam dwie tablice z danymi , pierwsza która otrzymujemy z formularza i druga w której określamy właściwości naszych wartości z formularza . Ja w przykładzie posłużę się tymi dwoma
  1. $form = array(
  2. 'login'=>'zdzisiek',
  3. 'haslo'=>'zdzisiek1234',
  4. 'email'=>'zdzsiek@email.com',
  5. 'test'=>'lolek');
  6. $boundaries = array(
  7. 'login'=>array(
  8. 'length'=>'3-5',
  9. 'allowed_characters'=>'abcdefghijklmnoprstuwxy'
  10. ),
  11. 'haslo'=>array(
  12. 'length'=>'6-16'
  13. ),
  14. 'email'=>array(
  15. 'length'=>'5-40',
  16. 'type'=>'e-mail'
  17. ),
  18. 'test'=>array(
  19. 'regex'=>'^[abcdes]{1,}$'
  20. ),
  21. 'pusty'=>array(
  22. 'type'=>'ip'
  23. )
  24. );
Pierwsza tablica to mój sfabrykowany formularz a druga to właściwości dla niego . Oczywiście dla przykładu wprowadziłem błąd w każdym z nich biggrin.gif , teraz przejdę do budowy tablicy boundaries(ograniczenia) , tablica ta składa się z pomniejszych tablic które noszą nazwy komórek z formularza , dla każdej z pomniejszych tablic dostępne są dosyć oczywiste opcje a mianowicie
Kod
lenght - długość wartości , podana jako  min-max czyli np "3-15"
allowed_characters - dozwolone znaki , po prostu wypisujemy znaki po kolei .
type - typ wartości , dostępne wartości to : numbers,e-mail ,ip,ipv4,ipv6
regex - tutaj podajemy wyrażenie regularne
Przykładowe użycie klasy :
  1. <?php // Po załadowaniu klasy i powyższych ograniczeń :
  2. $validator = new form_validator;
  3. $validator->load_form($form);
  4. $validator->boundaries($boundaries);
  5. if($validator->validate()){
  6. echo 'WIN ! ';
  7. //Tutaj dodajemy do bazy czy co tam chcemy , operujemy na normalnych zmiennych
  8. //Klasa zwraca true tylko w wypadku bezbłędnego formularzu biggrin.gif
  9. }
  10. else{
  11. foreach($validator->errors as $key=>$value){
  12. foreach($value as $k=>$v){
  13. switch($k){
  14. case 'isset':
  15. echo 'Zapomniałeś wypełnić '.$key;
  16. break;
  17. case 'length':
  18. echo 'Niepoprawna ilość znaków w polu '.$key.' , zalecane '.$boundaries[$key][$k].' znaków.<br />';
  19. break;
  20. case 'allowed_characters':
  21. echo 'Niedozwolone znaki w polu '.$key.'<br />';
  22. break;
  23. case 'type' :
  24. echo 'Niepoprawna wartość w polu '.$key.'<br />';
  25. // można zrobić switch na $boundaries[$key][$k] dla róznych typów.
  26. break;
  27. case 'regex' :
  28. echo 'Niewłaściwe dane w komórce '.$key.'<br />';
  29. break;
  30. }
  31. }
  32. }
  33. echo str_replace(array('login','haslo','email','test'),array('nazwa użytkownika',' hasło ',' adres internetowej skrzynki pocztowej ',' komorka testowa'),ob_get_clean());
  34. }
  35. ?>
Jak już pisałem dwa razy jest to moja pierwsza klasa więc :
A ) Krytykujcie
B ) Sugerujcie
C ) Doradzajcie
biggrin.gif
(Klasa nie jest żadnym arcydziełem , ba pewno znajdziecie masę błedów , ale wolałbym jakbyście nie wrzucali tego na inne fora albo używali gdziekolwiek podając za swoje dzieło ... a poza tym to róbcie z tym co chcecie tongue.gif )

Ten post edytował nekomata 2.06.2011, 15:48:54
Go to the top of the page
+Quote Post
greycoffey
post 3.06.2011, 15:33:46
Post #2





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

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


Tutaj Crozin zamieścił swojego walidatora, popatrz i wyciągnij wnioski ;-)
Go to the top of the page
+Quote Post
nekomata
post 4.06.2011, 03:16:47
Post #3





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


Mhmmm , ogólnie to napisałem ten temat właśnie po takie porady , chce napisać klasę która jest najbardziej poprawna ze standardami (jeśli gdzieś by była lista takowych to byłbym wdzięczny za link) .
Obejrzałem sobie tą klasę Crozin'a jedyna rzecz która mi się "nie spodobała" to to że obiekt klasy był wrzucany za każdym razem , moim celem było 'uprościć' formularze a to trochę mija się z celem. Dlatego przepisałem te klasę (użycie nadal jest takie samo) jednak za każdym razem klasa jest wywoływana automatycznie , napiszcie co myślicie o takowym rozwiązaniu i czy takie rozwiązanie jest w ogóle poprawne , Thx.
  1. <?php
  2. class form_validator{
  3. private $form;
  4. private $boundaries;
  5. public $errors = array();
  6. public function start(Array $form = array(), Array $boundaries = array()){
  7. $this->form = $form;
  8. $this->boundaries = $boundaries;
  9. }
  10. public function validate(){
  11. foreach($this->boundaries as $k => $v){
  12. if(isset($this->form[$k])){
  13. foreach($v as $key=>$value){
  14. $test = new $key($this->form[$k],$value);
  15. if($test->isValid()){
  16. $this->errors[$k][$key]=true;
  17. }
  18. }
  19. }
  20. else{
  21. $this->errors[$k]['isset']=true;
  22. }
  23. }
  24. if(empty($this->errors)){
  25. return true;
  26. }
  27. else{
  28. return false;
  29. }
  30. }
  31. }
  32. class length{
  33. private $value;
  34. private $validators;
  35. public function __construct($value,$validators){
  36. $this->value = $value;
  37. $this->validators = $validators;
  38. }
  39. public function isValid(){
  40. $lengths = (explode('-',$this->validators));
  41. if(strlen($this->value)<$lengths[0]||strlen($this->value)>$lengths[1]){
  42. return true;
  43. }
  44. }
  45. }
  46. class allowed_characters{
  47. private $value;
  48. private $validators;
  49. public function __construct($value,$validators){
  50. $this->value = $value;
  51. $this->validators = str_replace(array('\\','[',']','^','$','.','|','?','*','+','(',')'),array('\\\\','\[','\]','\^','\$','\.','\|','\?','\*','\+','\(','\)'),$validators);
  52. }
  53. public function isValid(){
  54. if(!preg_match('#^['.$this->validators.']{1,}$#',$this->value)){
  55. return true;
  56. }
  57. }
  58. }
  59. class type{
  60. private $value;
  61. private $validators;
  62. public function __construct($value,$validators){
  63. $this->value = $value;
  64. $this->validators = $validators;
  65. }
  66. public function isValid(){
  67. switch($this->validators){
  68. case 'numbers':
  69. if(!is_numeric($this->value)){
  70. return true;
  71. }
  72. break;
  73. case 'e-mail':
  74. if(!filter_var($this->value,FILTER_VALIDATE_EMAIL)){
  75. return true;
  76. }
  77. break;
  78. case 'ip':
  79. if(!filter_var($this->value,FILTER_VALIDATE_IP)){
  80. return true;
  81. }
  82. break;
  83. case 'ipv4':
  84. if(!filter_var($this->value,FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)){
  85. return true;
  86. }
  87. break;
  88. case 'ipv6':
  89. if(!filter_var($this->value,FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)){
  90. return true;
  91. }
  92. break;
  93. }
  94. }
  95. }
  96. class regex{
  97. private $value;
  98. private $validators;
  99. public function __construct($value,$validators){
  100. $this->value = $value;
  101. $this->validators = $validators;
  102. }
  103. public function isValid(){
  104. if(!preg_match($this->validators,$this->value)){
  105. $this->errors[$k][$key]=true;
  106. }
  107. }
  108. }
  109.  
  110. $form = array(
  111. 'login'=>'zdzisiek',
  112. 'haslo'=>'zdzisiek1234',
  113. 'email'=>'zdzsiek@email.com',
  114. 'test'=>'lolek','pusty'=>'not_anymore');
  115. $boundaries = array(
  116. 'login'=>array(
  117. 'length'=>'5-15',
  118. 'allowed_characters'=>'abcdefghijklmnoprstuwxyz'
  119. ),
  120. 'haslo'=>array(
  121. 'length'=>'6-16'
  122. ),
  123. 'email'=>array(
  124. 'length'=>'5-40',
  125. 'type'=>'e-mail'
  126. ),
  127. 'test'=>array(
  128. 'length'=>'5-50'
  129. ),
  130. 'pusty'=>array(
  131. 'length'=>'5-50'
  132. )
  133. );
  134.  
  135.  
  136. $validator = new form_validator;
  137. $validator->start($form,$boundaries);
  138. if($validator->validate()){
  139. echo 'WIN ! ';
  140. }
  141. else{
  142. foreach($validator->errors as $key=>$value){
  143. foreach($value as $k=>$v){
  144. //echo 'KEY : '.$key.' . k : '.$k.' value: '.$v;
  145. switch($k){
  146. case 'isset':
  147. echo 'Zapomniałeś wypełnić '.$key;
  148. break;
  149. case 'length':
  150. echo 'Niepoprawna ilość znaków w polu '.$key.' , zalecane '.$boundaries[$key][$k].' znaków.<br />';
  151. break;
  152. case 'allowed_characters':
  153. echo 'Niedozwolone znaki w polu '.$key.'<br />';
  154. break;
  155. case 'type' :
  156. echo 'Niepoprawna wartość w polu '.$key.'<br />';
  157. // można zrobić switch na $boundaries[$key][$k] dla róznych typów.
  158. break;
  159. case 'regex' :
  160. echo 'Niewłaściwe dane w komórce '.$key.'<br />';
  161. break;
  162. }
  163. }
  164. }
  165. echo str_replace(array('login','haslo','email','test'),array('nazwa użytkownika',' hasło ',' adres internetowej skrzynki pocztowej ',' komorka testowa'),ob_get_clean());
  166. }
  167. ?>
(zostawiłem przykładowe dane itd do testowania.)

Ten post edytował nekomata 4.06.2011, 07:28:38
Go to the top of the page
+Quote Post
mat-bi
post 4.06.2011, 07:05:32
Post #4





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


  1. if(!is_array($form))die('Form to validate is not an array.');
  2. $this->form = $form;
  3. if(!is_array($boundaries))die('Validator data is not an array.');


Jak dobrze wiem, klasy powinny wyrzucać wyjątkami, nie die(). Potem, jak wejdę, dokładnie to przejrzę, to mi się tylko rzuciło.

Aha i coś - zrób
  1. public function start(Array $form = array(), Array $boundaries = array())


nie będziesz musiał wyrzucać wyjatków, php się tym zajmie

Ten post edytował mat-bi 4.06.2011, 07:07:12
Go to the top of the page
+Quote Post
nekomata
post 4.06.2011, 07:14:59
Post #5





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


@mat-bi Dzięki za spostrzeżenia , poprawione i zapamiętane biggrin.gif liczę na więcej takich "wytyczeń".
Go to the top of the page
+Quote Post
cer98
post 14.08.2011, 06:51:03
Post #6





Grupa: Zarejestrowani
Postów: 126
Pomógł: 5
Dołączył: 17.07.2011

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


  1. function foo()
  2. {
  3. $numargs = func_num_args();
  4. echo "Number of arguments: $numargs<br />\n";
  5. if ($numargs >= 2) {
  6. echo "Second argument is: " . func_get_arg(1) . "<br />\n";
  7. }
  8. }
  9.  
  10. foo (1, 2, 3);



p.s. a do obsługi błędów nie mógłbyś użyć specjalnej klasy ?

Ten post edytował cer98 14.08.2011, 12:59:04
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 12:36