May.27

PHP ve MySQLi Dersleri 7 : PHP ve MySQLi ile CRUD (Create, Read, Update Delete) Uygulama Örneği

SQL sorgularımızı öğrendiğimize göre basit bir uygulama yapalım. Uygulamamızda kişi isim ve soyisimlerini tutacağımız basit bir veritabanı olacak. Bir form sayfası oluşturup, form sayfasındaki elemanlar sayesinde veritabanına kişi ekleyecek, kişiyi yeniden düzenleyebilecek, silecek ve kişileri sıralayabileceğiz.

Uygulama Yapısı

Uygulamamızda öncelikle veritabanı bağlantısını her seferinde (yani silmek için ayrı, güncellemek için ayrı gibi) tek tek kurmak yerine, tek bir ayar dosyası ile bağlantıyı kurup, her sayfada kullanacağız. Yine silme, ekleme, listeleme ve güncelleme için de ayrı ayrı HTML5 sayfalarını PHP ile hazırlayacağız. Arayüz olarak da kafamızı çok fazla karıştırmamak için herhangi bir CSS, JavaScript veya Framework kullanmadan en sade hali ile yapacağız.

Özetle elimizde şu dosyalar olacak:

• ayarlar.php: MySQLi bağlantı ayarlarının yapılacağı sayfa.
• listele.php: Verileri listeleyecek olan sayfa.
• sil.php: Verileri silecek olan sayfa.
• guncelle.php: Verileri güncelleyecek olan sayfa.
• ekle.php: Yeni veri ekleyecek olan sayfa.

Uygulama örneğimizi yaparken localhost üzerinden, yani XAMPP aracılığı ile yapacağız. Dilerseniz kendi PHP sunucunuzda da uygulamanızı test edebilirsiniz.

ayarlar.php

MySQLi veritabanına bağlanacak olan ayarların yer aldığı ve bu ayarlarla veritabanına bağlanan kod bloğunun tutulduğu dosya. Veritabanı ile işlem yapacak olan sayfalarda ortak olarak kullanılacak.

Bu aşamada doğrudan sunucu üzerinde Cpanel’de phpMyAdmin ile bir veritabanı oluşturup sütunlarını da belirleyin. Yapımız şu şekilde (3 sütunlu) olacaktır. Nasıl yapacağınızı daha önceki konuları inceleyerek hatırlayabilirsiniz. Sadece ID sütunu için A_I sekmesini işaretlemeyi unutmayın!

• Veritabanı İsmi: KISILER
• Tablo İsmi: BILGILER

Tablo oluşturulduğunda sonuç aşağıdaki gibi olmalıdır:

Daha sonra bu veritabanı için yetkilendirilmiş kullanıcıyı tanımlayabilirsiniz.

• Veritabanı Kullanıcısı: ugurgeli_ugur
• Veritabanı Kullanıcı Şifresi: 123123123

ayarlar.php

<?php 
  $baglanti = mysqli_connect('localhost', 'ugurgeli_ugur', 'Kender01', 'ugurgeli_kisiler');
  $baglanti->set_charset("utf8");
  if (!$baglanti) { 
      die('Hata: ' . mysqli_connect_error()); 
  }else{
      echo "Bağlantı kuruldu.<hr>";
  }
?>

$baglanti adında bir değişken tanımlıyoruz. MySQLi kütüphanesinin mysqli_connect metodu ile bağlantı kuruyoruz. Parametreler sırası ile hosting adresi, veritabanı kullanıcı adı, veritabanı yetkilendirilmiş kişi ismi ve veritabanı ismidir. Sonrasında veritabanından gelecek olan Türkçe karakterler de düzgün çıksın diye veritabanının karakter setini set_charset metodu ile utf8 olarak tanımlıyoruz. Bağlantı kurulursa, $baglanti değişken değeri true sonucunu verecektir. Bu yaklaşımla bir if döngüsü kuruluyor. Döngüde hata olursa hata kodunu yazdırıyoruz. Eğer bağlantı sağlanırsa da bir mesaj yazdırıp hr etiketi ile yatay bir çizgi çizdiriyoruz.

listele.php

<!DOCTYPE html>
<html>
<head>
  <title>Veritabanı Yönetimi - Listele</title>
  <meta charset="UTF-8">
</head>
<header>
	<?php
		include 'ayarlar.php';
	?>
