Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Forumdan daha fazla yararlanmak için, profilinizi telefon numaranız 📱 ile doğrulayın ve daha ayrıcalıklı olun 😉
    Daha fazla bilgi!

PHP ile Mvc framework oluşturma

netr0n

XGT
Yönetici
XGT Master
SMS onaylı
Katılım
6 Ara 2016
Mesajlar
7,166
Çözümler
1,195
Merhaba, arkadaşlar.

Başlıktan da anlaşılacağı üzere PHP ile kendi Mvc framework yapımızı oluşturmayı öğreneceğiz. Buradaki anlatım, PHP bilen ve OOP (İngilizce: Object - Oriented Programming, Kısaltma: OOP) mantığına hakim kişilere yönelik olduğunu belirtmek isterim. İnternet dünyasında PHP bilmeyenlere yönelik hazırlanmış çok fazla kaynak var. PHP bilmeyen kişilerin, o kaynaklara yönelmeleri daha doğru bir adım olacaktır. Buradaki anlatılanları internette bu şekilde makale olarak uzun uzadıya anlatan tek bir kaynak bulamazsınız. Bu yüzden umarım kodlamasını bir üst seviyeye çıkarmak isteyen herkesin işine yarar.

PHP (Hypertext Preprocessor), web tabanlı uygulamalar geliştirmek için kullanılan bir programlama dilidir. PHP, özellikle dinamik içerik üreten web siteleri ve web uygulamaları için çok yaygın olarak kullanılmaktadır.

Sunucu Tarafında Çalışma: PHP, sunucu tarafında çalışan bir betik dildir. Bu, kullanıcı tarafındaki tarayıcıda değil, web sunucusunda çalıştığı anlamına gelir. Kullanıcılar, tarayıcıları aracılığıyla PHP kodunu doğrudan görmezler; sadece sonuçları tarayıcılarına görüntülenir.

Dinamik İçerik Oluşturma: PHP, HTML içine gömülerek kullanılabilir ve bu sayede dinamik web sayfaları oluşturmak için kullanılır. Veritabanı bağlantıları, form işleme, dosya işlemleri gibi birçok web geliştirme görevini kolaylaştırmak için tasarlanmıştır.

Geniş Kütüphane Desteği: PHP'nin geniş bir standart kütüphane desteği vardır. Bu kütüphaneler, dosya işlemleri, veritabanı etkileşimi, XML işleme, ağ işlemleri ve daha birçok konuda fonksiyonlar içerir.

Çok Platformlu Desteği: PHP, birçok işletim sistemi ve web sunucu platformu üzerinde çalışabilir. Apache, Nginx gibi popüler web sunucuları ile uyumludur.

Açık Kaynak ve Ücretsiz: PHP, özgür ve açık kaynak bir yazılımdır. Bu, geliştiricilere kodlarını düzenleme ve dağıtma konusunda geniş bir özgürlük sağlar.

Kolay Öğrenme ve Kullanım: PHP, öğrenmesi nispeten kolay olan bir dil olarak bilinir. Bu, yeni başlayanlar için genellikle erişilebilir olmasını sağlar.

PHP'nin tarihinde birçok sürümü bulunmaktadır ve geliştirilme süreci devam etmektedir. Web uygulamaları, CMS (Content Management System) sistemleri, e-ticaret platformları gibi birçok alanda yaygın olarak kullanılmaktadır.

PHP'nin maalesef yazım konusunda diğer dillerde olduğu gibi merkezi bir standardı olmadı. Her ne kadar öğrenilmesi kolay olduğu söylense de bana göre PHP'nin öğrenilmesi kimler tarafından öğretildiğine bağlı olarak süreci uzatabiliyor ve zorlaştırabiliyor. Bunu biraz açmak gerekirse, bir şirketiniz var ve PHP ile web tabanlı uygulamalar geliştiriyorsunuz. Haliyle şirketinizde bu geliştirmeleri yapan yazılımcılara da ihtiyacınız olduğu için yazılımcı çalışanlarınıza bu uygulamaları yazdırmanız gerekiyor. Her yazılımcı kendi PHP bilgisine göre yazılımı ortaya çıkartıyordu. Bu durum 2010 hatta 2012 öncesine kadar PHP tarafında böyle ilerliyordu. Yazılan kodun herhangi bir standardı olmadığı için yani kod nasıl olsa çalışıyor mantığıyla yazıldığı için, şirket içerisinde sorunları da beraberinde getiriyordu. Bu sorunların en başında şirket o yazılımcılara bağlı kalabilir, tavizler verebilir, yazılımcı şirket işlerini aksatabilir, yazılımcı işi bırakabilir. Yazılımcı işi bıraktığında, bir başka yazılımcının gelip o standardı olmadan yazılan kodu çözmesi aylarını alabilir veya o yapıyı sıfırdan kendi bilgisine göre tekrar yazması gerekebilir. Bu da yaşanan bu sorunun sürekli tekrar etmesine neden olur. Bu şirketler için büyük bir sorundur. Bu yüzden büyük şirketler PHP dilini pek tercih etmiyor. İşte bu PHP'nin en büyük dezavantajlarından bir tanesi.

PHP dilinde PSR (PHP Standard Recommendations) standardına uyulması gerektiği ve yazdığım kod nasıl olsa çalışıyor mantığıyla kod yazmamayı bilmemiz gerekiyor. PSR (PHP Standard Recommendations) PHP projeleri arasında bir uyumluluk sağlamak için belirli kurallar ve standartlar içermektedir. Bu yüzden bu standartlara uymak gereklidir.

PHP üzerine geliştirme yaparken, ben framework kullanılmasından yanayım. Standardı olan, en azından bir yazılımcıya bağlı kalmadan, o yazılımcı işi bıraktığında o frameworke hakim olan bir başka yazılımcıyı işe alarak, standardı olan bir projeye kaldığı yerden devam ettirebilirim. Bu yüzden frameworkler kullanılmalıdır ve her zaman bir standarda bağlı kalınmalıdır. Nasıl olsa çalışıyor mantığıyla yazılan kodun maalesef günümüzde bir karşılığı yoktur. Kendi frameworkleri ile proje çıkaran şirketler de var tabii ki burada anlatacağım yapıda tam olarak bunu anlatıyor. Aslında burada Laravel gibi, Symfony frameworklere geçmeden önce basit bir yapıda bu frameworklerin nasıl çalıştığı ile alakalı da bilgi sahibi olacaksınız. Php diline ve OOP (İngilizce: Object - Oriented Programming, Kısaltma: OOP) kavramlarına hakim olmadan direkt frameworklerle başlamak hatalı bir tercih olur. Unutmayın sizi yazılımcı yapan o dile olan hakimiyetinizdir. Frameworkler sadece tercihtir ve sizin işlerinizi bir standarda sokmak ve hızlandırmak için tasarlanmıştır. XenForo tarafına gelecek olursak, burada anlatacağım mantığı bilmiyorsanız xenforo'a eklenti vs yazamazsınız. Burada anlatacağım mantığı zaten biliyorsanız ilgili yazılımın dökümanlarına bakarak istediğiniz geliştirmeyi yapabilirsiniz. Ayrıca burada anlatılanları hiçbir yerde anlatılmadığını da bilin. Yani bu bilgiler gerçekten bu yapıyı merak edenler için bulunmaz bir nimet.
 
Mvc Dosya Yapısının Oluşturulması
Mvc
dosya yapısını aşağıdaki sırada olduğu gibi oluşturun. Bunların hepsini tek tek açıklayacağız.

  • application
  • ---controllers
  • ---models
  • ---view
  • system
  • ---config
  • ---helpers
  • ---libraries
  • ---init.php
  • public
  • ---css
  • ---js
  • ---images
  • ---index.php

Mvc Dosya Yapısının açıklaması​


application dizinimiz, bizim uygulamamızın esas alındığı yerdir. Bu dosya içerisinde controllers, models ve views klasörleri bulunmaktadır. controllers dizini bizim kullanıcılar tarafından yapılan isteklerin kontrolünü sağladığımız dizindir. models dizini bizim veritabanı işlemlerini gerçekleştirdiğimiz dizindir. models dizini içerisinde yapacağımız sorgular, controllers dizini içerisinde kontrolden geçtikten sonra kullanıcıya views dizini üzerinden çıktı yapmamızı sağlayan bir yapıdır. views dizini, belirttiğimiz gibi models ve controllers dizini içerisinde isteklere verdiği yanıtları views üzerinden çıktılamamızı sağlayan bir dizin yapısıdır. Bu dizin yapısı, bize MVC yapısını yani diğer bir tabirler mimarisini oluşturmamızı sağlamaktadır.

system dizini, bizim sistem sınıflarımızı methodlarımızın yer aldığı dizindir. Bu dizinin içerisinde config dizini bulunmaktadır. Bu dizin bizim veritabanı sabitlerinin ve base url sabitlerimizin yer alacağı yerdir. Daha sonradan bunu, proje gidişatına göre dizin değişikliği yaparak application dizinine taşıyabiliriz.

system dizini içerisinde libraries dizini bulunmaktadır. Bu dizin içerisinde bizim kütüphanelerimiz bulunacaktır. Bu kütüphane içerisinde database.php, rout.php gibi bizim framework yani kütüphanelerimiz yer alacaktır. İleriki bölümlerde bunu işleyeceğiz.

system dizini içerisinde helpers dizini bulunmaktadır. Bu dizin içerisinde bizim yardımcı fonksiyonlarımız yer alacaktır.

system dizini içerisinde init.php dosyası bulunmaktadır. Bu doysa bizim kütüphanelerimizi dahil etmemize (include) ve dahil edilmiş dosyaları otomatik autoload ile çalıştırmamızı sağlayan dosyadır.

public dizini Bizim çıktılama yaptığımız yerdir. Yani kullanıcılar sadece public dizinini görebilirler. Bunun içerisinde css dizini, images dizini, js dizini ve index.php dosyası yer almaktadır. İleriki bölümlerde css, js, images dizinlerini assets dizini içerisine alacağız.

