Yazdır 24 Ocak 2011 Pazartesi (Hit: 61618)

Kayıt Ekleme (PHP)

Bu yazımızda formlardan gelen bilgilerin veritabanına nasıl kaydedileceğini anlatacağız. Her zamanki gibi örneklerimizda baglan.php isimli sayfayı include ederek veritabanı bağlantısını yapıp okul isimli veritabanındaki tablolara kayıt girmeye çalışacağız. Konunun anlaşılması için örneklermizi en sade şekliyle yazmaya çalışacağız.

<?php
// bu sayfa baglan.php sayfasıdır.
$sunucu="localhost";
$kullanici="root";
$sifre="1234";
$veritabani="okul";

if (@!mysql_connect($sunucu, $kullanici, $sifre)){
   $mesaj="Veritabanı bağlantısı yapılamadı!<br>";
   $mesaj.="Hata açıklaması: ".mysql_error();
   die($mesaj);
}

if(@!mysql_select_db($veritabani)){
   $mesaj="$veritabani veritabanı seçilemedi!<br>";
   $mesaj.="Hata açıklaması: ".mysql_error();
   die($mesaj);
}
?>

 

Örnek: Okul isimli veritabanındaki dersler(ders_kodu  varchar(5), ders_adi varchar(30))  tablosuna yeni bir ders ekleyelim.

<!-- bu sayfa index.php sayfasıdır. -->
<html>
   <head>
      <title>Ders Kayıt</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
      <h3>Yeni Ders Kaydı</h3>
      <form name="derskayit" method="post" action="derskayit.php">
      <table border="0" cellspacing="2" cellpadding="2">
         <tr><td>Ders Kodu:</td><td><input type="text" name="derskodu"></td></tr>
         <tr><td>Ders Adı:</td><td><input type="text" name="dersadi"></td></tr>
         <tr><td>&nbsp;</td><td><input type="submit" name="submit" value="Kaydet"></td></tr>
      </table>
      </form>
   </body>
</html>

 

<!-- bu sayfa derskayit.php sayfasıdır. -->
<html>
   <head>
      <title>Ders Kayıt</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
   <?php
   $derskodu=$_POST["derskodu"];
   $dersadi=$_POST["dersadi"];
   include("baglan.php");
   mysql_query("insert into dersler (ders_kodu, ders_adi) values ('$derskodu','$dersadi')");
   echo "<u><b>Yeni ders başarı ile kaydedilmiştir.</b></u><br>";
   echo "<b>Ders Kodu:</b> $derskodu<br><b>Ders Adı:</b> $dersadi";
   ?>
    </body>
</html>

Buradaki ilk sayfamız index.php sayfasıdır. Bu sayfada form elemanları vardır. Kaydedilecek bilgiler bu sayfadan gönderiliyor. İkinci sayfamız ise derskayit.php sayfasıdır. Bu sayfada ise post edilen bilgiler alınıp veritabanına kaydediliyor.

Kayıt işlemini yapan derskayit.php sayfası en düz mantıkla yazılmıştır. Yani her şeyin yolunda gittiği ve hataya sebep olabilecek hiç bir durumun olmadığı varsayılmıştır. Ancak gerçek uygulamalarda hataya sebep olabilecek bir çok durum söz konusudur. Örneğin ders_kodu birincil anahtardır. Bu alana aynı değer iki kere girilirse hata verecektir ve kayıt işlemi yapılmayacaktır. Ama bizim yazdığımız koda baktığınızda her halükarda Yeni ders başarı ile kaydedilmiştir mesajı yazılacaktır. Dolayısıyla bir hata söz konusudur. Yada, formlara bilgi girilmeden post edilmesi, formlardan istenmeyen formatta bilgilerin post edilmesi, SQL injection dediğimiz ve bizim SQL kodumuza sızacak kodların gönderilmesi veyahut doğrudan derskayit.php sayfasının çağrılmak istenmesi gibi hataya sebep olabilecek bir çok durum söz konusudur.

Şimdi derskayit.php sayfamızı biraz daha iyileştirelim ve biraz da olsa bu olumsuz durumların önüne geçmeye çalışalım. Şunu da söyleyelim bu örneklerimizde amacımız temel seviyede kayıt eklemeyi anlatmaktır. Dolayısıyla form güvenliği, veritabanı güvenliği ve SQL injection konularına ayrıca bakmanızı tavsiye ederiz.

<!-- bu sayfa derskayit.php sayfasıdır. -->
<html>
   <head>
      <title>Ders Kayıt</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
   <?php
   if ($_POST){ // eğer post olayı varsa
      $derskodu=$_POST["derskodu"];
      $dersadi=$_POST["dersadi"];
      include("baglan.php");
      if (mysql_query("insert into dersler (ders_kodu, ders_adi) values ('$derskodu','$dersadi')")){
         echo "<u><b>Yeni ders başarı ile kaydedilmiştir.</b></u><br>";
         echo "<b>Ders Kodu:</b> $derskodu<br><b>Ders Adı:</b> $dersadi";
      }
      else{
         echo "<b>Hata:</b> ",mysql_error();
      }
   }
   ?>
   </body>
</html>

