Php Form Validation Temel Bilgiler(Veri Onaylama)

Öncelikle tüm okurlara merhabalar.  Altuğ arkadaşımın bloguna zaman zaman web programlama üstüne küçük yazılar yazacağım. Yazı yazma konusunda çok tecrübeli değilim , bir hatam  olursa mazur görün(dilbilgim gerçekten kötüdür) . Ayrıca her yazımda kaynak kodlarını da vermeyi düşünüyorum , isteyen istediği şekilde kullanabilir. Umarım faydalı olur ilgilenenler için.

Form Validation nedir?

Türkçe karşılığı onaylama olan validation sunucu ile tarayıcı arasında veri alışverişi olması durumunda ; kullanıcının geçerli tipte veri girip girmediğini kontrol edilmesidir.

Neden gereklidir?

Temel iki sebebi vardır. Birincisi veritabanımızın kabul edeceği tipte değerlerin girildiğinden emin olmak ; ikincisi ise tabiki GÜVENLİK.

İki çeşit form validation uygulanabilir yada ikisi birden de kullanabilir.

İlki Server-side yani sunucu taraflı veri kontrolü -ki bugün bunun üstüne örnekleme yapacağım-
İkincisi ise Client-Side yani kullanıcı taraflı veri kontrolü.

Her iki yöntemin de artıları ve eksileri olmasına rağmen sunucu taraflı kontrol benim görüşüme göre muhakkak kullanılmalıdır.

Sunucu taraflı kontrol de veriler her kontrol edilişte sayfa yenilenir ve sunucu tarafında işlem yapılır. Bu büyük projelerde ekstra işlemci gücü ve ekstra bant genişliği harcanmasına sebep olabilir ama sistem iyi bir şekilde optimize edildiği sürece çok da önemli değildir. Ne de olsa güvenlik herşeyden önce gelir.

Kullanıcı taraflı kontrol de ise javascript kodu yada frameworkler yardımı ile daha veri sunucuya yollanmadan , girilir girilmez kontrol edilir ve sayfanın yenilenmesine gerek kalmadan kullanıcıya hata mesajı döndürülür. Fakat ayrı bir form kullanılarak verinin yollandığı scripte bu tip kontrolleri atlatarak veri yollanabilir ki bu da büyük bir güvenlik sorunudur. Ama bir sonraki yazımda jquery frameworkü kullanılarak kullanıcı taraflı validation ın da nasıl yapıldığını anlatacağım

Başlangıç

Yazılan ve anlatılan kodlar php 5.* , apache 2.2.* ve mysql 5 sistemler üstünde denenmiştir. Temel düzeyde php bilgisi gerektirir.

Örnek olarak veritabanımızda bir kişiler tablosu olduğunu düşünelim ve bu tabloda sırasıyla isim,soyisim,yaş,alfanumerikalan,email sütunları mevcut.

  • isim ; min 2 , maks 7 karakter kabul ediyor.
  • soyisim; sadece karakter kabul ediyor.
  • yaş; sadece rakam kabul ediyor.
  • alfanumerikalan; sadece rakam yada harf kabul ediyor.
  • email;sadece geçerli email adreslerini kabul ediyor.

Form

Öncelikle basit bir form hazırlayalım ;

validation.php  sayfanın aşağısında indirmek için link mevcuttur)

forma validation sınıfını bitirdikten sonra bazı eklemeler yapacağım ama temel olarak verileri girebileceğimiz alanlardan oluşuyor.

Sınıf validation.class.php:

Temel bir örnek olduğu için tüm veri tiplerini kontrol etmeyeceğiz, ama isteyen istediği gibi bu örneği geliştirebilir.

Sırayla sınıfın özelliklerine bakalım.

Öncelikle sınıfımız 3 değişkene sahip.

var $min_char=0;
var $max_char=10;
var $errors=array() ;
  • $min_char; minmum karakter sayısı.
  • $max_char; maksimum karakter sayısı.
  • $errors; hata mesajlarının tutulacağı array.

Başlangıçta karakter sınırlarını belirlemek istersek min ve max değişkenlerini kullanıyoruz.

Minimum ve maksimum karakater kontrolü: is_required()

function is_required($input,$error,$min='',$max='')
{
	if($min=='')
	$min=$this->min_char;
	if($max=='')
	$max=$this->max_char;
	if (!isset($input)||trim($input) == "" ||strlen($input)<$min||strlen($input)>$max)
	$this->errors[]=$error;
   }

