PHP Dersleri

PHP ile Aynı Veri Eklemeyi Engelleme

PHP Programlama dili ile gerçekleştirilen işlemlerden en çok sorun yaşanan INSERT (kayıt) kısmıdır. Yapılan hatalardan dolayı yada kontrol mekanizması eksikliğinden dolayı aynı veri defalarca eklenebilir duruma gelmektedir. Aynı verinin sürekli kayıt edilmesi bir çok yolla olabilir. Bunları inceleyerek sorunun nerede olduğunu tesbit edelim.

Form ve PHP Kodlarının Aynı Sayfada Olması

Artık böyle kodlama tarzının kalmadığını düşünüyorum. Fakat PHP Programlama diline yeni başlayanların yaptığı bir hata olarak gördüğümden ilk bu duruma deyinmek istedim. Aynı sayfada yapılan işlemlerde form üzerinden gelen bilgiler sıfırlanmadığı için ard arda gönder butonuna basılması hatta ve hatta sayfanın yenilenmesiyle bile aynı verinin defalarca kayıt edilmesiyle karşılaşabilirsiniz. Bu durumu çözmek için bir çok yöntem kullanılabilinir.

Verileri Sayarak Aynı Kaydı Engelleme

Tek bir sayfada Form ve PHP kodlarının bulunmasından dolayı kaynaklanan aynı verinin kaydını engellemek için, eklenmek istenen değerlerin önceden kayıtlı olup olmadığına bakmak gerekir. Eğer veri daha önce kayıt edilmişse tekrar kayıt etmenin anlamı yoktur.

<form action="" method="POST">
   <label style="display:block">İsim Soyisim</label>
   <input style="display:block" type="text" name="isim">

   <label style="display:block">Şehir</label>
   <input style="display:block" type="text" name="sehir">

   <button style="margin-top:10px">Kaydet</button> <br>
</form>

Yukarıda yer alan HTML form örneği, tek sayfalık işlemler yapılmak üzere hazırlanmıştır. Action kısmının boş olması, burada yer alan verilerin aynı sayfaya gönderileceğini göstermektedir.

<?php
if($_POST){
   ## Veritabanı bağlantısı
   try{
      $db = new PDO("mysql:host=localhost;dbname=php_dersleri;", "root","");
   }catch(PDOException $a){
      echo $a->getMessage();
   }
   ## aynı veri var mı kontrol sorgusu
   $kontrol = $db->query("SELECT * FROM uyeler WHERE adi='{$_POST["isim"]}' AND sehir='{$_POST["sehir"]}'");
   ## kontrol için koşul belirttik.
   if( $kontrol->rowCount() == "0" ){
      $db->query("INSERT INTO uyeler SET adi='{$_POST["isim"]}', sehir='{$_POST["sehir"]}'");
   }else{
      echo "Daha önce eklenmiş.";
   }
}
?>

Yukarıda yer alan kodları HTML ile oluşturulan Form bölümünün altına eklendiğinde, formdan gönderilen değerler kayıt edilecektir. Ekleme işlemi yapılırken $kontrol değişkeni ile eklenecek olan veri kontrol edilecektir. Bundan dolayı da sayfanın yenilenmesi yada butonun birden fazla basılmas durumunda kontrol değişkeni çalışacak ve aynı değerlerin ikinci kez eklenmesini engelleyecektir.

NOT: Örnek olduğu için filtreleme konusunda pek özenmedim. Boşluk ve diğer kontrolleri yapmadan veriyi kayıt etmeyiniz!!!

Yönlendirme İle Aynı Kaydın Oluşmasını Engelleme

Yine aynı şekilde aynı sayfada kayıt işlemini gerçekleştirdiğinizde, kayıt sonrasına header() fonksiyonunu kullanarak yönlendirme yapabilirsiniz. Böylelikle sayfa yönlendirmesiyle birlikte form temizlenecek aynı zamanda post değerleri sıfırlanacaktır. Bu işlemi yaparken aynı zamanda veri var mı yok mu diye kontrolde yapabilirsiniz. Böylelikle çifte güvenlik sağlamış olursunuz.

// kayıt işlemi
$db->query();
// Kayıt sonrası yönlendirme
header("Location: index.php");

Form’un Farklı, Kayıt Alanının Farklı Olması Durumunda

Bu kullanım en temiz ve güvenli bir yöntemdir. Fakat bu yöntemde bile aynı verinin tekrar tekrar kayıt edilmesi gibi durumlarla karşılaşılabilinir. Bu durumu aşağıdaki başlıklar doğrultusunda çözebilirsiniz.

Kayıt Sonrası Yönlendirilmenin Yapılmaması

Farklı dosyalarda kayıt işlemi yapıldığında kayıt işlemi için farklı bir sayfaya gidildiğinde kullanıcıyı geri geldiği sayfaya yönlendirmezseniz, aynı verinin tekrar tekrar kayıt edilmesi kaçınılmazdır. Bu sonun çözümü için kayıt sayfasına giden kullanıcının tekrar aynı sayfaya yönlendirilmesi sağlanmalıdır.

Yönlendirme işlemini; “Kullanıcı kayıt olup olmadığı uyarısını görsün diye” yapmıyorum diyenleriniz olabilir. Bunun içinde yönlendirme işlemini yaparken GET parametresi göndererek sorunu çözebilirsiniz.

<form action="kayit.php" method="POST">
   <label style="display:block">İsim Soyisim</label>
   <input style="display:block" type="text" name="isim">

   <label style="display:block">Şehir</label>
   <input style="display:block" type="text" name="sehir">

   <button style="margin-top:10px">Kaydet</button> <br>
</form>

Yukarıda yer alan formdaki veriler kayit.php  sayfasına gönderilecektir. Şimdi de bu kayıt sayfasını nasıl düzenlemek gerektiğinden bahsedeyim.

// kayıt işlemi
$kayit = $db->query();
İf( $kayit ){
   // kayıt başarılı ise
   header("Location: index.php?sonuc=1");
}else{
   // kayıt hatalı ise
   header("Location: index.php?sonuc=0");
}
// Kayıt sonrası yönlendirme

Yukarıdaki örnekte $kayit değişkeni ile kayıt işlemleri yürütülmektedir. Kayıt işlemi başarılı ise GET parametresi ile index.php sayfasına sonuc değeri 1 olan veri gönderilecektir. Sonuç başarısız ise index.php sayfasına sonuc değeri 0 olan veri gönderilecektir. Gönderilen bu verileri de HTML formunun hemen altına ekleyerek uyarıları ilk sayfada gösterebilirsiniz. GET parametresinde ki değerin değiştirilmesi yada silinmesi hiçbir açığa yol açmayacağı için güvenle kullanabilirsiniz.

<?php
   if( isset($_GET["sonuc"]) ){
      if( $_GET["sonuc"] == "1" ){
         echo "Kayıt Başarılı";
      }else{
         echo "Kayıt Yapılamadı. Aynı veriyi ekleyemezsin.";
      }
   }
?>

Yukarıda yer alan kodları FORM etiketinden sonra eklemeniz durumunda, kayıt sayfasından dönen değere göre kullanıcılara işlemle ilgili bilgi sunabilirsiniz.

Verileri Sayarak Aynı Kaydı Engelleme

Bir diğer yöntem ise kayıt sayfasında verilerin sayılmasıyla ilgilidir. Bunu da üst başlıkta bahsettiğim için uzunca yazmıyorum. Oradaki işlemleri aynen gerçekleştirerek önlem alabilirsiniz.

Daha Fazla Göster

İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Kapalı