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 :
<?php
class form_validator{
private $form;
private $boundaries;
public $errors = array(); public function load_form($form){
if(!is_array($form))die('Form to validate is not an array.'); $this->form = $form;
}
public function boundaries($boundaries){
if(!is_array($boundaries))die('Validator data is not an array.'); $this->boundaries = $boundaries;
}
public function validate(){
foreach($this->boundaries as $k => $v){
if(isset($this->form[$k])){ foreach($v as $key=>$value){
switch($key){
case 'length':
if(strlen($this->form[$k])<$lengths[0
]||strlen
($this->form[$k])>$lengths[1
]){ $this->errors[$k][$key]=true;
}
break;
case 'allowed_characters':
$value = str_replace(array('\\','[',']','^','$','.','|','?','*','+','(',')'),array('\\\\','\[','\]','\^','\$','\.','\|','\?','\*','\+','\(','\)'),$value); if(!preg_match('#^['.$value.']{1,}$#',$this->form[$k])){ $this->errors[$k][$key]=true;
}
break;
case 'type':
switch($value){
case 'numbers':
$this->errors[$k][$key]=true;
}
break;
case 'e-mail':
if(!filter_var($this->form[$k],FILTER_VALIDATE_EMAIL)){
$this->errors[$k][$key]=true;
}
break;
case 'ip':
if(!filter_var($this->form[$k],FILTER_VALIDATE_IP)){
$this->errors[$k][$key]=true;
}
break;
case 'ipv4':
if(!filter_var($this->form[$k],FILTER_VALIDATE_IP,FILTER_FLAG_IPV4)){
$this->errors[$k][$key]=true;
}
break;
case 'ipv6':
if(!filter_var($this->form[$k],FILTER_VALIDATE_IP,FILTER_FLAG_IPV6)){
$this->errors[$k][$key]=true;
}
break;
}
break;
case 'regex':
if($value[0
]!==$value[strlen($value)-1
]){$value = '#'.$value.'#';} $this->errors[$k][$key]=true;
}
break;
}
}
}
else{
$this->errors[$k]['isset']=true;
}
}
if(empty($this->errors)){ return true;
}
else{
return false;
}
}
}
?>
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
'login'=>'zdzisiek',
'haslo'=>'zdzisiek1234',
'email'=>'zdzsiek@email.com',
'test'=>'lolek');
'login'=>array(
'length'=>'3-5',
'allowed_characters'=>'abcdefghijklmnoprstuwxy'
),
'haslo'=>array(
'length'=>'6-16'
),
'email'=>array(
'length'=>'5-40',
'type'=>'e-mail'
),
'test'=>array(
'regex'=>'^[abcdes]{1,}$'
),
'pusty'=>array(
'type'=>'ip'
)
);
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
, 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 :
<?php // Po załadowaniu klasy i powyższych ograniczeń :
$validator = new form_validator;
$validator->load_form($form);
$validator->boundaries($boundaries);
if($validator->validate()){
//Tutaj dodajemy do bazy czy co tam chcemy , operujemy na normalnych zmiennych
//Klasa zwraca true tylko w wypadku bezbłędnego formularzu }
else{
foreach($validator->errors as $key=>$value){
foreach($value as $k=>$v){
switch($k){
case 'isset':
echo 'Zapomniałeś wypełnić '.$key; break;
case 'length':
echo 'Niepoprawna ilość znaków w polu '.$key.' , zalecane '.$boundaries[$key][$k].' znaków.<br />'; break;
case 'allowed_characters':
echo 'Niedozwolone znaki w polu '.$key.'<br />'; break;
case 'type' :
echo 'Niepoprawna wartość w polu '.$key.'<br />'; // można zrobić switch na $boundaries[$key][$k] dla róznych typów.
break;
case 'regex' :
echo 'Niewłaściwe dane w komórce '.$key.'<br />'; break;
}
}
}
}
?>
Jak już pisałem dwa razy jest to moja pierwsza klasa więc :
A ) Krytykujcie
B ) Sugerujcie
C ) Doradzajcie
(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
)
Ten post edytował nekomata 2.06.2011, 15:48:54