JavaScript JSON İle Veritabanı Yazmak

codinger06

Üye
1 Mar 2023
161
136
127.0.0.1
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 :
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 :D

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. :D
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.


 

fsKS

Üye
11 Şub 2023
137
74
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 :
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 :D

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. :D
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.


Öncelikle, kodlama becerilerinizde hiçbir sorun olmadığına eminim, ancak daha okunaklı ve sürdürülebilir kod yazmak için bazı tavsiyelerim var.

İlk olarak, kodunuzu daha anlaşılır hale getirmek için kod bloklarını parçalara ayırabilirsiniz. Fonksiyonları, döngüleri ve koşullu ifadeleri mantıksal bir şekilde gruplandırarak kodunuzu daha modüler hale getirebilirsiniz. Bu, kodunuzun yeniden kullanılabilirliğini artırır ve okunması daha kolay hale getirir.

İkinci olarak, kodunuzda değişken adlarını açıklayıcı hale getirmeye özen gösterin. Bu, kodunuzun işlevini daha iyi anlamamıza yardımcı olur. Örneğin, bir değişkenin adı "a" yerine "toplam_maliyet" olsaydı, kodunuz daha anlaşılır olurdu.

Üçüncü olarak, kodunuzda gereksiz tekrarları önleyin. Benzer işlemler için aynı kodu birden çok kez yazmak yerine, bir fonksiyon oluşturarak bunları yeniden kullanabilirsiniz. Bu, kodunuzun tekrar oranını azaltır ve kodunuzun daha az hata yapma olasılığını artırır.

Son olarak, kodunuzda yorum satırları ekleyerek kodunuzu daha anlaşılır hale getirin. Ne yapmak istediğinizi ve neden yaptığınızı açıklayarak kodunuzu daha anlaşılır hale getirirsiniz. Bu, başkalarının kodunuzu daha kolay anlamasına ve gerektiğinde değiştirmesine yardımcı olur.

Tüm bunlar, kodunuzu daha okunaklı, sürdürülebilir ve yeniden kullanılabilir hale getirecektir. Umarım bu yapıcı eleştiri size faydalı olur.
 

codinger06

Üye
1 Mar 2023
161
136
127.0.0.1
Öncelikle, kodlama becerilerinizde hiçbir sorun olmadığına eminim, ancak daha okunaklı ve sürdürülebilir kod yazmak için bazı tavsiyelerim var.

İlk olarak, kodunuzu daha anlaşılır hale getirmek için kod bloklarını parçalara ayırabilirsiniz. Fonksiyonları, döngüleri ve koşullu ifadeleri mantıksal bir şekilde gruplandırarak kodunuzu daha modüler hale getirebilirsiniz. Bu, kodunuzun yeniden kullanılabilirliğini artırır ve okunması daha kolay hale getirir.

İkinci olarak, kodunuzda değişken adlarını açıklayıcı hale getirmeye özen gösterin. Bu, kodunuzun işlevini daha iyi anlamamıza yardımcı olur. Örneğin, bir değişkenin adı "a" yerine "toplam_maliyet" olsaydı, kodunuz daha anlaşılır olurdu.

Üçüncü olarak, kodunuzda gereksiz tekrarları önleyin. Benzer işlemler için aynı kodu birden çok kez yazmak yerine, bir fonksiyon oluşturarak bunları yeniden kullanabilirsiniz. Bu, kodunuzun tekrar oranını azaltır ve kodunuzun daha az hata yapma olasılığını artırır.

Son olarak, kodunuzda yorum satırları ekleyerek kodunuzu daha anlaşılır hale getirin. Ne yapmak istediğinizi ve neden yaptığınızı açıklayarak kodunuzu daha anlaşılır hale getirirsiniz. Bu, başkalarının kodunuzu daha kolay anlamasına ve gerektiğinde değiştirmesine yardımcı olur.

Tüm bunlar, kodunuzu daha okunaklı, sürdürülebilir ve yeniden kullanılabilir hale getirecektir. Umarım bu yapıcı eleştiri size faydalı olur.
Örnek ve temel bir proje olduğu için asıl amaç JSON'u anlamak olduğu için DRY, SOLID veya doğru adlandırma prensiplerini tam olarak uygulamadım, tüm bunlar uygulansaydı daha iyi olurdu ama ona değinmediğimden çok yapmadım ama yine de DatabaseEngine kısmında biraz daha adlandırma prensiplerine uyulmuş gibi gözüküyor gayet anlaşılabilir olduğunu düşünüyorum, teşekkürler belirttiğiniz için profesyonel bir proje olsaydı bunların uygulanması gerekirdi.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.