</header>
<body>
	<?php 
		$sorgu = "SELECT * FROM bilgiler";
		$sorguSonucu = mysqli_query($baglanti, $sorgu) or trigger_error("Hata: ". mysqli_error($mysqli), E_USER_ERROR);
		if($sorguSonucu) {
			echo "<table border='1px' >";
			while($kayit = mysqli_fetch_assoc($sorguSonucu)) {
echo "<tr><td>" . $kayit ['ISIM'] . "</td><td>" . $kayit ['SOYISIM'] . "<td>
<a href='guncelle.php?id=".$kayit ['ID']."'>Düzenle</a></td>" . "<td>
<a href='sil.php?id=".$kayit ['ID']."'>Kaldır</a></td></tr>";	
			}
		}
		echo "</table>";
	?>
	<br><a href='ekle.php'>Yeni kayıt ekle</a>
</body>
</html>

Yazdığımız kodları açıklayalım…

Sayfamız bildiğimiz HTML5 kalıbında hazırlanan bir PHP sayfası. Sayfa içinde header içinde veritabanı bağlantısını sağlayacak olan ayarlar.php dosyası dahil ediliyor. Dahil edilme işlemi PHP’nin include metodu ile sağlanıyor.

body etiketleri içinde listemizi oluşturacak kodlarımız yer alıyor. İlk olarak SELECT sorgusu bir String olarak tanımlanıyor ve $sorgu değişkenine aktarılıyor. Sonraki satırda ise mysqli_query() metodu ile bütün tablo verileri çekiliyor. Bu metot iki adet parametre alır. Birincisi bağlantı nesnesidir. Bu nesne ayarlar.php içinde yer alan $baglanti değişkenidir. İkinci parametre ise sorgudur. Sorgumuz da $sorgu değişkeni içinde yer almaktadır. Sorgumuz da çekilen veriler $sorguSonucu değişkenine aktarılıyor. Eğer bu işlemde bir hata olursa hata yazdırılıyor.
Sonra da bir if döngüsüne giriliyor. Döngüde karşılaştırma değeri olarak $sorguSonucu veriliyor. Eğer sorgu başarılı bir şekilde olursa bu değer TRUE olarak yorumlanır.

Döngü içerisinde hemen bir table border=”1px” etiketi açılıyor. Döngü sonunda da table ile kapatılıyor. Arada kalan kısımda da PHP’de MySQLi’nin for-in döngüsüne benzeyen mysqli_fetch_assoc($sorguSonucu)) döngüsünü kurarak, her bir satır kaydı tek tek ele alınıyor. Alınan kayıt ise $kayit değişkenine aktarılıyor.

$kayit değişkeni içinden de $kayit [ID], $kayit [‘ISIM’], $kayit [SOYISIM] şeklinde bir tanımlama ile sütun değerleri tek tek okunuyor. Arada kalan tablo kodları ile de tablomuz hazırlanıyor.

Tablomuzda Düzenle ve Kaldır şeklinde iki adet de link oluşturup bunlara a etiketi ile linkler verdik. Linklerimizde de sil.php?id ve duzenle.php?id= şeklinde adreslemeler yaptık.

Böylece linklere tıklandığında GET metodu ile kayda ait ID değerini alıp ilgili sayfalara göndereceğiz. Nihayetinde ID değeri referans alınarak UPDATE veya DELETE sorguları çalıştırılabilecek. Hatırlayın, UPDATE ve DELETE sorgularında WHERE koşulu ile mutlaka bir referans değer kullanmamız gerekiyordu.

Sayfanın sonunda da yeni bir kayıt eklenebilmesi için ekle.php’ye bir bağlantı kuruyoruz.

ekle.php

<!DOCTYPE html>
<html>
<head>
  <title>Veritabanı Yönetimi - Ekle</title>
  <meta charset="UTF-8">
</head>
   <header>
	<?php
		include 'ayarlar.php';
	?>
   </header>
   <body>
	<?php
		if(isset($_POST['submit'])){
			$isim=$_POST['isim'];
			$soyisim=$_POST['soyisim'];
			$sql = "INSERT INTO bilgiler (ISIM, SOYISIM) 
                                                VALUES('$isim', '$soyisim')";
			if($baglanti->query($sql) == TRUE){
				echo "Kayıt eklendi...";
			} else {
				echo $baglanti->error;
			}
		}
	?>
	<form method="POST" action="">
	      İsim: <input type="text" name="isim"><br>
	      Soyisim: <input type="text" name="soyisim"><br>
	     <br>
	     <input type="submit" name="submit" value="Ekle">
	</form>
	<br><a href='listele.php'>Kayıtları listele</a>
   </body>