Şimdi gerekli dosya testlerimizi yapalım. Öncelikle libraries dizini içerisinde deneme.php dosyası oluşturunuz. Oluşturmuş olduğumuz dosyanın içeriğini aşağıdaki gibi kodluyoruz.

PHP:
 <?php

class Deneme {
     public function __construct()
     {
         echo "Deneme";
     }
}

?>

Daha sonra oluşturmuş olduğumuz deneme.php dosyasını yine libraries dizini içerisinde bulunan init.php dosyasına aşağıdaki gibi include ediyoruz.

PHP:
<?php
include "libraries/deneme.php";

$denemeSinifi = new Deneme();

?>

Daha sonra bu init.php dosyasını çıktılamak için public dizini içerisindeki index.php dosyasına aşağıdaki gibi include ediyoruz. Daha sonra tarayıcımız da http://localhost/netron/public çalıştırıyoruz. (siz kendi yolunuzu yazabilirsiniz ben bu uyarıyı tekrar hatırlatmayacağım) Aşağıdaki gibi bir örnekle karşılaşacağız.

ekranciktisi_1.jpg

Bunu açıklayacak olursak, libraries içerisinde oluşturmuş olduğumuz deneme.php sınıfının __construct methodu ile otomatik başlatıldığını görebiliyoruz. Biz bu sınıfı system dizini içerisindeki init.php dosyasını dahil ettik. En başında söylediğimiz gibi init.php bizim libraries dizini içerisindeki kütüphanelerimizin include edildiği yerdir. Daha sonra dışarıya göstermek için bunu public dizini içerisindeki index.php dosyasına include edip, tarayıcı da görüntülenmesini yani çıktılanmasını sağladık. Testlerimiz yaptık, artık bir sonraki aşamaya geçebiliriz. Çıktıyı gördükten sonra deneme.php dosyasını silin ve init.php dosyası içerisindekileri silin.
 
Mvc Route Yapısının Oluşturulması

Görüldüğü gibi MVC dizin yapımız çalışmakta. Şimdi en önemli işlemlerden birine geldik. O da rout yapımız. MVC yapısı her şeyi URL üzerinden okumaktadır. Bunu birazdan açıklayacağız. Öncelikle public dizini içerisinde .htaccess dosyası oluşturup, içerisine aşağıdaki kodları ekleyelim.

NGINX:
Options -Multiviews
RewriteEngine On
RewriteBase /netron/public
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]

Yukarıdaki .htaccess kodu bizim için kritik önem teşkil etmektedir. Bu kod olmaz ise, URL'den gelecek olan değerleri okuyamazdık. Ayrıca bu kodu yazarken ana dizin isminiz ne ise onu yazacaksınız. Biz burada RewriteBase/netron/public isimlendirdik siz netron yerine başka bir isimde isimlendirme yaptıysanız o ismi vereceksiniz. Burada dikkat ederseniz index.php?url=$1 url yakalayıcısını görüyoruz. İşte buradan gelecek tüm değerleri biz controller/method/parametre şeklinde parçalayacağız ama bunu ileriki bölümlerde yapacağız önce bu kodu test edeceğiz.

libraries dizini içerisinde rout.php adında bir dosya oluşturup içerisine aşağıdaki kodları yazınız.

PHP:
<?php
class Rout
{
    public function __construct()
    {
        echo $_GET['url'];
    }
}
?>

Şimdi de system dizini içerisindeki init.php dosyasını açın ve içerisine aşağıdaki kodları ekleyip kayıt edin.

PHP:
<?php
include "libraries/rout.php";

    $rout = new Rout();

?>

Şimdi tarayıcıya gelerek http://localhost/netron/public/controller/method/1/ linkini çalıştırıyoruz ve aşağıdaki gibi bir çıktı alıyoruz.

ekranciktisi_2.jpg

Burada da görüldüğü üzere URL üzerinden gelen verileri artık alabiliyoruz. Dikkat ederseniz ilk değer controller sonraki değerimiz method daha sonra parametre veya parametreler olacak. Bundan sonrası artık rout yapımızı oluşturmak. Bunu da adım adım yapacağız.

Rout yapımıza başlamadan önce yine çok kritik olan bir duruma müdahale etmemiz gerekiyor. Dikkat ederseniz, biz tarayıcıya hep public belirtmek durumunda kalıyorduk. Çünkü en başta da söylediğimiz gibi bizim sitemiz her zaman public dizini üzerinden yayın yapacak. Bu hem güvenlik için hem de MVC mimarisine uygun olması açısından önemli. Aksi durumunda herkes root dizinimizi görebilir ve bu da sitemiz için ciddi riskler oluşturabildiği gibi sitemizi çalıştırmak isteyen kişilerin önce root dizinimize gitmek durumunda kalmasına sebep olacaktır. Bunun önüne geçmek için root dizinin de bir .htaccess dosyası daha oluşturuyoruz. Kodlar aşağıdaki gibi olacak.

NGINX:
RewriteEngine On
RewriteRule ^$ public/ [L]
RewriteRule  (.*) public/$1 [L]

Yukarıdaki bu .htaccess kodları sayesin de artık tarayıcımız da public dizinini belirtmemize gerek kalmadı, artık otomatik olarak kendisi siteyi public dizininde çalıştıracaktır. Örnek olarak aşağıdaki çıktıya baktığınız da artık public yazmadan da sitemizi çalıştırabiliyoruz.

ekranciktisi_3.jpg

Şimdi rout.php üzerinden MVC url yapısını ayarlıyoruz. Bu işlemler oldukça önemlidir. En kritik konularından bir tanesi diyebilirim. Çünkü bizim burada yapacağımız yapı sayesinde URL üzerinden alacağımız istekleri sınıflarımıza ve methodlarımıza aktaracağız. controller/method/parametre şeklinde ilerleyeceğiz. init.php dosyasını açıyoruz. Burada artık libraries dizini içerisine oluşturduğumuz her sınıfı tek tek tanımlamaktansa tek bir fonksiyon ile libraries dizini içerisindeki tüm sınıf dosyalarını otomatik bulduracağız. init.php dosyasının içeriğini aşağıdaki gibi değiştirin.

PHP:
<?php
include "config/config.php";

spl_autoload_register(function($class_ismi){
    include "libraries/".$class_ismi.".php";
});

$Rout = new Rout();

?>

Daha sonra config dizini içerisindeki config.php dosyasını açın ve içeriğini aşağıdaki şekilde kodlayın. Bunlar bizim rout.php'e ekleyeceğimiz sabit controller, method ve parametre sabitlerimiz olacak.

PHP:
<?php

/*
    * rout.php içerisindeki varsayılan controller, method ve parametreleri içerir.
 */
define("Varsayilan_controller", "anasayfa");
define("Varsayilan_method", "index");
define("Varsayilan_parametre", []);

?>

Şimdi ana kodumuza dönme zamanı libraries dizini içerisindeki rout.php dosyasını açın ve içeriğini aşağıdaki ile değiştirin. Bu dosyadaki kodları size tek tek açıkladık.

PHP:
<?php

class Rout
{
/*
* @Framework Adı : netr0n Framework
* @Yazar İsmi    : netr0n
* @Licanse       : XGT
* @Version       : 1.0.0
* @Açıklama      : Get üzerinden gelen URL verilerini yakalayarak MVC rout çatısını oluşturma.
*/

private $Controller = Varsayilan_controller;
private $Method     = Varsayilan_method;
private $Param      = Varsayilan_parametre;

public function __construct()
{
/*
    * Url() Medhodunu  __construct methodu içerisinde otomatik çalıştırıyoruz.
 */

$url = $this->Url();

    /*
        *!empty() : Methodu ile gelen veri boş değilse kontrolü yapıyoruz.
    */

if(!empty($url)){
    /*
        *file_exists() : Dosyanın belirtilecek olan path'e (yola) bağlı olarak varlığını sınamak için kullanılır.
        İşlem sonucu daime boolean (mantıksal) veri türünde döner.
     */
    if(file_exists("../application/controllers/" .$url[0]. ".php")){

        /*
            *ucwords() : Belirtilecek olan içerikte bulunan kelimenin ilk harfini büyük yapar. Bu sayede bizde,
             class ismini elde etmiş oluyoruz. Artık burada gelen değerin class isminin ilk harfi büyük olmuş olacak.
             Ayrıca yine burada yukarıda private olarak oluşturmuş olduğumuz $Controller değişkenine de gelen $url verisini aktarmış olduk.
         */

        $this->Controller = ucwords($url[0]);
        /*
            *unset() : Belirtilecek olan değişkeni, dizi anahtarını ve elemanını veya session'ı (oturumu) silmek / yok etmek için kullanılır.
            Biz burada unset'i içerisinde hep aynı veriyi tutmasın diye her çalıştırılmadan sonra içerisindeki veriyi etsin diye kullandık.
         */
        unset($url[0]);

    }else{
        /*
         * Eğer bir controller dosyası yoksa görseli güzel bir uyarı mesajı verdiriyoruz.
         */
        die("<div style='background-color: #f1f4f4;color:#afaaaa;border:1px dotted #afaaaa;padding: 10px; border-radius: 4px;'<strong>". $url[0] ."</strong> isimli controller bulunamadı... </div>>");

    }

}

/*
    *Yukarıda controller dosyasının boş değilse kontrolünü yapmıştık ve $Controller değişkenine aktarmıştık.
     Bunu bulduğumuza göre artık değişken ismiyle include edebiliriz.
 */

require_once "../application/controllers/" . $this->Controller . ".php";

/*
    * Yukarıdaki controller sınıfını başlatıyoruz. Artık hangi controller sınıfı gelirse gelsin, otomatik başlatılacak.
 */

$this->Controller = new $this->Controller;

/*
    * Method parametresini check ediyoruz.
 */

if(isset($url[1]) && !empty($url[1])){
    /*
        *method_exists() : Belirtilecek olan class içerisinde, belirtilecek olan metodun varlığını sınamak için kullanılır.
        İşlem sonucu daima boolean veri türünde döner.
        Burada Controller değişkeni içerisinde $url[1]'den gelen method var mı onu kontrol ediyoruz.
     */
    if(method_exists($this->Controller, $url[1])){

        /*
            * $url[1] değişkeninden gelen değer, $method değişkenimize aktarıyoruz.
         */

         $this->Method = $url[1];

        /*
           *unset() : Biz burada unset'i, $url[1] değişkeni içerisinde hep aynı veriyi tutmasın diye,
           her çalıştırılmadan sonra içerisindeki veriyi unset ile yok etsin dite kullandık..
        */

         unset($url[1]);

    }else{

        die("<div style='background-color: #f1f4f4;color:#afaaaa;border:1px dotted #afaaaa;padding: 10px; border-radius: 4px;'<strong>". $url[1] ."</strong> İsimli method bulunamadı </div>>");

    }
}

/*
    * Parametre check ediyoruz. Burada sadece $url değişkenine bakmamız yeterli.
      Sebebini aşağıda açıkladık.
 */
if(isset($url)){
    // Parametre varsa
    $this->Param = $url;
}else{
    // Parametre yoksa boş bir dizi
    $this->Param = [];
}

/*
    * call_user_func_array : bizden 3 parametre ister.
    İlk bakacağı yer, 1. parametre olan Controller sınıfı.
    2. Parametre hangi method içine bakacağı method ismi,
    3. parametre ise yakaladığı parametre ismi.
    Yani yakaladığı parametre ismini alıyor ve 1. ve 2. parametreler (controller ve method),
     dahilinde arıyor ve bulduğu değeri geriye döndürüyor.
 */
call_user_func_array([$this->Controller, $this->Method], $this->Param);
}

public function Url()
{
if(isset($_GET['url'])){

    $url = $_GET['url'];

    /*
        * rtrim () methodu sağ taraftaki fazladan boşlukları kaldırır.
     */

    $url = rtrim($url);

    /*
        * FILTER_SANITIZE_URL kullanarak, url üzerinden gelebilecek illegal karakterleri temizliyoruz.
     */

    $url = filter_var($url, FILTER_SANITIZE_URL);

    /*
        * explode() methodu ile "/" slash karakterini baz alarak,
        gelen url'i slash karakterinden parçalayarak dizi haline çeviriyoruz.
     */

    $url = explode("/", $url);

    /*
     * Return ile değeri gönderiyoruz. Aksi takdirde değerleri alamayız!
     */
    return $url;
        }
    }
}