Bu fonksiyon diğer fonksiyonlardan farklı olarak iki ekstra değişken daha kabul eder . $min ve $max.

Girilen verinin boş olup olmadığını kontrol ettikten sonra eğer kullanıcı bir karakter sınırlaması getirdiyse onun kontrolü yapılır , kullanıcı bir sınırlama belirtmediyse sınıfın başında tanımladığımız  varsayılan
değerlere göre kontrol yapılır. Karakter sayısının kontrolü için php nin strlen() fonksiyonunu kullandık.Bu fonksiyon bir string in kaç karakter den oluştuğunu döndürür. Kontrol yapıldıktan sonra veri eğer sınırlamalara uymuyorsa hata mesajı $error arrayine eklenir.

Harf Kontrolü: is_char()

function is_char($input,$error)
{
     if (isset($input) && !empty($input) && !preg_match("/^[a-zA-Z]+$/", $input))
     $this->errors[]=$error;
}

Verinin boş olup olmadığı kontrol edildikten sonra php nin preg_match() fonksiyonu kullanılarak girdinin sadece harflerden oluşup oluşmadığını kontrol eder. Bu fonksiyon(preg_match); test edilen string in içinde a dan z ye küçük yada büyük harfler dışında herhangi bir karakter bulunması durumunda false değeri döndürür.False dönmesi durumunda da hata mesajı $errors arrayine eklenir.

Rakam Kontrolü: is_number()

function is_number($input,$error)
{
     if (isset($input) && !is_numeric($input))
     $this->errors[]=$error;
}

Verinin boş olup olmadığı kontrol edildikten sonra php nin is_numeric() fonksiyonu kullanılarak girdinin sadece rakamlardan oluşup oluşmadığını kontrol edilir.

Alfanumerik Kontrolü: is_alphanum()

function is_alphanum($input,$error)
{
     if (isset($input) && !preg_match("/^[a-zA-Z0-9]+$/", $input))
     $this->errors[]=$error;
}

Verinin boş olup olmadığı kontrol edildikten sonra  preg_match() fonksiyonunu kullanarak girdinin  harflerden veya rakamlardan oluşup oluşmadığını kontrol ediyoruz. Test edilen string in içinde a dan z ye, küçük yada büyük harfler ve rakamlar dışında herhangi bir karakter bulunması durumunda  hata mesajı $errors arrayine eklenir.

Email Kontrolü: is_email()

function is_email($input,$error)
{
    $regexp="/.+@.+\..+./";     
    if (!isset($input) || !preg_match($regexp, $input)||!checkdnsrr (array_pop(explode ("@",$input)),"MX"))
    $this->errors[]=$error;
}

Verinin boş olup olmadığı kontrol edildikten sonra  öncelikle preg_match() fonksiyonu kullanarak girdinin  *.@*. formatında olup olmadığını kontrol ediyoruz. Daha sonra php nin checkdnsrr() fonksiyonunu kullanarak “@” işaretinden sonra gelen domain adresinin gerçekten varolup olmadığını test ediyoruz. Böylece sahte bir adres girilme olasılığını düşürüyoruz. Yalnız bir uyarıda bulunayım bu fonksiyon windows sunucular üstünde çalışmaz ,linux yada unix türevi sunucularda çalışır.

Hata Kontrolü: check_errors()

  function check_errors()
   {
        if(count($this->errors)>0){
            return true;
        }
        return false;
    }

Yapılan kontroller de hata mevcutsa , hatayı $errors arrayimize kaydediyorduk. Bu fonksiyonda arrayin büyüklüğünü sayarak hata olup olmadığını bildiriyor ; bu şekilde formu doldurduktan sonra hata mesajlarını yazdırabileceğiz.

Girdi Kontrolü: check_fields()

   function check_fields($input,$control_items)
   {
		for($i=0;$i<count($control_items);$i++) {
		$types=explode(",",$control_items[$i]);
			switch($types[0])
			{
				case "required":
					if(count($types)>3)
						$this->is_required($input[$types[1]],$types[4],$types[2],$types[3]);
					else 
						$this->is_required($input[$types[1]],$types[2]);
				break;		
 
 
 
				case "char":
					$this->is_char($input[$types[1]],$types[2]);
				break;	
				case "num":
					$this->is_number($input[$types[1]],$types[2]);
				break;	
				case "alphanum":
					$this->is_alphanum($input[$types[1]],$types[2]);
				break;	
				case "mail":
					$this->is_email($input[$types[1]],$types[2]);
				break;
			}
		}
   }