Bu yeni kodlarımızda if ($_POST) komutu ile post olayı varsa kayıt yap diyoruz.
if (mysql_query(...)) komutu ile de; sorgu çalışırsa yani kayıt ekleme başarılı ise, demiş oluyoruz ki buna göre ekrana ilgili mesajı yazdırıyoruz.

 

Örnek: Okul isimli veritabanındaki ogrenciler(ogrenci_no smallint, adi varchar(20), soyadi varchar(20), cinsiyeti char(1), sinif_kodu varchar(10)) tablosuna yeni bir öğrenci ekleyelim.

<!-- bu sayfa index.php sayfasıdır. -->
<html>
   <head>
      <title>Öğrenci Kayıt</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
      <h3>Yeni Öğrenci Kaydı</h3>
      <form name="ogrencikayit" method="post" action="ogrencikayit.php">
      <table border="0" cellspacing="2" cellpadding="2">
         <tr><td>Öğrenci No:</td><td><input type="text" name="ogrencino"></td></tr>
         <tr><td>Adı:</td><td><input type="text" name="adi"></td></tr>
         <tr><td>Soyadi:</td><td><input type="text" name="soyadi"></td></tr>
         <tr>
            <td>Cinsiyeti:</td>
            <td>
               <input type="radio" name="cinsiyeti" value="e" checked>Bay 
               <input type="radio" name="cinsiyeti" value="k">Bayan
            </td>
         </tr>
         <tr>
            <td>Sınıfı:</td>
            <td>
               <?php
               include("baglan.php");
               mysql_query("set names utf8");
               $sonuc=mysql_query("select * from siniflar order by sinif_kodu");
               echo "<select name=\"sinifkodu\">";
               while($kayit=mysql_fetch_array($sonuc)){
                  echo "<option value=\"",$kayit["sinif_kodu"],"\">";
                  echo $kayit["sinif_adi"];
                  echo "</option>";
               }
               echo "</select>";
               ?>
	    </td>
	 </tr>
	 <tr><td>&nbsp;</td><td><input type="submit" name="submit" value="Kaydet"></td></tr>
      </table>
      </form>
   </body>
</html>

 

Dikkat ederseniz sınıflar, veritabanından okunup açılır listeye ekleniyor. Dolayısıyla öğrencinin varolmayan bir sınıfa kaydı engelleniyor. Şuna da dikkat ediniz: Veritabanına sınıf kodu kaydedileceği için her seçenek (option) için value kısmına sınıf kodu atanıyor.
Unutmayınız; post olayında formların sadece value değerleri gider !

<!-- bu sayfa ogrencikayit.php sayfasıdır. -->
<html>
   <head>
      <title>Öğrenci Kayıt</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   </head>
   <body>
   <?php
   if ($_POST){ // eğer post olayı varsa
      $ogrencino=(int)$_POST["ogrencino"];
      $adi=$_POST["adi"];
      $soyadi=$_POST["soyadi"];
      $cinsiyeti=$_POST["cinsiyeti"];
      $sinifkodu=$_POST["sinifkodu"];
      include("baglan.php");
      if (mysql_query("insert into ogrenciler (ogrenci_no, adi, soyadi, cinsiyeti, sinif_kodu) values ($ogrencino, '$adi', '$soyadi', '$cinsiyeti', '$sinifkodu')")){
         echo "<u><b>Yeni öğrenci başarı ile kaydedilmiştir.</b></u><br>";
         echo "<b>Öğrenci No:</b> $ogrencino<br><b>Adı:</b> $adi<br><b>Soyadı:</b> $soyadi<br>";
         echo "<b>Cinsiyeti:</b> $cinsiyeti<br><b>Sınıf Kodu:</b> $sinifkodu";
      }
      else{
         echo "<b>Hata:</b> ",mysql_error();
      }
		
   }
   ?>
   </body>
</html>

 

Kaydedilen öğrencinin numarası integer bir değer olduğundan, alınırken önüne (int) ifadesini yazarak aslında bir güvenlik önlemi almış oluyoruz. Bu sayede gelen değer integer türüne dönüştürülüyor. Ayrıca SQL komutuna dikkat ederseniz $ogrencino tırnak içine alınmamıştır. values ($ogrencino, '$adi', .......)

SQL sorgusunda yani insert into yapısında, veritabanındaki alan adları ne ise o kullanılır. Bizim oluşturduğumuz değişkenlerin adları tamamen keyfidir. Bu ikisi birbirinden ayrıdır. Yani alan adı ogrenci_no iken bu alana yazılacak değer $ogrencino değişkenidir ve $ogrencino değişkeni, adını tamamen bizim belirlediğimiz bir değişkendir. Aynı şekilde diğer değişkenleri de biz adlandırdık. Bunlara sizler kendi seçtiğiniz adları verebilirsiniz. Ancak diğer taraftan alan adlarını ise veritabanına göre yazmalısınız.


Bu site meslek liselerinde bilişim bölümü web programcılığı dalında okutulan internet programcılığı dersine yardımcı olması için tasarlanmıştır. İletişim için iletisim@phpdefteri.com
Apache PHP MySQL PhpMyAdmin EasyPHP Xampp AppServ Wamp W3School

www.phpdefteri.com © 2010