?>

Yukarıdaki libraries dizini içerisindeki rout.php dosyasının kodlarına baktığınız zaman her kodun bir açıklamasının olduğunu görürsünüz. Kullanılan php methodlarına kadar neden ne için kullandığımızı açıkladık. Bu durumda Ekstra bir açıklama yapmanın tekrardan başka bir işe yaramacağından dolayı bu dosyanın tüm kodlarını iyi okuyunuz ve iyi analiz ediniz. Rout sınıfını test etmek için controlllers dizini içerisinde profile.php adında bir dosya oluşturun ve aşağıdaki kodları ekleyin.

PHP:
<?php

class Profile
{
    public function __construct()
    {

    }

    public function index()
    {
        echo "Burası profile controller içerisindeki index methodu";
    }

    public function futbol($param)
    {
       echo "Beşiktaş : " . $param;
    }
}

?>

profile.php Controller alanındaki index method çıktısı:

ekranciktisi_4.jpg

profile.php Controllerına ait alandaki futbol method'u parametreli çıktısı:


ekranciktisi_5.jpg
 
Son düzenleme:
Views Yükleyicisinin Kodlanması ve Çıktı Sağlanması

Sıradaki işlemlerimiz Views yükleyicisinin oluşturulmasına. libraries dizini içerisinde netron.php isminde bir dosya oluşturup, içerisine aşağıdaki kodları ekleyelim.

PHP:
<?php

class Netron {
    public function view($view_ismi)
    {
        if(file_exists("../application/views/" . $view_ismi . ".php")){

        require_once "../application/views/" . $view_ismi . ".php";

        }else{

            die("<div style='background-color: #f1f4f4;color:#afaaaa;border:1px dotted #afaaaa;padding: 10px; border-radius: 4px;'> <strong>". $view_ismi ."</strong> İsimli view dosyası bulunamadı</div>");
        }
    }

}

?>

Yukarıdaki bu netron.php içerisindeki kodlarımızı açıklayacak olursak, kodumuz Load View yani görünüm yükleyicisidir. Frameworkümüzün adı netron olduğu için ben yükleyicinin ismini netron olarak tanımladım. Bu kod tüm views dosyalarını otomatik bulmaya yarayan bir koddur. Eğer görüntü yükleyicisine olmayan bir view dosyası gelirse, bununda kodlayıcıya bir uyarı şeklinde görüntülenmesini sağladık. Şimdi bu dosyayı test edeceğiz. views dizini içerisine users.php adında bir dosya oluşturun ve içerisine aşağıdaki içeriği girin. Şimdilik sadece html kodları var. Biz burada şu an için sadece çıktı yapılıp yapılmadığını kontrol edeceğiz

HTML:
<h1>Users Görüntüleme</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Deleniti eveniet facere quidem. Amet at blanditiis dicta,
doloremque est illo laboriosam nam officiis possimus quisquam ratione similique, sit, sunt vel voluptatibus?</p>

Şimdi daha öncede controllers dizini içerisinde oluşturmuş olduğumuz profile.php dosyasını açıyoruz ve içerisindeki kodları aşağıdaki kodlarla değiştiriyoruz. Şu an bunların test kodları olduğunu unutmayın. İleriki bölümlerde gerçek hayata uyarlı kodlar yazacağız.

PHP:
<?php

class Profile extends Netron
{
    public function __construct()
    {

    }

    public function index()
    {
        echo "Burası profile controller içerisindeki index methodu";
    }

    public function user()
    {
        $this->view("users");
    }
}
?>

Yukarıdaki kodları çalışma mantığı şu şekildedir. Dikkat ederseniz Netron sınıfını controller'daki bu dosyamıza extends ettik. Yani artık netron.php sınıfının yani views yükleyicisini bu dosyada da kullanabileceğiz. Aksi bir durumda zaten çıktılama yapamazdık. Bundan sonra controller alanında oluşturulacak her sınıfa, Netron sınıfımızı extends edeceğiz. user methodumuza bakarsanız, view yükleyici methoduna views dizini içerisinde oluşturmuş olduğumuz dosyanın adını veriyoruz. view methodu da ilgili dizine bakıyor ve varsa böyle bir dosya o dosya üzerinden çıktılama yapmamızı sağlıyor. Şimdi tarayıcı üzerinden test edelim. Tarayıcınız da şu yolu yazınız: http://localhost/netron/profile/user Örnek çıktı aşağıdaki gibi olacaktır.

ekranciktisi_6.jpg


Peki bütün bunları yaptığımıza göre artık view dosyasına nasıl veri göndereceğiz buna bakalım. Şimdilik veritabanı işlemleri yapmayacağız ama veritabanından geliyormuş gibi bir senaryo hazırlayıp bu verileri view dosyasında görüntüleyeceğiz. Bundan önce yapmamız gereken çok önemli bir konu var. libraries dizini içerisindeki görüntüleme dosyamız olan netron.php dosyasını açıyoruz. view methodumuza bir parametre daha ekleyeceğiz. İsmini $data = [] olarak vermeniz yeterli. Örnek kod aşağıdaki gibi olacak. Bu kodu birazdan açıklayacağız.

PHP:
<?php

class Netron {

public function view($view_ismi, $data = [])
{
    if(file_exists("../application/views/" . $view_ismi . ".php")){

    require_once "../application/views/" . $view_ismi . ".php";

}else{

    die("<div style='background-color: #f1f4f4;color:#afaaaa;border:1px dotted #afaaaa;padding: 10px; border-radius: 4px;'> <strong>". $view_ismi ."</strong> İsimli view dosyası bulunamadı</div>");

        }
    }
}

?>

Şimdi verilerimizi controller üzerinden göndereceğiz. Bunun için controllers dizini içerisindeki profile.php dosyasını açıyoruz ve aşağıdaki methodu ekliyoruz.

PHP:
public function user()
{
    $data = [
    'title' => 'netr0n Framework',
    'isim'  => 'Fikret Ak',
    'sehir' => 'İstanbul'
    ];

    $this->view("users", $data);
}

Şimdi de views dizini içerisindeki users.php dosyasını açıyoruz ve içerisine aşağıdaki kodları ekliyoruz.


PHP:
<h1>Users Görüntüleme</h1>
<?php

    foreach($data as $kayitlar):
        echo $kayitlar . "<br />";
    endforeach;

?>

Şimdi tarayıcımıza http://localhost/netron/profile/user yazarak ekrandaki çıktıya bakabiliriz.

ekranciktisi_7.jpg

Evet verilerimizi de başarılı bir şekilde alabiliyoruz. netron.php sınıfımıza $data = [] olarak parametre eklemiştik. Varsayılan olarak boş bir dizi de olabilir demiş olduk. Bu sayede data göndermek istemediğimiz de de hata ile karşılaşmayacağız.
 
Model Yükleyicisinin Kodlanması ve Çıktı Sağlanması

Şimdi yeni bir bölüme geçiyoruz. Bu bölümde model yükleyicisini oluşturacağız. Bu bölümü oluşturduktan sonra, bir kaç veri göndereceğiz. Hanüz database işlemleri yapmadık ama ona göre bir senaryo yapacağız. Bu bölümden sonra database için hazırlıklarımızı yapıyor olacağız. Bu bölümü iyi anlamamız lazım. Öncelikle libraries dizini içerisindeki netron.php dosyasını açın ve içerisine aşağıdaki methodu ekleyin.