Yazdığımız tüm fonksiyonları burada kullanıyoruz. Öncelikle form dan gelen bütün $_POST değerlerini ve belirttiğimiz hata mesajlarını sırasıyla $input ve $control_items değişkenleri ile alıyoruz . Örnek olarak email alanımızı kontrol edeceksek formda şöyle bir satır bulunması gerekiyor; Form bölümüne eklenecek satırları sınıfı anlatmayi bitirince yazacağım ama şimdilik bu fonksiyonu anlatırken böyle bir satır olduğunu düşünelim.

$controls[]=”mail,email,Lütfen geçerli bir email adresi giriniz.”;

$controls arrayine bir string girdik bu arrayide post datalarımızla beraber fonksiyonumuza giriyoruz.

String 3 virgül ile ayrılmış halde.

İlk kelime, alanımızın tipini belirtiyor. “mail” ; fonksiyonumuzda burada mail kontrolü yapacağını anlayarak is_mail() fonksiyonunu çağırıyor .

ikinci kelime form alanımıza verdiğimiz isim. Bu isim kullanılarak post arrayinden bu alanın verisini alıyoruz.

üçüncü kelime ise hata mesajımız. Eğer kontrolü geçemezse $errors arrayimize eklediğimiz mesaj.

Özetle check_fields() fonksiyonumuz post değerlerini ve kontrol kurallarını aldı bir for döngüsüne girip (formda kaç tane kural belirttiysek o kadar) kontrol kurallarımızı virgüllerinden parçaladı.İlk kelimeyi kullanarak kontrolün tipini belirledi ikinci ve üçüncü kelimeler  ile uygun kontrol fonksiyonunu çağırıp hata varsa hata arrayimize ekledi.

Hata Yazdırma: paste_errors()

function paste_errors()
{
        $error_out='<span>';
        foreach($this->errors as $err){
            $error_out.=$err.'<br>';
        }
        $error_out.='</span>';
        echo $error_out;
}

Yapılan kontroller de hata mevcutsa , hataları alt alta ekrana basmamızı sağlar.

Böylece sınıfın bütün fonksiyonlarını bitirmiş olduk. Şimdi formumuza gereken eklemeleri yapıp kontrollerimiz yapalım.

Form Eklemeleri

<? 
include "validation.class.php" ;
$val = new validation();
 
 
$controls=array();
$controls[]="required,gerekli,2,7,İsim alanı minimum 2 maximum 7 karakter olabilir.";
$controls[]="char,karakter,Soyİsim alanına sadece harf girilebilir.";
$controls[]="num,rakam,Yaş alanına sadece rakam girilebilir.";
$controls[]="alphanum,alfanumerik,Deneme alanına sadece sayı yada harf girebilirsiniz.";
$controls[]="mail,email,Lütfen geçerli bir email adresi giriniz.";
 
if($_POST) {
$val->check_fields($_POST,$controls);
 
}
 
 
?>

Sınıfı çağırdıktan sonra $val = new validation() diyerek objemizi yaratıyoruz. Daha sonra bir kontrol arrayi tanımlayıp kuralları bu arraye ekliyoruz.

örn:$controlarray[]=”kontrol_tipi,kontrol_alanı(field),hata_mesajı”

daha sonra form  sunucuya gönderilmiş ise check_fields($_POST,$controlarray); fonksiyonunu çağırıyoruz.Bu aşamada bütün alanlarımız kontrol edilmiş durumda , hata mesajlarımızı görüntülemek için ise formumuzda bulunan istediğimiz bir yere  bu kodları ekliyoruz;

<? if($val->check_errors()) { 
   {
	$val->paste_errors();
 
	}
 ?>

check_errors() ile hata mesajı olup olmadığını test ettikten sonra eğer hata varsa paste_errors() fonksiyonu ile ekrana basıyoruz.

Böylelikte uygulamamız tamamlanmış oluyor. Diğer tipler için eklemeler yapılabilir tabi sonu yok ne de olsa. Demo ve kaynak dosyaları için aşağıdaki linkleri kullanabilirsiniz. Umarım bu yazı bir şekilde işinize yarar kötü anlatım ve kötü kodlama dan birşeyler anlayabilirseniz tabi

Kodlarda bazı eksiklikler satır ufak kod yanlışları olmaması için demo görüntüsünün aynısı olan Kaynak dosyayı indirip üzerind değişiklikler yapmanızı tavsiye ederim.

Similar Posts