</html>

Diğer sayfamızda olduğu gibi include ile ayarlar.php dosyasını sayfaya dahil ediyoruz.

Sayfamız temel prensipte iki kısma ayrılmış.

Üstte kalan birinci kısımda, if döngüsü ile o sayfaya POST ile bir değer gelmiş mi gelmemiş mi diye bakılıyor. Yani ikinci kısımda yer alan formun Ekle butonuna tıklanmış mı, yoksa doğrudan o sayfaya mı gelinmiş diye bakılıyor. Şöyle düşünelim… Sayfaya ilk geldiğimizde doğrudan form gösterilecektir. Ancak formdaki metin kutularını doldurup Ekle butonuna tıklarsak, yine aynı sayfaya POST ile veriler gönderilir. İşte if döngüsüyle, o sayfaya veriler gönderilmiş mi diye bakılıyor. Kontrol değeri de if döngüsünün parametre değer değişkeni olan submit’tir. Submit değeri de formun tıklanması ile gelmektedir.

İlk olarak form kısmını inceleyelim…

Form’un method değeri POST’tur. Yani değişkenler gizli olarak aktarılacak. action attribute değeri de boştur. Boş olması, doğrudan kendi üzerine gönderileceği anlamına gelir. Üç adet input elementi ekledik form içinde. Bunlardan ikisi text, yani metin kutusu, üçüncüsü de submit, yani forma bağlı olan action’u aktif etme butonudur. Metin kutularının name attribute değerleri sırası ile isim ve soyisim’dir. Bu değerler ile metin kutularının içinde yazılı olan metinler okunacaktır. Butonun da name özelliği submit’tir.

Ekle butonuna tıklanması ile sayfa yenilenecek ve POST içinde değişkenler gelecektir. Böylece if döngüsünde kontrol edilen submit değeri var olacağı için döngü içine girilecek. Döngü içinde de INSERT INTO sorgusu ile sorgu tanımlanıyor. Eklenecek değerler de değişkenlere aktarılıp sorguya VALUES içinde dahil ediliyor. Ardından yine bir iç if döngüsü ile kayıt aşamasında bir hata olup olmadığı kontrol ediliyor. Eğer kayıt eklenirse, formun üstünde “Kayıt eklendi…” diye bir mesaj yazdırılacak.

En son olarak yine verileri güncel hali ile listelemek için Kayıtları listele linki ile listele.php sayfasına bir bağlantı ekleniyor.

Kayıt eklendiğinde başarılı olursa:

Kayıt eklendikten sonra listede görünecektir.

sil.php

<!DOCTYPE html>
<html>
<head>
  <title>Veritabanı Yönetimi - Sil</title>
  <meta charset="UTF-8">
</head>
<header>
	<?php
		include 'ayarlar.php';
	?>
</header>
<body>
	<?php 
		if(isset($_GET['id'])){
			$id=$_GET['id'];
			$silSorgusu="DELETE FROM bilgiler WHERE ID='$id'";
			if(mysqli_query($baglanti, $silSorgusu)) {
			    echo "Kayıt silindi. <a href='listele.php'>Geri dön</a>";
			}
		}
	?>
</body>
</html>

Silme işlemini yapmak için hatırlarsanız listele.php sayfasında GET metodu ile id değişkeni gönderiyorduk. Bunu aklımızın bir kenarında tutalım…

Ortak kısımlara değinmeden, yine if döngüsü ile kontrol aşamasına bakalım…

if döngüsünde, bu sefer POST değil de GET ile değişken değeri kontrolü yapılıyor. Böylelikle sayfa adresinin listele.php mi yoksa listele.php?id=2 gibi bir adres mi olduğu kontrol ediliyor. Eğer URL satırında id değeri gelmişse, bu değer $id=$_GET[‘id’] satırı ile alını $id değişkenine aktarılıyor (Çok fazla değişken ismi karmaşası olmaması nedeniyle aynı değişken ismi kullanıldı).

Gelen ID değerine göre, DELETE WHERE sorgumuzu oluşturuyoruz. Silme işlemi ID kontrolüne göre yapılacak. Aynı ID değeri ile eşleşen satır silinecek.