PHP:
public function model($model_ismi)
{
    if(file_exists("../application/models/" . $model_ismi . ".php")){

        require_once "../application/models/" . $model_ismi . ".php";

        $model_ismi_guncelle = ucwords($model_ismi);

        return new $model_ismi_guncelle;

    }else{

        die("<div style='background-color: #f1f4f4;color:#afaaaa;border:1px dotted #afaaaa;padding: 10px; border-radius: 4px;'> <strong>". $model_ismi ."</strong> İsimli model dosyası bulunamadı</div>");

    }
}

Yukarıdaki kodu açıklayacak olursak, views methoduna benzer bir şekilde çalıştığını görebiliriz. Bu yapıda bizim models dizini içerisindeki model dosyalarımızı bulmaya yarayan bir fonksiyondur. Peki neden biz bunu netron.php içerisinde oluşturduk? Sebebi şu, netron sınıfı bizim Model ve View dosya bulucumuz. Biz bunu ortak kullanacağız. Zaten bu dosyayı controllers dizini içerisinde bulunan sınıflara extends ettiğimiz için veri alış verişlerimizde hiçbir sıkıntı yaşamayacağız. Şimdi bir model dosyası oluşturalım. Bunun için models dizini içerisinde users.php dosyası oluşturalım ve içerisine aşağıdaki kodları ekleyelim.

PHP:
<?php

class User
{
    public function kayitlari_getir()
    {
        $ogrenciler = ['Ahmet', 'Mehmet', 'Burak', 'Cengiz'];

        return $ogrenciler;
    }
}

?>

Yukarıdaki kodu açıklayacak olursak, kayitlari_getir adında bir fonksiyon oluşturduk. Bunun içerisinde senaryomuza uygun olarak veritabanından gelmiş gibi bir dizi veri hazırladık ve bu dizi verileri $ogrenciler değişkenine depoladık ve return ettik. Bütün bunları yaptıktan sonra artık controller sınıfımız üzerinden bu sınıfı çağırıp verilerimizi view dosyamıza ileteceğiz. Bunun için controllers dizini içerisindeki profile.php dosyasını açıyoruz ve içerisine aşağıdaki methodu ekliyoruz. Daha önce böyle bir method eklediyseniz onu silip bunu eklemeniz yeterli.

PHP:
public function user()
{
    $users = $this->model("user");

    $data['ogrenciler'] = $users->kayitlari_getir();

    $this->view("users", $data);
}

Yukarıdaki kodu açıklayacak olursak, $users = $this->model("user"); bizim models dizini içerisindeki user.php dosyamızın adıdır. Zaten netron.php dosyamızdan aldığımız için ve netron.php sınıfını da buradaki dosyamıza extends ettiğimiz için bu şekilde çağırmamız yeterli olacaktır. Dikkat ederseniz modeldeki verileri $users değişkenine depoladık, depoladığımız bu veri içerisindeki method'a da şu şekilde erişiyoruz: $data['ogrenciler'] = $users->kayitlari_getir(); Buradaki method verilerini de $data['ogrenciler'] dizi değişkenine depoladık, tek yapmamız gereken, bunu hangi view dosyasına göndereceğimizi belirlemek. Bunun içinde $this->view("users", $data); diyerek, views dizini içerisindeki, users.php dosyasına gönderiyoruz. Şimdi view dosyasına gönderdiğimiz ve verileri ekranda çıktılanmasını sağlayacağız. Bunun için views dizini içerisindeki users.php view dosyasını açıyoruz ve içerisine aşağıdaki kodları yazıyoruz.

PHP:
<h1>Users Görüntüleme</h1>
<?php
    foreach($data['ogrenciler'] as $isim):
    echo $isim . "<br />";
    endforeach;
?>

Örnek ekran çıktısı aşağıdaki gibi olacaktır.

ekranciktisi_8.jpg
 
Database İşlemleri ve CRUD İçin Yardımcı Fonksiyonların Oluşturulması

Evet, dönükümanın başından beri veritabanı işlemlerimizi yapacağımızı söylemiştik. Bu bölüm veritabanı bağlantımızı ve CRUD işlemleri için yardımcı fonksiyonlar oluşturacağız ve bu fonksiyonları nasıl kullanacağımızı işleyerek göreceğiz. Öncelikle veritabanı bağlantımızı gerçekleştirecek kodlamamızı yaparak başlıyoruz. config dizini içerisindeki config.php dosyasını açın ve içerisine aşağıdaki sabit değişkenler de tutacağımız veritabanı bilgilerimizi girelim.

PHP:
/*
* Database Parametleri
*/

define('HOST', 'localhost');
define('USERNAME', 'root');
define('DATABASE', 'mvc');
define('PASSWORD', '');

Daha sonra libraries dizini içerisinde database.php adında bir dosya oluşturun ve kodlamasını aşağıdaki örnekte olduğu gibi kodlayınız.

PHP:
<?php

class Database
{

    private $host     = HOST;
    private $database = DATABASE;
    private $username = USERNAME;
    private $password = PASSWORD;
    protected $db;

    public function __construct()
    {
        try {
            $dsn = "mysql:host=" . $this->host . ";dbname=" . $this->database . ";charset=utf8";
            $this->db = new PDO($dsn, $this->username, $this->password);
        }catch(PDOException $e){
            echo "Database bağlantı hatası : " . $e->getMessage();
        }
    }
}


?>

Veritabanı bağlantı kodlarımızı yazdığımıza göre, çalışıp çalışmadığını kontrol edebiliriz. models dizini içerisindeki user.php dosyasını açıyoruz ve Database sınıfımızı User sınıfımıza extends ediyoruz. Aşağıdaki örnek koda bakabilirsiniz.

PHP:
<?php

class User extends Database
{
    public function kayitlari_getir()
    {
        $ogrenciler = ['Ahmet', 'Mehmet', 'Burak', 'Cengiz'];

        return $ogrenciler;
    }
}

?>

Herhangi bir hata ile karşılaşmıyorsak bağlantımız başarılı bir şekilde yapılmış demektir. Ama emin olmak için config dizini içerisindeki config.php dosyasını açın ve DATABASE mvc adını olmayan bir database ismi vererek yazalım. Şimdi tarayıcı üzerinden http://localhost/netron/profile/user sınıfımızı çalıştıralım eğer Database bağlantı hatası : SQLSTATE[HY000] [1049] Unknown database 'mv' hatasını görüyorsak işlemlerimiz başarılı demektir. Tekrar config.php içerisindeki database ismini düzgün bir şekilde isimlendirelim.

Şimdi phpmyadmin alanına gidelim ve mvc veritabanın da users adında bir tablo oluşturalım ve bu tablonun 3 tane sütunu olacak bu sütunlar id, isim, adres şeklinde girilecek. id auto increment türünde, isim varchar(100) ve adres varchar(600) tipinde olabilir. Şimdi libraries dizini içerisindeki database.php sınıfımızı açıyoruz öncelikle en üste bulunan database değişkenlerinin altına protected $Sorgu; değişkenmizi ekliyoruz. Daha sonra aşağıdaki genel sorgu methodumuzu yazıyoruz.

PHP:
/*
    * Bu Sorgu yöntemi tüm veritabanı sorgularını alacak yöntemdir.
*/

public function genelSorgu($sorgu, $secenekler = [])
{
    if(empty($secenekler)){

        $this->Sorgu = $this->db->prepare($sorgu);
        return $this->Sorgu->execute();

    }else{
        $this->Sorgu = $this->db->prepare($sorgu);
        return $this->Sorgu->execute($secenekler);
    }
}

Yukarıdaki kodu açıklayacak olursak, genel bir sorgu fonksiyonu olduğunu söylebiliriz. Her ne kadar tüm silme işlemi için, delete işlemi için, güncelleme işlemi için hazır fonksiyonlar yapacak olsakta, böyle bir genel sorgu da yapmak durumundayız bunu ileride açıklayacağız. Bu yukarıdaki sorgu fonksiyonumuz tüm genel sorguları kapsayacak. Bu sorgu da Oluşturma (Create), Güncelleme (Update), Okuma (Read), Silme (Delete) işelmeleri de yapabilirsiniz. Bu sorgu 2 tane parametre ister, 1. parametre olan $sorgu parametresi zorunludur, diğer 2. parametre olan $seçenekler parametresi sadece seçenektir. Seçenek yoksa sadece okuma işlemi yapılır, eğer seçenek var ise belirli bir seçeneğe yani koşula bağlı sorgular gerçekleştirir. Bunu örneklerle anlatalım. models dizini içerisindeki user.php sınıf dosyasını açın ve içerisindeki kodları aşağıdaki kodlar ile değiştirin.

PHP:
<?php

class User extends Database
{
    public function kayitEkle()
    {
        $isim   = "Emre";
        $adres  = "İstanbul";

        if($this->genelSorgu("INSERT INTO users (isim, adres) VALUES (?, ?)", [$isim, $adres])){
            return true;
        }else{
            return false;
        }
    }
}

?>

Yukarıdaki kodu açıklayalım: $isim adında bir değişken oluşturduk ve içerisine Emre ismini depoladık. $adres adında bir değişken oluşturduk ve İstanbul değerini depoladık. kayitEkle() adında bir fonksiyon oluşturduk ve Daha sonra Database sınıfımız içerisinde oluşturmuş olduğumuz genelSorgu() fonksiyonumuz içerisinde ekleme yani insert sorgumuzu yazdık. Eğer sorgu başarılı olursa, yani ekleme yapılırsa return true dedik, yok eğer ekleme başarısız olursa return false dedik. Bunu neden dediğimizi birazdan açıklayacağız. Şimdi controllers dizini içerisindeki profile.php sınıfımızı açıyoruz ve daha önce oluşturmuş olduğumuz user() fonksiyonunu aşağıdaki kodlarla değiştiriyoruz.

