Yazdır 16 Mart 2011 Çarşamba (Hit: 88189)

Kayıt Ekleme 3 (Üye Kayıt)

Farklı türlerdeki alanlara veri girişini anlatacağımız bu yazımızda envai isimli veritabanındaki uyeler isimli tabloyu kullanacağız. Bu veritabanını yükleyerek örnekleri sizler de deneyebilirsiniz, üzerinde değişiklikler yapabilirsiniz.

CREATE TABLE uyeler (
	id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
	adisoyadi varchar(30) NOT NULL,
	kullaniciadi varchar(15) NOT NULL,
	email varchar(30) NOT NULL,
	emailigizle char(1) DEFAULT '0',
	sifre varchar(50) NOT NULL,
	cinsiyeti char(1) DEFAULT NULL,
	dogumtarihi date DEFAULT NULL,
	uyeliktarihi date DEFAULT NULL,
	songiristarihi date DEFAULT NULL
) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI ENGINE=MYISAM;

Örneklerimizde mümkün olduğunca farklı form elemanları kullanmaya gayret ederek sizlere konuyu daha iyi anlatmaya çalıştık. Ayrıca temel güvenlik önlemlerinden de bahsettik.

Veritabanı bağlantısını baglan.php sayfasıyla yapacağız. Bu sayfayı örneklerimizde include edip kullanacağız.

<?php
// bu sayfa baglan.php sayfasıdır.
$host="localhost";
$user="root";
$password="123";
$db="envai";
 
if(@!mysql_connect($host, $user, $password)){
   $mesaj="Veritabanı bağlantısı yapılamadı!<br>";
   $mesaj.="Hata açıklaması: ".mysql_error();
   die($mesaj);
}
 
if(@!mysql_select_db($db)){
   $mesaj="$veritabani veritabanı seçilemedi!<br>";
   $mesaj.="Hata açıklaması: ".mysql_error();
   die($mesaj);
}
?>

 

Örnek: Veritabanındaki uyeler tablosuna yeni üye kaydı için bir form yapısı oluşturarak kaydı gerçekleştirmeye çalışalım. Kayıt işlemiyle ilgili aşağıdaki işlemler yapılacaktır.

  • Kayıt uyeol.php sayfasında yapılacaktır.
  • POST ile formdan gelen bilgiler SQL injection saldırını engellemek için temizlenecektir.
  • Seçilen kullanıcı adının veritabanında olup olmadığı kontrol edilecektir.
  • Gelen şifrelerin eşitliği kontrol edilecektir.
  • Şifre şifrelenerek veritabanına kaydedilecektir.

Üyelik sayfasına giden link (Üye ol) index.php sayfasındadır.

Üye ol

<!--bu sayfa index.php sayfasıdır-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ana Sayfa</title>
<style>
body{
	margin:10px;
}
#uyeol{
	border:#FF5FAA thin solid;
	background-color:#FFDFFF;
	font-family:Tahoma, Geneva, sans-serif;
	font-weight:bold;
	padding:5px;
	text-decoration:none;
}
</style>
</head>

<body>
<a href="uyeol.php" id="uyeol">Üye Ol</a>
</body>
</html>

Üye kaydı uyeol.php sayfasındaki formdan yapılacaktır. Form aynı sayfaya yani kendine post edilecektir. Kayıt işlemi aynı sayfada yapılacaktır. (action="uyeol.php")

Üyelik Formu

<!--bu sayfa uyeol.php sayfasıdır-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Üye Kayıt</title>
<style>
.sutun1{
	text-align:right;
	background-color:#D4FFAA;
	padding-right:3px;
}

.sutun2{
	background-color:#FFC;
	padding-left:3px;
}
table{
	border:#999 thin solid;
}
</style>
</head>

<body>
<?php
function temizle($veri){
	$veri=trim($veri);
	$veri=stripslashes($veri);
	$veri=mysql_real_escape_string($veri);
	return $veri;
}

