Bu makalemde kendi yazdığım veritabanı sınıfındaki bir kaç fonksiyonu sizlerle paylaşmak istedim. Bu fonksiyonlar veritabanında aynı tabloda veya farklı tablolarda bulunan ilişkili kayıtları silmemize yarıyor. 3 tane fonksiyon mevcut. Adım adım bu fonksiyonları inceleyelim.

1. Aynı tabloda bulunan ilişkili kayıtları silme (Tree List):

Örnek olarak aşağıdaki gibi Kategoriler adında bir tablomuz olsun.

Yukarıdaki resimde görüldüğü gibi tablomuzda birbiri ile ilişkili kayıtlar mevcut. Aşağıdaki fonksiyon ile bu kayıtları silebiliriz. Bu fonksiyon öz yinelemeli fonksiyondur. Buradaki tablo parametresi işlem yapmak istediğiniz tablonun adı,birincilAlan parametresi tablodaki Primary Key alanı, iliskiliAlan parametresi tablodaki Foreign Key alanı, silinecekID parametresi ise silmek istediğiniz kayıtın id si olacak.

[php]
function AyniTablodakiIliskiliKayitlariSil($tablo,$birincilAlan,
$iliskiliAlan,$silinecekID){
$sorgu = "SELECT * FROM $tablo WHERE $iliskiliAlan=$silinecekID";
$sonuc = mysql_query($sorgu);
$satir_sayisi = mysql_num_rows($sonuc);
for ($i=0;$i<$satir_sayisi;$i++){
$id = mysql_result($sonuc,$i,$birincilAlan);
AyniTablodakiIliskiliKayitlariSil($tablo,$birincilAlan,$iliskiliAlan,$id);
}
mysql_query("DELETE FROM $tablo WHERE $birincilAlan=$silinecekID");
}
[/php]

Örnek olarak Kitap kategorisini ve ona bağlı bulunan tüm kayıtları silecek fonksiyonu aşağıdaki gibi çağırıyoruz.

[php]AyniTablodakiIliskiliKayitlariSil("Kategoriler","KategoriID","UstKategoriID","1");[/php]

2. Ana tablo ve ona bağlı diğer tablolardaki ilişkili kayıtları silme (Linked List):

Bu fonksiyon aşağıdaki resimde olan şemada gösterildiği gibi n tablo için kullanılabiliyor. Tablo sayısının önemi yok. Bu şemada bir tane ana tablo ve o tabloya bağlı diğer tablolar mevcut.

Örnek tablolar aşağıdaki gibidir.Bizim örneğimizde ben 3 tane tablo kullanacağım.

Bu örnekte anaTablo adında bir kullanıcı tablomuz var. Bu kullanıcı tablosu ile ilişkili Tablo1 adında bildiği dilleri,Tablo2 adında yaptığı projeleri tutan tablolarımız var. Aşağıdaki fonksiyon ile anaTablo da bulunan kullanıcı sildiğimizde ona bağlı tüm kayıtları silmiş olacağız. Bu fonksiyondaki tablolar parametresi ilki ana tablomuz olmak üzere işlem yapmak istediğimiz tabloların isimleri olacak. alanlar parametresi ilki ana tablomuzdaki birincil anahtar (Primary Key) alanı olmak üzere ilişkili alan (Foreign Key) adları olacak. ID parametresi ise silenecek kayıtın id si olacak.

[php]
function FarkliTablolardakiIliskiliKayitlariSil($tablolar,$alanlar,$ID){
for ($i=0;$i<count($tablolar);$i++){
mysql_query("DELETE FROM $tablolar[$i] WHERE $alanlar[$i]=$ID");
}
}
[/php]

Örnek olarak Sinan AKYAZICI kaydını ve ona bağlı tüm kayıtları silen fonksiyonu aşağıdaki gibi çağırıyoruz.

[php]
$tablolar = array("anaTablo","Tablo1","Tablo2");
$alanlar = array("ID" ,"UstID","UstID");
FarkliTablolardakiIliskiliKayitlariSil($tablolar,$alanlar,"1");
[/php]

3. Farklı tablolardaki birbiri ile ilişkili kayıtları silme (Linked List):

Bu fonksiyon aşağıdaki resimde olan şemada gösterildiği gibi n tablo için kullanılabiliyor. Tablo sayısının bir önemi yok. Bu şemada tablolar sırası ile birbirine bağlı. 2. tablo 1. tabloya bağlı,3. tablo 2. tabloya bağlı,4. tablo 3. tabloya bağlı. Bu şekilde sırayla devam etmektedir. 1. örneğimizle aynı mantıkta fakat burada kayıtlar tek tabloda değil birden fazla tabloda tutulmakta.

Örnek tablolar aşağıdaki gibi olsun. Bizim örneğimizde ben 3 tane tablo kullanacağım.

Bu örnekte tablo1 adında ana kategori tablomuz var. tablo2 adında alt kategori tablomuz var. tablo3 adında alt kategorinin alt kategori tablomuz var. Aşağıdaki fonksiyon ile tablo1 den istediğimiz kayıtı sildiğimizde ona bağlı olan tüm kayıtları silmiş olacağız. Bu fonksiyondaki tablolar parametresi sırası ile tablo adlarını tutmakta,birincilAlanlar parametresi sırası ile tablolardaki birincil alan adlarını tutmakta,iliskiliAlanlar parametresi sırası ile iliskili alan adlarını tutmakta. İlk tablomuzda iliskili alan olmadığı için onun yerine birincil alanın adını tutar. ID parametresi silmek istediğimiz kayıtın id sini , sayac parametresi ise fonksiyonun çalışması için gerekli olan bir parametredir ve her zaman 0 olarak fonksiyona gönderilir.

[php]
function SiraliTablolardakiIliskiliKayitlariSil($tablolar,$birincilAlanlar,
$ilisikiliAlanlar,$ID,$sayac){
if ($sayac<count($tablolar)){
$tablo = $tablolar[$sayac];
$sorgu = "SELECT * FROM $tablo WHERE $ilisikiliAlanlar[$sayac]=$ID";
$sonuc = mysql_query($sorgu);
$satir_sayisi = mysql_num_rows($sonuc);
for ($i=0;$i<$satir_sayisi;$i++){
$id = mysql_result($sonuc,$i,$birincilAlanlar[$sayac]);
SiraliTablolardakiIliskiliKayitlariSil($tablolar,$birincilAlanlar,
$ilisikiliAlanlar,$id,$sayac+1);
}
if ($satir_sayisi>0)
mysql_query("DELETE FROM $tablo WHERE $ilisikiliAlanlar[$sayac]=$ID");
}
}
[/php]

Örnek olarak Kitap kaydını ve ona bağlı tüm kayıtları silen fonksiyonu aşağıdaki gibi çağırıyoruz.

[php]
$tablolar = array("Tablo1","Tablo2","Tablo3");
$birincilAlanlar= array("ID","ID","ID");
$iliskiliAlanlar= array("ID","UstID","UstID");
SiraliTablolardakiIliskiliKayitlariSil($tablolar,$birincilAlanlar,
$iliskiliAlanlar ,"1",0);
[/php]

Fonksiyonların bulunduğu php dosyasını indirmek için tıklayın.