PHP:
public function user()
   {

       $users = $this->model("user");

       if($users->kayitEkle()){

           echo "Kayıt başarılı bir şekilde yapıldı";

       }else{

           echo "Kayıt ekleme sırasında hata oluştu";
       }


       $this->view("users");
   }

Yukarıdaki kodu açıklayalım: Burada dikkat ederseniz, database sınıfı içerisindeki genelSorgu() fonksiyonumuzu if blogları içinde tanımlamıştık. Başarılı olursa true başarısız olursa false değerleri döndürecekti. İşte burada da yani controller içerisinde de database sınıfı içerisindeki oluşturmuş olduğumuz $users->kayitEkle() fonksiyonunu controller içerisinde de if blogları içerisinde alıyoruz ki, dönen değer true olursa, echo "Kayıt başarılı bir şekilde yapıldı"; true mesajını döndürsün. False olursa da echo "Kayıt ekleme sırasında hata oluştu"; false mesajını döndürsün. Buraya kadar her şeyi anladığınızı umuyoruz. Şimdi tarayıcımıza giderek http://localhost/netron/profile/user olarak çalıştırıyoruz. Aşağıdaki çıktıyı almamız lazım.

ekranciktisi_9.jpg

phpmyadmin içerisindeki users tablosuna baktığımız da ise kaydın eklendiğini görebiliriz.

ekranciktisi_10.png

Şimdi de silme işlemi yapalım. models dizini içerisindeki user.php sınıfımızı açıyoruz ve kayitEkle() fonksiyonumuzu aşağıdaki fonksiyon kodları ile değiştirelim.


PHP:
public function kayitSil()
{
    $id = 6;

    if($this->genelSorgu("DELETE FROM users WHERE id = ? ", [$id])){
            return true;
        }else{
            return false;
        }
    }
}

Şimdi controllers dizini içerisindeki profile.php sınıfımızı açıyoruz ve user() fonksiyonumuzu aşağıdaki fonksiyon kodları ile değiştiriyoruz.

PHP:
public function user()
{

    $users = $this->model("user");

    if($users->kayitSil()){

        echo "Kayıt başarılı bir şekilde silindi";

    }else{

        echo "Kayıt silme sırasında hata oluştu";
    }


    $this->view("users");
}

Şimdi tarayıcımız da http://localhost/netron/profile/user sınıfımızı çalıştırarak aşağıdaki silme başarılı mesajı görüntüleyebiliriz ve phpmyadmin alanına baktığımız da da kaydın silindiğini görebiliriz.

Sıradaki fonksiyonumuz, yine database sınıfı içerisinde oluşturulacak, görevi ise, veritabanındaki berlirteceğimiz tablo içerisinde kaç tane kaydın olduğunu bulacak ve bulduğu değeri geriye döndürecek. Bunun için libraries dizini içerisindeki database.php sınıfımızı açıyoruz ve genelSorgu() fonksiyonumuzu altın da aşağıdaki fonksiyonumuzu yazıyoruz.

PHP:
/*
    * TabloSatirSayisi fonksiyonu, belirtilen tablodaki satır sayısını sayar
*/

public function TabloSatirSayisi($tablo_ismi)
{
    $this->Sorgu = $this->db->prepare("SELECT * FROM " . $tablo_ismi);
    $this->Sorgu->execute();
    return $this->Sorgu->rowCount();
}

Şimdi de models dizini içerisindeki user.php sınıfımızı açıyoruz ve içerisindeki kodları aşağıdaki kodlar ile değiştiriyoruz.

PHP:
<?php

class User extends Database
{
    public function kayitSayisi()
    {
       return $this->TabloSatirSayisi("users");
    }
}

?>

Yukarıdaki koda bakacak olursak, fonksiyonumuz bizden sadece içerisindeki kayıtları saydırmak istediğimiz tablonun adını istemektedir. Şimdi controllers dizini içerisindeki profile.php sınıfımızı açıyoruz ve user() fonksiyonunu aşağıdaki fonksiyon kodları ile değiştiriyoruz.

PHP:
public function user()
{
    $users = $this->model("user");

    echo "Tablonuzdaki Toplam Kayıt Sayısı : " .  $users->kayitSayisi();

    $this->view("users");
}

Yukarıdaki koda bakacak olursak, models dizini içerisindeki user.php sınıfımızdaki kayitSayisi(); fonksiyonumuzu çağırıyoruz ve $this->view("users"); view dosyasına çıktılanmasını sağlıyoruz. Şimdi tarayıcı da http://localhost/netron/profile/user olarak çağırdığımız da aşağıdaki kayıt sayısını elde etmiş oluyoruz.

ekranciktisi_12.jpg

Şimdi de en başta oluşturduğumuz genelSorgu() fonksiyonuna bağlı olacak ama ayrı bir getirme fonksiyonu olan tüm kayıtları getirmek için kullacağımız fetchAll methodumuzu yazalım. Bunun için libraries dizini içerisindeki database.php sınıfımızı açalım ve en aşağısına aşağıdaki fonksiyonumuzu yazalım.

PHP:
/*
    * Belirtilecek olan tablodaki tüm kayıtları getirme sorgu fonksiyonu,
     yukarıdaki genelSorgu() fonksiyonu ile bağlantılı çalışır.
*/

public function tumKayitlar()
{
    return $this->Sorgu->fetchAll(PDO::FETCH_OBJ);
}

Şimdi models dizini içerisindeki user.php sınıfımızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim.

PHP:
<?php

class User extends Database
{
    public function tumKayitlariGetir()
    {
       if($this->genelSorgu("SELECT * FROM users")){

            return $this->tumKayitlar();

       }
    }
}

?>


Yukarıdaki yazdığımız fonksiyon kodlarını açıklayalım: tumKayitlariGetir() adında bir fonksiyon oluşturduk ve if blogları içerisinde genelSorgu() fonksiyonumuz içerisinde sorgumuzu yazdık ve return ile de tüm verileri çekebileceğimiz $this->tumKayitlar() fonksiyonumuzu geriye döndürdük. Şimdi controllers dizini içerisindeki profile.php sınıfımızı açıyoruz ve user fonksiyonumuzu aşağıdaki fonksiyon kodları ile değiştiriyoruz.

PHP:
public function user()
{

    $users = $this->model("user");

    $data['users'] = $users->tumKayitlariGetir();

    $this->view("users", $data);

}

Yukarıdaki yazdığımız fonksiyon kodlarını açıklayalım: models dizini içerisindeki user.php dosyasını $this->model("user") diyerek çağırıyoruz ve gelen bu sınıf verilerini $users değişkenine depoluyoruz. Daha sonra models dizini içerisindeki user.php sınıfımızın içerisindeki $users->tumKayitlariGetir(); fonksiyonumuzu $data['users'] dizi değişkenine depoluyoruz. Daha sonra bunu views dizini içerisindeki users.php views dosyasına $this->view("users", $data); göndererek çıktılamasını sağlıyoruz. Şimdi de views dizini içerisindeki users.php dosyasını açarak alınan verilerin çıktınlanması için kodlarımızı aşağıdaki gibi yazalım.


PHP:
<h1>Kayıtlı Kullanıcılar</h1>

<?php
    foreach($data['users'] as $user):

        echo $user->isim . "<br />";
        echo $user->adres . "<br /><hr />";

    endforeach;
?>

Şimdi tarayıcımız da ilgili http://localhost/netron/profile/user url'i çalıştıralım ve aşağı da görüldüğü gibi verilerin geldiğini görebiliriz.

ekranciktisi_13.jpg

Şimdi yeni sorgu fonskiyonumuzu yazacağız bu sorgu da genelSorgu() fonksiyonumuz ile bağlantılı bir şekilde çalışacak. Bu sorgu ile ne amaçlıyoruz; Tek satır kayıtları elde etmek için kullanacağız. Yani koşula bağlı fonksiyonlar. Örneğin id'si 1 olan veya ismi şu olan where koşuluna bağlı tek satır sorgular da kullanacağız. Bunun için libraries dizini içerisindeki database.php sınıf dosyamızı açıyoruz ve en aşağısına aşağıdaki fonksiyonu ekliyoruz.


PHP:
/*
    * Row yani tek satır kayıtları getirmek için kullanacağımız fonksiyon. genelSorgu() fonksiyonu ile bağlantılı çalışır
*/

public function tekSatirKayit()
{
    return $this->Sorgu->fetch(PDO::FETCH_OBJ);
}

Şimdi models dizini içerisindeki user.php sınıf dosyamızı açıyoruz ve içerisindeki tüm kodları aşağıdaki kodlar ile değiştiriyoruz.

PHP:
<?php

class User extends Database
{
    public function tekSatirKayitGetir()
    {
        $id = 1;

       if($this->genelSorgu("SELECT * FROM users WHERE id = ?", [$id])){

            return $this->tekSatirKayit();

       }
    }
}

?>

Yukarıdaki kodları açıklayalım: tekSatirKayitGetir() fonksiyonu oluşturduk ve $id = 1 olarak bir id belirledik. genelSorgu içerisinde SQL sorgumuzu gerçekleştirdik. Burada where id ? = 1 diyerek 1. id verisine sahip kaydı getirmesini söyledik. Bir kayıt getireceğimiz için fetch methodu oluşturduğumuz return $this->tekSatirKayit(); fonksiyonumuzu geriye dönder dedik. Şimdi controllers içerisindeki profile.php sınıfımızı açarak user fonksiyon kodlarını aşağıdaki kodlar ile değiştirelim.

PHP:
public function user()
{

    $users = $this->model("user");

    $data['users'] = $users->tekSatirKayitGetir();

    $this->view("users", $data);

}

Yukarıdaki kodları açıklayalım: models dosyamızı $users = $this->model("user"); diyerek çağırdık ve $data['users'] dizi değişkenine depoladık. Daha sonra $this->view("users", $data); diyerek views dizini içerisindeki users.php dosyasına gönderdik. Şimdi views dizini içerisindeki users.php dosyasını açalım ve içerisine aşağıdaki kodları ekleyelim.