function bosmu($dizi){
	foreach($dizi as $deger){
		if($deger==false) // değer boş ise false olumsuz cevabını gönder
			return false;
	}
	return true; // bu kısma geldi ise boş değer yoktur. true olumlu cevabını gönder
}

function uyevarmi($kullaniciadi){
	$sonuc=mysql_query("select * from uyeler where kullaniciadi='$kullaniciadi'");
	$kayit=mysql_fetch_array($sonuc);
	if($kayit) // kayit var ise var anlamında true gönder
		return true;
	else // kayıt yok ise yok anlamında false gönder
		return false;
}

if($_POST){ // POST olayı varsa
	require_once("baglan.php"); // veritabanına bağlan
	mysql_query("set names utf8");

//----------------POST ile gelen değerleri al----------------------
	$adisoyadi=temizle($_POST["adisoyadi"]);
	$kullaniciadi=temizle($_POST["kullaniciadi"]);
	$email=temizle($_POST["email"]);
	if(isset($_POST["emailigizle"])==false)
		$emailigizle="h";
	else
		$emailigizle=temizle($_POST["emailigizle"]);
	$sifre=$_POST["sifre"];
	$tekrarsifre=$_POST["tekrarsifre"];
	$cinsiyeti=temizle($_POST["cinsiyeti"]);
	$gun=(int)$_POST["gun"];
	$ay=(int)$_POST["ay"];
	$yil=(int)$_POST["yil"];
	$dogumtarihi=date("Y-m-d",mktime(0,0,0,$ay,$gun,$yil));
	$uyeliktarihi=date("Y-m-d");
	$songiristarihi=date("Y-m-d");
//--------------------------------------------------------------------------	
	$durum=true; // olumsuz bir durum olup olmadığı bu değişken ile kontrol edilecek
	$mesaj="";
	
	// bosmu fonksiyonuna, boş olmasını istemediğimiz değerleri bir dizi olarak gönderiyoruz
	if(bosmu(array($adisoyadi,$kullaniciadi,$email,$sifre,$tekrarsifre,$gun,$ay,$yil))==false){
		$durum=false;
		$mesaj.="Lütfen gerekli alanları boş bırakmayınız!<br>";
	}
	if($durum==true and uyevarmi($kullaniciadi)){ // kullanıcı kayıtlı mı?
		$durum=false;
		$mesaj.="Yazdığınız kullanıcı adı kullanılıyor! Lütfen başka bir kullanıcı adı yazınız.<br>";
	}
	if($durum==true and $sifre!=$tekrarsifre){ // şifreler farklı mı?
		$durum=false;
		$mesaj.="Yazdığınız şifreler farklı! Lütfen tekrar giriniz.";
	}
	if($durum==true){ // herşey olumlu ise kayıt işlemine geç
		$sifrelisifre=sha1($sifre);
		$sql="insert into uyeler(adisoyadi, kullaniciadi, email, emailigizle, sifre, cinsiyeti, dogumtarihi, uyeliktarihi, songiristarihi)";
		$sql.="values ('$adisoyadi', '$kullaniciadi', '$email', '$emailigizle', '$sifrelisifre', '$cinsiyeti', '$dogumtarihi', '$uyeliktarihi', '$songiristarihi')";
		if (mysql_query($sql)){
         $mesaj="<b>Kaydınız başarı ile yapılmıştır.</b><br><a href=\"index.php\">Ana Sayfa</a>";
      }
      else{ // kayıt işlemi yapılamazsa
		 $durum=false;
         $mesaj="<b>Hata:</b> ".mysql_error();
      }	
	}
	
}
else{ // POST olayı yoksa sayfa ilk kez açılıyorsa
//-------------ilk değerler atanıyor---------------------------------------
	$adisoyadi="";
	$kullaniciadi="";
	$email="";
	$emailigizle="h";
	$sifre="";
	$tekrarsifre="";
	$cinsiyeti="e";
	$gun=0;
	$ay=0;
	$yil=0;
	$durum=false;
	$mesaj="";
}

