Bu yazıda, JavaScript ve çok az da PHP kullanarak çok basit ve temel bir veritabanı yazacağız.
Önceden belirtmek isterim ki yazacağımız veritabanını gerçek hayatta kullanamazsınız, JSON dosyaları halka açıktır yazacağımız veritabanının anlamı kalmaz, böyle bir şeyi JSON'u daha iyi anlamak, JSON ile gelen veriyi işlemek ve yeni veri eklemek konularını ele almak için yapıyoruz.
Veritabanımızda temel CRUD (Create-Read-Update-Delete) operasyonlarını yapabileceğiz.
Öyleyse veritabanımızın yapısını inceleyerek başlayalım.
database.json :Önceden belirtmek isterim ki yazacağımız veritabanını gerçek hayatta kullanamazsınız, JSON dosyaları halka açıktır yazacağımız veritabanının anlamı kalmaz, böyle bir şeyi JSON'u daha iyi anlamak, JSON ile gelen veriyi işlemek ve yeni veri eklemek konularını ele almak için yapıyoruz.
Veritabanımızda temel CRUD (Create-Read-Update-Delete) operasyonlarını yapabileceğiz.
Öyleyse veritabanımızın yapısını inceleyerek başlayalım.
JSON:
{
"database1": {
"rows": [
{ "id": 1, "name": "THT123", "password": "TURKHACKTEAM"},
{ "id": 2, "name": "MKE AG SINCE 1910", "password": "1923" }
],
"auto_increment": true
},
"database2": {
"rows": [{ "id": 5, "data": "abc" }],
"auto_increment": false
},
"database3": {
"rows": [
{ "id": 1, "value": "deneme", "pass": "thisispass" }
],
"auto_increment": true
}
}
3 tane örnek veritabanımız var. Her biri aslına bakarsanız bir obje. İçlerinde "rows" ve "auto_increment" adlı özellikler (properties) var bir JSON objesinin içerisinde oldukları için değişken değil özellik olarak hitap etmek istiyorum. "rows" bir dizi ve diğer özellik de true veya false alacak."rows" içinde veri setlerinin barındığı yer olacak, kullanıcıları vs. buraya ekleyeceğiz.
"auto_increment" özelliği, herhangi bir row eklendiği zaman ID'nin otomatik olarak artıp atmayacağını belirler. Mesela bir önceki row'un IDsi 4 ise yeni eklenecek olan değerin IDsi belirtilmemişse 5 olacak.
Şimdi ise PHP kısmına gelelim.
WriteToFile.php :
PHP:
<?php
$file = fopen("database.json", "w");
fwrite($file, $_POST["content"]);
fclose($myfile);
?>
Burada veritabanı dosyamızı açıyoruz ve WriteToFile.php'ye atılan bir POST isteği ile gelen yeni dosya içeriğini, database.json'a yazdırıyoruz.
Şimdi ise veritabanı ile alakalı işlemleri yapacak sınıfımıza gelelim, DatabaseEngine.js
JavaScript:
constructor(db_name){
this.database = this.req()[db_name];
this.db_name = db_name;
}
req(){
var result = $.ajax({
url : "../Database/database.json",
type : "GET",
async : false,
})
return JSON.parse(result.responseText);
}
write(content){
$.ajax({
url : "../Database/WriteToFile.php",
type : "POST",
data : {"content" : JSON.stringify(content)},
async : false,
})
}
Sınıfımızın içerisineki constructor'da hangi veritabanına bağlanacağımız bilgisini alıyoruz, ve kaydediyoruz.
req() fonksiyonunun içerisinde kısaca tüm veritabanlarını JSON objesi olarak alabiliyoruz. Çok kullanacağız bunu.
write() fonksiyonunda ise yapacağımız şey PHP ile yazdığımız dosyaya istek atmak. Bu istekte, oluşan yeni database dosyasını göndereceğiz, PHP ise eski dosya ile yeni dosyayı değiştirecek.
CRUD operasyonlarına gelelim.
JavaScript:
addDatabase(db_name, rows, auto_increment){
var databases = this.req();
databases[db_name] = {"rows" : rows, "auto_increment" : auto_increment};
this.write(databases);
}
deleteDatabase(db_name){
var databases = this.req();
delete databases[db_name];
this.write(databases)
}
Burada veritabanı silme, ve yeni veritabanı ekleme işlemlerini gerçekleştiriyoruz. addDatabase() fonksiyonunda ilk öncelikle veritabanı dosyamızı bir değişkene kaydediyoruz. Sonrasında dosyaya adı kullanıcının girdiği bir değer olan yeni bir veritabanı ekliyoruz. Kullanıcının girdiği diğer verileri de yeni veritabanımızın içerisine ekliyoruz ve en sonunda eski dosyayı yeni dosyamızla değiştiriyoruz.
Diğer fonksiyonumuzda ise kullanıcının talep etmiş olduğu veritabanını siliyoruz.
JavaScript:
getRow(id){
for(let i = 0; i < this.database.rows.length; i++){
if(this.database.rows[i].id == id){
return this.database.rows[i];
}
}
}
getRows(){
return this.database.rows;
}
Burada getRow() fonksiyonunda veritabanımızdaki kullanıcın talep ettiği ID'li objeyi bulup kullanıcıya döndürüyoruz. SQL'deki SELECT * FROM table_name WHERE id=1 sorgusuna eş değer. İşte bi bizim veritabanımızda tablolar yok
Diğer fonksiyon ise şu anda bulunduğumuz veritabanının içerisindeki tüm satırları döndürüyor. Şu anda bulunduğumuz dediğim hatırlarsanız yukarıda constructor'da hangi veritabanına bağlanacağımızı kullanıcıdan alıp o veritabanını bir değişkene depolamıştık.
JavaScript:
addRow(row){
var databases = this.req();
if(!row.hasOwnProperty("id") && this.database.auto_increment){
row.id = this.database.rows[this.database.rows.length-1].id + 1;
}
this.database.rows.push(row);
databases[this.db_name].rows = this.database.rows;
this.write(databases);
}
deleteRow(id){
var databases = this.req();
for(let i = 0; i < this.database.rows.length; i++){
if(this.database.rows[i].id == id){
this.database.rows.splice(i, 1);
break;
}
}
databases[this.db_name].rows = this.database.rows;
this.write(databases);
}
Burada addRow() fonksiyonunda kullanıcıdan bir obje alacağız. Kullanıcının verdiği objede ID özelliği yoksa ve işlem yapılan veritabanında auto_increment özelliği aktif ise kullanıcının girdiği veriye ID ekleyeceğiz ve bu ID veritabanında bir önceki elemanın ID'sinin 1 fazlası olacak.
Sonrasında ise kullanıcının girdiği objeyi "rows" özelliğine ekleyip yine dosya değişimi yapacağız.
Diğer fonksiyonda ise kullanıcının istediği ID'li objeyi (satırı) bulacağız sonrasında o satırı diziden kaldıracağız. "rows" bir diziydi unutmayın.
JavaScript:
updateColumn(id, col, value){
var databases = this.req();
for(let i = 0; i < this.database.rows.length; i++){
if(this.database.rows[i].id == id){
this.database.rows[i][col] = value;
break;
}
}
databases[this.db_name].rows = this.database.rows;
this.write(databases);
}
Son olarak kullanıcının istediği satırdaki herhangi bir özelliği değiştireceğiz, tüm satırları gezip hangi satırı istemiş öğreniyoruz, sonra o satırdaki istenilen özelliği istenilen değer ile değiştiriyoruz.
Evet artık bu fakir veritabanımızı kullanabiliriz.
JavaScript:
var db = new DatabaseEngine("database1");
db.addRow({"name" : "addd", "password" : "sifree"});
console.log(db.getRow(1).id)
console.log(db.getRows())
db.deleteDatabase("database2");
Bu şekilde veritabanımızla oynayabiliriz. Ne kadar basit de olsa kendi kullanımınız için bir çok şey yapılabilir, mesela bir yapılacaklar listesi, parola yöneticisi vs. vs. çoğu şey yapılır.
Kaynak : İndir Java Script Veritabanı rar
VirusTotal
VirusTotal