Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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

Posty w temacie


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: 3.06.2024 - 23:56