// tüm form yapısı bu if içerisindedir. 
// durum false ise yani kayıt işlemi yapılmadı ise formu tekrar göstermek için
if($durum==false){
?>
<form name="form1" method="post" action="uyeol.php">
<table border="0" cellspacing="0" cellpadding="2">
  <tr>
    <td class="sutun1">Adı Soyadı:</td>
    <td class="sutun2">
      <input name="adisoyadi" type="text" size="35" maxlength="30" value="<?php echo $adisoyadi; ?>" />*</td>
  </tr>
  <tr>
    <td class="sutun1">Kullanıcı Adı:</td>
    <td class="sutun2"><input type="text" name="kullaniciadi" maxlength="15" value="<?php echo $kullaniciadi; ?>" />*</td>
  </tr>
  <tr>
    <td class="sutun1">E-mail:</td>
    <td class="sutun2"><input name="email" type="text" size="35" maxlength="30" value="<?php echo $email; ?>" />*</td>
  </tr>
  <tr>
    <td class="sutun1">E-maili Gizle:</td>
    <td class="sutun2"><input type="checkbox" name="emailigizle" value="h" <?php echo ($emailigizle=="e")?"checked":""?> /></td>
  </tr>
  <tr>
    <td class="sutun1">Şifre:</td>
    <td class="sutun2"><input type="password" name="sifre" value="<?php echo $sifre; ?>" />*</td>
  </tr>
  <tr>
    <td class="sutun1">Tekrar Şifre:</td>
    <td class="sutun2"><input type="password" name="tekrarsifre" value="<?php echo $tekrarsifre; ?>" />*</td>
  </tr>
  <tr>
    <td class="sutun1">Cinsiyeti:</td>
    <td class="sutun2">
    	<input type="radio" name="cinsiyeti" value="e" <?php echo ($cinsiyeti=="e")?"checked":""?> />Erkek 
        <input type="radio" name="cinsiyeti" value="k" <?php echo ($cinsiyeti=="k")?"checked":""?> />Kadın
    </td>
  </tr>
  <tr>
    <td class="sutun1">Doğum Tarihi:</td>
    <td class="sutun2">
    <?php
    echo "<select name=\"gun\">";
	echo "<option value=\"0\">Gün</option>";
	for($i=1;$i<=31;$i++)
		echo "<option value=\"$i\"".(($gun==$i)?" selected":"").">$i</option>";
	echo "</select> ";
	
	echo "<select name=\"ay\">";
	echo "<option value=\"0\">Ay</option>";
	for($i=1;$i<=12;$i++)
		echo "<option value=\"$i\"".(($ay==$i)?" selected":"").">$i</option>";
	echo "</select> ";

    echo "<select name=\"yil\">";
	echo "<option value=\"0\">Yıl</option>";
	for($i=date("Y")-70;$i<=date("Y")-10;$i++)
		echo "<option value=\"$i\"".(($yil==$i)?" selected":"").">$i</option>";
	echo "</select>";
    ?>*
    </td>
  </tr>
  <tr>
    <td class="sutun1">&nbsp;</td>
    <td class="sutun2"><input type="submit" name="kaydet" value="Kaydet"></td>
  </tr>
</table>
</form>
<?php
} // formu kapsayan if yapısının kapanışı
echo "<p>$mesaj</p>"; // oluşturulan mesajı yazdır. (Olumlu yada olumsuz)
?>
</body>
</html>



index.php sayfası sitenin ana sayfası olarak kabul edilirse bu sayfa çok farklı şekilllerde ve biçimlerde tarafınızca hazırlanabilir. Önemli olan formlardan gelen bilgileri alıp işleyen ve veritabanına kaydeden uyeol.php sayfasıdır.

uyeol.php sayfasında üç fonksiyon tanımlanmıştır.