PHP:
<h1>Kayıtlı Kullanıcı</h1>

<?php
        echo  $data['users']->isim . "<br />";
        echo  $data['users']->adres;
?>


Çıktıyı görmek için http://localhost/netron/profile/user url'ini tarayıcı da çalıştırıyoruz ve örnek ekran çıktısı aşağıdaki gibi olacaktır.

ekranciktisi_14.jpg

Şimdi database.php sınıfı içerisinde yeni bir method oluşturacağız. Biliyorsunuz bizim daha önce oluşturmuş olduğumuz bir TabloSatirSayisi() methodumuz bulunmaktaydı ama biz bu methodu genelSorgu() methodumuzla birlikte kullanamayız. Çünkü TabloSatirSayisi() methodu kendi içerisinde bir sorgu istemektedir. Bu sebeple biz yeni bir satır saydırma methodu yazacağız ve bunu genelSorgu() methodumuzda kullanabileceğiz. Bunun için database.php sınıfımızı açıyoruz ve TabloSatirSayisi() methodumuzun hemen üstüne aşağıdaki satirSay() methodumuzu ekliyoruz.

PHP:
/*
    * satirSay methodu tablodaki satır sayısını sayar. Bunu neden oluşturduk; genelSorgu fonksiyonu ile birlikte kullanmak için.
*/

public function satirSay()
{
    return $this->Sorgu->rowCount();
}

Şimdi bir senaryo ile sorgumuz da bir koşul belirteceğiz. Gelen istekte veritabanımız da böyle bir isme ait kayıt var mı yok mu onun kontrolünü sağlayacağız bunun için ilgili kodlarımızı yazalım. models dizini içerisindeki user.php sınıfımızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim.


PHP:
<?php
class User extends Database
{
    public function tekSatirKayitGetir()
    {
        $isim = "Fikret";

       if($this->genelSorgu("SELECT * FROM users WHERE isim = ?", [$isim])){

            if($this->satirSay() == 0){

                echo "Kayıt Bulanamadı";

            }else{

                echo "Kayıt bulundu";
            }
       }
    }
}

?>

Yukarıdaki kodu açıklayacak olursak; Fikret isminde bir üye var mı dedik. satirSay() fonksiyonumuz ne yapıyordu tablodaki kayıt sayısını bize veriyordu. Bizde burada eğer satır sayısı eşitse 0 değerine o zaman kayıt bulanamadı yaz yok eğer kayıt eşit değilse 0 değerine o zaman da kayıt bulundu yaz. Biz model dosyamız içerisinde echo dediğimiz için profile.php sınıfımız içerisinde model methodumuzu çağırmamız yeterli olacaktır. Bunun için controllers dizini içerisindeki profile.php sınıf dosyamızı açıyoruz ve user methodumuzu aşağıdaki kodlar ile değiştiriyoruz.

Şimdi de http://localhost/netron/profile/user url'i tarayıcımız üzerinden açıyoruz ve ilgili kaydın olup olmadığı çıktısını elde ediyoruz. Örnek ekran çıktısı aşağıdaki gibi olacaktır.

ekranciktisi_15.jpg

Şimdi de sadece Select sorguları için bir sorgu methodu yazacağız. Neden select methodu yazmamız gerekli, çünkü bazı durumlarda tablodaki tüm kayıtları almaktansa belirteceğimiz column isimleriyle verileri çekmek isteyebiliriz. Hem daha hızlı çalışan sorgu olmuş olur hem de sistemizi daha az yoracak sorgular yazmış oluruz. Bu sorgu methodumuzu yazmak için yine libraries dizini içerisindeki database.php sınıf dosyamızı açıyoruz ve altına aşağıdaki kodları ekliyoruz.


PHP:
/*
    * Sadece select sorgusu methodu ve tek tek column isimlerini vermek için kullanacağız.
*/

public function Select($tablo_ismi, $secenekler = "")
{
if(empty($secenekler)){

    $this->Sorgu = $this->db->prepare("SELECT * FROM " . $tablo_ismi);
    return $this->Sorgu->execute();

}else{

    $this->Sorgu = $this->db->prepare("SELECT " . $secenekler . " FROM " . $tablo_ismi);
    return $this->Sorgu->execute();
}
}

Yukarıdaki koda dikkat ederseniz Select methodumuz bizden 2 tane parametre istemekte, bunlardan 1. parametre $tablo_ismi 2. olan ise $secenekler parametresi. Ayrıca $tablo ismi kesin ve kesin belirtilecek eğer bir sütun yani tablodaki column ismi belirtilerek sorgu yapılacak ise, o zaman da 2. parametre olan $secenekler parametresine bu column isimlerinin gönderilmesi gerekecek. Biz burada column isim gönderimlerini isteğe bağlı bir seçenek olarak belirttiğimiz için burada seçenek parametresine varsayılan olarak $secenekler = "" boşta gelebilir demiş olduk. Aksi durumda boş demeseydik, bizden o değeri muhakkak isteyecekti. Şimdi models dizini içerisindeki user.php sınıf dosyamızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim.

PHP:
<?php
class User extends Database
{
    public function tumKayitlariGetir()
    {
        if($this->Select("users")){
            $kayitlar = $this->tumKayitlar();
            echo "<pre>";
            print_r($kayitlar);
            echo "</pre>";
        }
    }
}

?>


Şimdi controllers dizini içerisindeki profile.php sınıf dosyamızı açalım ve içerisindeki user methodunu aşağıdaki method ile değiştirelim.

PHP:
public function user()
{
    $users = $this->model("user");

    $data['users'] = $users->tumKayitlariGetir();

    $this->view("users");

}

Ekran çıktısı almak için http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki ekran çıktı örneğinde olduğu gibi verilerimizin geldiğini görebiliriz.

ekranciktisi_16.jpg

Tabi Select() methodumuzun amacı bu değildi zaten bu olsa boşu boşuna yazmış olurduk aynı sorguyu genelSorgu() methodu ile de yapabilirdik. Bu örneği de vermek istedik ki, Select() methodumuzun farkının ne olduğunu, şimdi yazacağımız kodlarla daha iyi anlamış olalım. models dizini içerisindeki user.php sınıf dosyamızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim.

PHP:
<?php
class User extends Database
{
    public function tumKayitlariGetir()
    {
        if($this->Select("users", "isim,adres")){
            $kayitlar = $this->tumKayitlar();
            echo "<pre>";
            print_r($kayitlar);
            echo "</pre>";
        }
    }
}

?>

Şimdi yukarıdaki kodun farkını ve aslında ne yapmak istediğimizi daha iyi anlayacağız. Burada görüldüğü üzere kodumuzdaki tek değişiklik, seçenekler parametresine şu şekilde Select("users", "isim,adres") tablomuzdaki column isimlerini de vererek buna göre bir sorgu gerçekleştirmiş olduk. Bir üst örnekte gelen verilerin id değerleri de gelirken biz isim ve adres column değerlerini getir dediğimiz için aşağıdaki çıktı da görüldüğü üzere bize sadece isim ve adres değerlerinin getirildiğini görebiliriz.

ekranciktisi_17.jpg
 
Dikkat: Yukarıdaki konunun devamıdır ve önemli bir sorgu methodudur adım adım ilerleyeceğiz!

Sırada önemli bir sorgu methodumuz var. Bu method bizim koşula bağlı çalışan methodumuz olacak. Bu koşula bağlı methodumuz yazalım. Bunu adım adım yapacağız. libraries dizini içerisindeki database.php sınıfımızı açalım ve adım adım kodlarımızı yazmaya başlayalım. Bizim normal düzen de koşula bağlı olarak çalışan SQL sorgumuz aşağıdaki şekilde olabilirdi.

PHP:
<?php

    $this->Sorgu = $this->db->prepare("SELECT * FROM users WHERE id = ? AND isim = ? ");
    $this->Sorgu->execute([$id, $isim]);

?>

Biz yukarıdaki sorgu yerine kendimize özgü koşula bağlı bir sorgu methodu yazacağız bunu adım adım anlatacağız bu sayede daha iyi anlamış olacaksınız. Öncelikle database.php sınıf dosyamızın en üstüne aşağıdaki kodu yazalım. Bu kod hata çıktılamasını önleyecektir. Çünkü doğrudan değişkenler tanımlayacağız bunlar hataya sebebiyet vermemesi için error_reporting kullandık.

PHP:
 error_reporting(0);

Şimdi models dizini içerisindeki user.php dosyamızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim. Aşağıdaki bu kod ile Select_Where() methodumuza id koşulunu ve isim koşulunu değerleri ile birlikte gönderdik. Bu burada bizi beklesin. Buna ileride değineceğiz.

PHP:
<?php
class User extends Database
{
    public function tekSatirKayitGetir()
    {
        $this->Select_Where("users", ['id' => 1, 'isim' => 'Fikret']);
    }
}

?>

Şimdi database.php sınıf dosyamızın en altına aşağıdaki fonksiyonu oluşturalım.

PHP:
public function Select_Where($tablo_ismi, $secenekler)
{

}

Şimdi bu fonksiyon bizden iki tane parametre istiyor. 1. parametre olan $tablo_ismi bizden tablo ismi bekliyor. 2. Parametre olan $secenekler ise bizden bir koşul parametresi bekliyor. Buraya kadar anladığımıza göre şimdi Select_Where() methodu içerisinde 1. tane değişken oluşturalım ve adına $columns_ismi verelim ve foreach döngüsü yardımı ile değerleri alalım.

PHP:
public function Select_Where($tablo_ismi, $secenekler)
{
    $columns_ismi;
    $db_degeri;

    foreach($secenekler as $anahtar => $degeri):

        $columns_ismi .= $anahtar . " = ? AND ";


        //$db_degeri .= $degeri . ",";
    endforeach;

    print_r($columns_ismi);
}