Sorgumuzu bu sefer farklı bir metot ile yapıyoruz. Kayıt ekleme işleminde $baglanti->query($sql) şeklinde sorgumuzu çalıştırmıştık. Silme işleminde de mysqli_query($baglanti, $silSorgusu) şeklinde sorgumuzu çalıştırıyoruz. İkisi de aynı işi yapar, maksat farklı farklı metotları da görmenizdir.

Kayıt silindiğinde TRUE sonucunu verecektir. Yine bir iç if döngüsüne girilip bu değer kontrol ediliyor. Eğer kayıt silinmişse, tekrar listeleme sayfasına dönebilmek için a etiketi ile bir bağlantı oluşturuluyor.

URL satırına bakıldığında sil.php?id=9 satırı ile veritabanında ID değeri 9 olan satır silinmiştir.

guncelle.php

<!DOCTYPE html>
<html>
<head>
  <title>Veritabanı Yönetimi - Güncelle</title>
  <meta charset="UTF-8">
</head>
<header>
	<?php
		include 'ayarlar.php';
	?>
</header>
<body>
	<?php
		if(isset($_GET['id'])){
			$id=$_GET['id'];
			if(isset($_POST['submit'])){
				$isim=$_POST['isim'];
				$soyisim=$_POST['soyisim'];
				$guncelleSorgusu = mysqli_query($baglanti, 
                                                     "UPDATE bilgiler 
                                                     SET ISIM='$isim', SOYISIM='$soyisim' 
                                                     WHERE ID='$id'");
				if($guncelleSorgusu){
					echo "Kayıt güncellendi. 
<a href='listele.php'>Geri dön</a><br><br>";
				}
			}
		}
		$siralamaSorgusu = 
mysqli_query($baglanti, "SELECT * FROM bilgiler WHERE ID='$id'");
		$kayit=mysqli_fetch_array($siralamaSorgusu);
	?>
	<form method="POST" action="" >
		İsim:<input type="text" name="isim" value="<?php echo $kayit['ISIM']; ?>" /><br />
		Soyisim:<input type="text" name="soyisim" value="<?php echo $kayit['SOYISIM']; ?>" /><br /><br />
		<br />
		<input type="submit" name="submit" value="Güncelle" />
	</form>
</body>
</html>

Yine silme işleminde olduğu gibi ayarlar.php sayfası çekilip GET ile URL adresi kontrol edilerek if döngüsüne giriliyor…

Alt kısımda yer alan form alanında, metin kutularının value değerlerine, URL satırından gelen id değişkenine göre, ISIM ve SOYISIM değerleri aktarılıyor. Aktarma işlemi ve satırları ile sağlanıyor. Buradaki $kayit değişkeni de if döngüsü içerisinde oluşturuluyor.

$siralamaSorgusu = mysqli_query($baglanti, "SELECT * FROM bilgiler WHERE ID='$id'");
$kayit=mysqli_fetch_array($siralamaSorgusu);

Sayfa ilk açıldığında URL’deki id değerine göre metin kutularında isim ve soyisim değerleri gösterilecek. Buraya kadar tamam… Yazdırılacak olan bu veriler de döngü içinde yer alan $siralamaSorgusu sorgusu ile sağlanıyor. Bu sorgudaki her bir satır değeri de $kayit değişkenine aktarılıyor. İşte bu şekilde form’daki metin kutularında değerler gösterilebiliyor.

Form’da, metin değerleri yeniden düzenlenip Güncelle butonuna tıklandığında da bu sefer POST metodu ile aynı sayfaya submit değeri gönderiliyor. Böylece verilerde UPDATE sorgusu ile güncelleme yapılabiliyor.

Dikkat ettiyseniz, sayfa ilk yüklendiğinde GET koşulu sağlandığı için ilk döngüye giriliyor ama POST koşulu sağlanmadığı için iç kodlara girilemiyor. Sayfa içinde Güncelle butonuna tıklandığında, bu sefer POST koşulu da sağlandığı için iç kodlara girilebiliyor ve UPDATE ile güncelleme yapılabiliyor.

$isim=$_POST['isim'];
$soyisim=$_POST['soyisim'];
$guncelleSorgusu = mysqli_query($baglanti, "UPDATE bilgiler SET ISIM = 
'$isim', SOYISIM='$soyisim' WHERE ID='$id'");
if($guncelleSorgusu){
	echo "Kayıt güncellendi. <a href='listele.php'>Geri dön</a><br><br>";
}

guncelle.php?id=9 ile URL satırı geldiğinde:

Kayıt güncellendiğinde:

İçeriği paylaş:
  • facebook
  • twitter