İlk fonksiyon temizle isimli fonksiyondur ki gelen verileri SQL injection'a karşı temizliyor. Bu kontrol sadece string alanlara girilecek olan veriler için yapılıyor. Eğer integer bir değer bekleniyorsa o değer için (int) ön ekini kullanarak güvenliği sağlamış oluyoruz. Bu ek, gelen değeri integer bir değere çevirir. temizle fonksiyonunda kullandığımız fonksiyonları biraz açıklayalım.

$veri = trim($veri);
trim, gelen değerin başındaki ve sonundaki boşlukları atıyor. 

$veri=stripslashes($veri);
stripslashes, kullanıcı yada sistem tarafından eklenen ters bölüleri (\) kaldırır. Ters bölü, özel karakterleri etkisiz hale getirmek için kullanılır. Ama bu iyi bişeydir biz de zaten bunu yapacağız diyebilirsiniz. Ancak bazı sunucularda php.ini dosyasında magic_quotes_gpc parametresi on ise sistem otomatik olarak ters bölü ekler, off ise eklemez. Biz her halükarda çalışması için ters bölüleri kaldırıyoruz. Ayrıca resmi sitesinde belirtilen magic_quotes_gpc yapılandırmasına güvenmeyin tavsiyesine de uyarak varsa ters bölüleri kaldırıp kendimiz ters bölü ekliyoruz. magic-quotes-gpc

$veri=mysql_real_escape_string($veri);
mysql_real_escape_string fonksiyonu ile de gelen verideki özel karakterlerin önüne ters bölü (\) koyarak etkisiz hale getiriyoruz.


İkinci fonksiyon ise bosmu fonksiyonudur. Bu fonksiyon aldığı dizide boş değer olup olmadığını kontrol ediyor. Eğer dizideki değerlerden bir boş ise geriye false gönderiyor.


Üçüncü fonksiyon olan uyevarmi fonksiyonu ise yazılan kullanıcı adına karşılık veritabanında bir kayıt olup olmadığını kontrol ediyor. Varsa true, yoksa false gönderiyor.


 

Bu üç fonksiyondan if($_POST) yani post olayı varsa diyerek yine bir önlem alıyoruz. Eğer bu sayfa adres çubuğundan açılırsa post olayı olmayacak, o zaman da üye kaydı yapılmayacaktır.

$adisoyadi=temizle($_POST["adisoyadi"]); // adisoyadi değerini temizleniyor
$gun=(int)$_POST["gun"]; // gun değeri integer bir değere dönüştürülüyor

Sonra post ile gelen değerler alınıyor. String değerler temizle fonksiyonuna veriliyor, integer değerlerin önüne de (int) ekleniyor.

 

Sırasıyla;

  • Boş değer olup olmadığı
    if (bosmu(array($adisoyadi,$kullaniciadi,$email,$sifre,$tekrarsifre,$gun,$ay,$yil))==false)
  • Üyenin kayıtlı olup olmadığı
    if ($durum==true and uyevarmi($kullaniciadi))
  • Girilen şifrelerin  farklı olup olmadığı
    if ($durum==true and $sifre!=$tekrarsifre)

kontrol ediliyor.

Sonra herşey olumlu ise yani if($durum==true) ise şifre şifreleniyor ve if (mysql_query(...)) ile kayıt işlemi gerçekleştiriliyor. Aynı zamanda kaydın yapılıp yapılmadığı da kotrol ediliyor. Kayıt işlemi gerçekleşmezse mysql_error() ile hata mesajı oluşturuluyor.

Dikkat ederseniz form yapısı if yapısının arasına alınmıştır. Dolayısıyla if($durum==false) şartının sağlandığı durumlarda yani olumsuz bir durumda form yapısı ekranda gösterilecek. Kayıt olması durumunda ise gösterilmeyecektir.

Son olarak $mesaj değişkeni ekrana yazdırılıyor. Burada değişkenlerin ilk değerlerine dikkat ediniz.


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