Şimdi tarayıcı üzerinden http://localhost/netron/profile/user url'i çalıştıralım ve aşağıdaki gibi bir çıktı alalım.

Kod:
id = ? AND isim = ? AND

PHP:
public function Select_Where($tablo_ismi, $secenekler)
{
    $columns_ismi;
    $db_degeri;

    foreach($secenekler as $anahtar => $degeri):

        $columns_ismi .= $anahtar . " = ? AND ";

    endforeach;

    $columns_ismi = rtrim($columns_ismi, " AND ");

    print_r($columns_ismi);
}


Şimdi tarayıcı üzerinden http://localhost/netron/profile/user url'i çalıştıralım ve aşağıdaki gibi bir çıktı alalım. Sonundaki AND ifadesinin kalktığını görebiliriz.

Kod:
id = ? AND isim = ?

Şimdi foreach döngüsü ile gelen değerleri almak için $columns_ismi; değişkeninin altında $db_degeri; adında bir değişken oluşturalım ve benzer işlemleri buna da uygulayalım. Örnek kodumuz aşağıdaki gibi olacak. Burada yaptığımız ise döngüden gelen değeri alıyoruz ve sonundaki virügülü sildiriyoruz.

PHP:
public function Select_Where($tablo_ismi, $secenekler)
{
    $columns_ismi;
    $db_degeri;

    foreach($secenekler as $anahtar => $degeri):

        $columns_ismi .= $anahtar . " = ? AND ";

        $db_degeri .= $degeri . ",";
    endforeach;

    $columns_ismi = rtrim($columns_ismi, " AND ");

    $db_degeri = rtrim($db_degeri, ",");
}

Kodumuzun bitmiş hali aşağıdaki gibi olacaktır.

PHP:
public function Select_Where($tablo_ismi, $secenekler)
{
    $columns_ismi;
    $db_degeri;

    foreach($secenekler as $anahtar => $degeri):

        $columns_ismi .= $anahtar . " = ? AND "; // id = ? AND isim = ? AND
        // print_r($degeri); //1Fikret

        $db_degeri .= $degeri . ",";

    endforeach;

    $columns_ismi = rtrim($columns_ismi, " AND "); // id = ? AND isim = ?

   // print_r($columns_ismi);

   // print_r($db_degeri); // 1,Fikret,

    $db_degeri = rtrim($db_degeri, ",");

   // print_r($db_degeri); // 1,Fikret

    $db_degeri = explode(",", $db_degeri);

   // print_r($db_degeri); // Array ( [0] => 1 [1] => Fikret )

    $this->Sorgu = $this->db->prepare("SELECT * FROM " . $tablo_ismi . " WHERE " . $columns_ismi);
    return $this->Sorgu->execute($db_degeri);

    }
}

Kodumuzu açıklayacak olursak: $db_degeri = rtrim($db_degeri, ","); ile sonundaki virgülü kaldırdık $db_degeri = explode(",", $db_degeri); ile de virgülden itibaren parçalayıp dizi haline çevirdik. return $this->Sorgu->execute($db_degeri); methoduna da bu diziyi gönderdik. Şimdi models dizini içerisindeki user.php dosyamızı açalım içerisine aşağıdaki kodları ekleyelim.

PHP:
<?php
class User extends Database
{
    public function tekSatirKayitGetir()
    {
        $this->Select_Where("users", ['id' => 1, 'isim' => 'Fikret']);

        $user = $this->tekSatirKayit();

        echo "";
        print_r($user);
        echo "";
    }
}

?>

Şimdi tarayıcı üzerinden http://localhost/netron/profile/user url'i çalıştıralım ve aşağıdaki gibi bir çıktı alalım. Bunu yapmadan önce tekSatirKayitGetir() fonskiyonu profile.php içerisindeki user() methodun da tanımlanmış mı kontrol ediniz. Tanımlanmış ise aşağıdaki çıktıyı alabilirsiniz. Sorgumuz başarılı bir şekilde çalışmaktadır.

ekranciktisi_18.jpg
 

Silme Delete Metdou.​


Sıradaki methodumuz ise, koşula bağlı silme methodudur. Diğer Select_Where() fonksiyonumuzdan hiç bir farkı yok. database.php sınıfımızın en aşağısına aşağıdaki kodları olduğu gibi ekleyiniz.

PHP:
public function Delete($tablo_ismi, $secenekler)
{
    $columns_ismi;
    $db_degeri;

    foreach($secenekler as $anahtar => $degeri):

        $columns_ismi .= $anahtar . " = ? AND "; // id = ? AND isim = ? AND
        // print_r($degeri); //1Fikret

        $db_degeri .= $degeri . ",";
    endforeach;

    $columns_ismi = rtrim($columns_ismi, " AND "); // id = ? AND isim = ?

    // print_r($columns_ismi);

    // print_r($db_degeri); // 1,Fikret,

    $db_degeri = rtrim($db_degeri, ",");

    // print_r($db_degeri); // 1,Fikret

    $db_degeri = explode(",", $db_degeri);

    // print_r($db_degeri); // Array ( [0] => 1 [1] => Fikret )

    $this->Sorgu = $this->db->prepare("DELETE FROM  " . $tablo_ismi . " WHERE " . $columns_ismi);
    return $this->Sorgu->execute($db_degeri);

}

Daha sonra models dizini içerisindeki user.php sınıf dosyasını açıp içerisindeki kodları aşağıdaki kodlarla değiştiriniz.

PHP:
<?php
class User extends Database
{
    public function kayitSil()
    {
        if($this->Delete("users", ['id' => 1, 'isim' => 'Fikret'])){
            return true;
        }else{
            return false;
        }
    }
}

?>

Son olarak controllers dizini içerisindeki profile.php sınıf dosyasını açın ve içerisindeki user() fonskiyonunu aşağıdaki kodlar ile değiştiriniz.

PHP:
public function user()
{

    $users = $this->model("user");

    if($users->kayitSil()){
        echo "Kayıt Başarıyla Silindi";
    }else{
        echo "Kayıt silme sırasında hata oluştu";
    }

    $this->view("users");


}

Tarayıcınız da http://localhost/netron/profile/user url'i çalıştırdığınız da aşağıdaki silindi mesajını görebilirsiniz.

ekranciktisi_19.jpg
 
Güncelleme (Update) methodu.

Sıradaki methodumuz ise, koşula bağlı güncelle methodudur. Bu da çok önemli bir sorgudur. Bu anlatımı da bütün halinde değil daha iyi anlamanız adına adım adım anlatacağız. Normal de bir güncelleme SQL sorgusu aşağıdaki gibi olabilirdi.

PHP:
$this->Sorgu = $this->db->prepare("UPDATE users SET isim = ?, adres = ? WHERE id = ?");
$this->Sorgu->execute([$isim, $adres, $id]);

Ama her seferinde uzun uzadıya kodlar yazmaktansa, bir fonksiyon oluşuturup, MVC yapısına daha uygun sorgu kodları yazabiliriz. Şimdi bunu yapalım. Öncelikle models dizini içerisindeki user.php sınıf dosyamızı açalım ve içerisindeki kodları aşağıdaki kodlar ile değiştirelim.

PHP:
<?php
class User extends Database
{
    public function kayitSil()
    {
        $isim   = "Emre"; 
        $adres  = "İstanbul";
        $id     = 3;

        $this->Update("users", ['isim' => $isim, 'adres' => $adres], ['id' => $id]);
    }
}

?>

Yukarıda bir formdan gelen veri varmış gibi kendimiz veriler tanımladık ve bunu şimdi oluşturacağımız Update() methoduna gönderiyoruz. Dikkat ederseniz Update() methodu bizden 3 tane parametre istiyor. O halde bu methodu oluşturmak için libraries dizini içerisindeki database.php sınıf dosyamızı açalım ve en aşağısına aşağıdaki method kodlarını yazalım.

PHP:
/*
    * Update Methodu
*/

public function Update($tablo_ismi, $set_edilecek_array, $secenekler)
{
    print_r($set_edilecek_array);
}

Daha sonra controllers dizini içerisindeki profile.php sınıfımızı açalım ve içerisindeki user() fonskiyonumuzu aşağıdaki gibi düzenleyelim.

Şimdi tarayıcımız da http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki çıktıyı alalım.

ekranciktisi_20.jpg

Görüldüğü üzere model'den gelen sütun (column) değerlerini dizi şeklinde alabiliyoruz. O zaman bu sütunları bir döngü yardımıyla alalım. Update methodumuzun yeni kodlama hali aşağıdaki gibi olacaktır.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):
        print_r($anahtar);
    endforeach;

}

Şimdi tarayıcımız da http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki çıktıyı alalım.

ekranciktisi_21.jpg

Sütün isimlerini de döngü ile alma işlemimizi yaptığımıza göre, şimdi de sütun (columns) değerlerini soru işareti olarak eklemesini yapalım. $set_edilecek_sutunlar diye bir değişken oluşturmuştuk. Şimdi bu değişkene anahtar ile gelen değişken değerini birleştirerek bir de değer ataması yapalım. Update methodumuzun yeni hali aşağıdaki gibi olacak.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";

    endforeach;
    print_r($set_edilecek_sutunlar);

}

Şimdi tarayıcımız da http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki çıktıyı alalım. Gördüğünüz gibi değer alan soru işaretlerimizde gelmiş oldu.

ekranciktisi_22.jpg

Yukarıdaki çıktıya baktığımız da değer gelecek (?) soru işaretinin en sonunda da (,) virgül karakterini görebiliriz. Bunu rtrim fonksiyonu yardımıyla temizleyelim. Örnek kodumuzun yeni hali aşağıdaki gibi olacak.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    print_r($set_edilecek_sutunlar);

}

Şimdi tarayıcımız da http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki çıktıyı alalım. Gördüğünüz gibi değer alan soru işareti ifademizin sonundaki virgül gitmiş oldu.

ekranciktisi_23.jpg

Sütun (column) isimlerini aldığımıza göre şimde bu soru işaretlerine göndereceğimiz değerleri alalım. Bunun için $set_edilmis_degerler; diye bir yeni değişken oluşturduk ve döngüden gelen $degerler değişkeninden gelen değerleri $set_edilmis_degerler değişkeni ile birleştirdik ve sonuna "," virgül ekledik. print_r($set_edilmis_degerler); dedikten sonra Update methodumuzun yeni hali aşağıdaki gibi olmuş oldu.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;
    $set_edilmis_degerler;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";
        $set_edilmis_degerler  .= $degerler . ",";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    print_r($set_edilmis_degerler);

}

Şimdi tarayıcımız da http://localhost/netron/profile/user url'ini çalıştıralım ve aşağıdaki çıktıyı alalım. Gördüğünüz gibi gelen değerlerin en sonunda da bir virgül fazla geliyor gibi görünebilir ama bizim istediğimiz şeyde tam da bunun olması zaten. Execute methodumuza gönderirken işimize yarayacak şimdi böyle kalsın ilerleyen bölümlerde execute ederken daha iyi anlayacaksınız.

ekranciktisi_24.jpg

Şimdi WHERE koşulumuza denk gelecek değerleri yakalayalım. Bunun için $where_sutunlar diye yeni bir değişken oluşturduk ve yeni bir döngü ile $seçenekler parametresinden WHERE koşulunun değerlerini aldık. Bu değerin anahtarını $where_sutunlar değişkeni ile birleştirdik ve bu değerin sonuna da " = ? AND "; koşulunu ekledik. Döngü de olduğu için sonuna bir AND ifadesi daha ekleyeceği için bu AND ifadesini de rtrim ile kaldırdık. Sonra ekranda görmek için print_r($where_sutunlar); dedik.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    $where_sutunlar;

    foreach($secenekler as $anahtar => $degerler):

        $where_sutunlar  .= $anahtar . " = ? AND ";

    endforeach;

    $where_sutunlar = rtrim($where_sutunlar, " AND");

    print_r($where_sutunlar);

}


Şimdi ekran da görelim.

ekranciktisi_25.jpg

Where ifadesine gelen id anahtar değerini aldığımıza göre şimdi de id anahtarının taşıdığı değeri almamız gerekiyor. Bunun için $where_degerleri adında bir değişken oluşturduk ve döngüden gelen değerleri $where_degerleri .= $degerler . ","; diyerek birleştirerek ekledik. Daha sonra $birlestirilmisSorguDegerleri = $set_edilmis_degerler.$where_degerleri; değerler diyerek set edilmiş değerlerle, where koşul değerlerini birleştirerek yeni bir değişken olan $birlestirilmisSorguDegerleri değişkenine depoladık. Daha sonra bu değerin sonunda gelen fazla virgül değerini $birlestirilmisSorguDegerleri = rtrim($birlestirilmisSorguDegerleri, ","); diyerek sildirdik. Ekranda görmek için print_r($birlestirilmisSorguDegerleri); değişkenini dizi şekilde yazdırdık.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;
    $set_edilmis_degerler;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";
        $set_edilmis_degerler  .= $degerler . ",";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    $where_sutunlar;
    $where_degerleri;

    foreach($secenekler as $anahtar => $degerler):

        $where_sutunlar  .= $anahtar . " = ? AND ";
        $where_degerleri .= $degerler . ",";

    endforeach;

    $where_sutunlar = rtrim($where_sutunlar, " AND");
    $birlestirilmisSorguDegerleri = $set_edilmis_degerler.$where_degerleri;
    $birlestirilmisSorguDegerleri = rtrim($birlestirilmisSorguDegerleri, ",");

    print_r($birlestirilmisSorguDegerleri);

}

Ekran çıktısı:

ekranciktisi_26.jpg

Şimdi bu gelen değerleri explode yardımı ile parçalayıp dizi haline çevirelim. örnek kodlar

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;
    $set_edilmis_degerler;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";
        $set_edilmis_degerler  .= $degerler . ",";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    $where_sutunlar;
    $where_degerleri;

    foreach($secenekler as $anahtar => $degerler):

        $where_sutunlar  .= $anahtar . " = ? AND ";
        $where_degerleri .= $degerler . ",";

    endforeach;

    $where_sutunlar = rtrim($where_sutunlar, " AND");
    $birlestirilmisSorguDegerleri = $set_edilmis_degerler.$where_degerleri;
    $birlestirilmisSorguDegerleri = rtrim($birlestirilmisSorguDegerleri, ",");
    $SetveWhereDegerleri = explode(",", $birlestirilmisSorguDegerleri);

    print_r($SetveWhereDegerleri);

}

Ekran çıktısı:

ekranciktisi_27.jpg

Şimdi bu gelen değerleri oluşturduğumuz sorguya aktaracağız. Örnek kod aşağıya eklendi.

PHP:
public function Update($tablo_ismi, $set_edilecek_sutun_array, $secenekler)
{
    $set_edilecek_sutunlar;
    $set_edilmis_degerler;

    foreach($set_edilecek_sutun_array as $anahtar => $degerler):

        $set_edilecek_sutunlar .= $anahtar . " = ?,";
        $set_edilmis_degerler  .= $degerler . ",";

    endforeach;

    $set_edilecek_sutunlar = rtrim($set_edilecek_sutunlar, ",");

    $where_sutunlar;
    $where_degerleri;

    foreach($secenekler as $anahtar => $degerler):

        $where_sutunlar  .= $anahtar . " = ? AND ";
        $where_degerleri .= $degerler . ",";

    endforeach;

    $where_sutunlar = rtrim($where_sutunlar, " AND");
    $birlestirilmisSorguDegerleri = $set_edilmis_degerler.$where_degerleri;
    $birlestirilmisSorguDegerleri = rtrim($birlestirilmisSorguDegerleri, ",");
    $SetveWhereDegerleri = explode(",", $birlestirilmisSorguDegerleri);

    $this->Sorgu = $this->db->prepare("UPDATE ". $tablo_ismi . " SET " .$set_edilecek_sutunlar . " WHERE " . $where_sutunlar);
    return $this->Sorgu->execute($SetveWhereDegerleri);

}

models dizini içerisindeki user.php dosyasını açıyoruz içerisindeki kodları aşağıdaki kodlar ile değiştiriyoruz.

PHP:
<?php
class User extends Database
{
    public function KayitGuncelleme()
    {
        $isim   = "Emre";
        $adres  = "ankara";
        $id     = 2;

        if($this->Update("users", ['isim' => $isim, 'adres' => $adres], ['id' => $id])){
            return true;
        }else{
            return false;
        }
    }
}

?>


controllers dizini içerisindeki profile.php dosyasını açıyoruz içerisindeki user() fonksiyonunu aşağıdaki kodlar ile değiştiriyoruz.

PHP:
public function user()
{

    $users = $this->model("user");

    if($users->KayitGuncelleme()){
        echo "Kayıt Başarıyla güncellendi";
    }else{
        echo "Kayıt güncelleme sırasında hata oluştu";
    }

    $this->view("users");

}

Ekran çıktısı:

ekranciktisi_28.jpg
 
Insert (Kayıt Ekleme) Methodu.

Şimdiki fonksiyonumuz ekleme işlemlerimizi yapacağımız yardımcı fonksiyonumuzun kodlaması. Bu methodu güncellemede olduğu gibi uzun uzadıya yazmayacağız. Güncelleme alanında zaten nasıl bir mantık kurulduğunu detaylıca anlattık. Normal şartlarda ekleme SQL sorgusu aşağıdaki gibi yapılmakta ama biz bunu mvc yapısına uygun hale getireceğiz.

PHP:
$this->Sorgu = $this->db->prepare("INSERT INTO users (isim, adres) VALUES (?,?)");
$this->Sorgu->execute([$isim, $adres]);

Ekleme method kodlarımızı database.php sınıfımıza ekliyoruz.

PHP:
/*
    * Insert Ekleme Methodu
*/

public function Ekle($table_ismi, $sutun_degerleri)
{
$sutunlar;
$soruIsaretiDegerTutucusu;
$soruIsaretiDegerTutucusuDegeri;
foreach($sutun_degerleri as $anahtar => $degerler):

    $sutunlar .= $anahtar . ",";
    $soruIsaretiDegerTutucusu .= str_replace($anahtar, "?,", $anahtar);
    $soruIsaretiDegerTutucusuDegeri .= $degerler . ",";

endforeach;

$sutunlar = rtrim($sutunlar, ",");
$soruIsaretiDegerTutucusu = rtrim($soruIsaretiDegerTutucusu, ",");
$soruIsaretiDegerTutucusuDegeri = rtrim($soruIsaretiDegerTutucusuDegeri, ",");
$soruIsaretiDegerTutucusuDegeri = explode(",", $soruIsaretiDegerTutucusuDegeri);

$this->Sorgu = $this->db->prepare("INSERT INTO " . $table_ismi . "(" . $sutunlar . ") VALUES (" . $soruIsaretiDegerTutucusu .")");
return $this->Sorgu->execute($soruIsaretiDegerTutucusuDegeri);


}

models dizini içerisindeki user.php sınıf kodlarımızı aşağıdaki kodlar ile değiştiriyoruz.

PHP:
<?php
class User extends Database
{
    public function Ekleme()
    {
        $isim   = "Fikret";
        $adres  = "İstanbul";

        if($this->Ekle("users", ['isim' => $isim, 'adres' => $adres])){
            return true;
        }else {
            return false;
        }
    }
}

?>

controllers dizini içerisindeki profile.php içerisindeki user() method kodlarımızı aşağıdaki kodlar ile değiştiriyoruz.

PHP:
public function user()
{

    $users = $this->model("user");

    if($users->Ekleme()){
        echo "Ekleme başarıyla yapıldı";
    }else{
        echo "Ekleme sırasında hata oluştu";
    }

    $this->view("users");

}
 

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.