Veritabanı (Database) - muhametsafak/phpxi Wiki

Projenizde bir ve ya birden fazla veritabanı kullanıyor olabilirsiniz. PHPXI birden fazla veritabanına aynı anda basitçe bağlanmanızı ve yönetmenizi sağlayan bir yapıya sahiptir.

Veritabanı Bağlantı Bilgilerinin Tanımlanması

PHPXI veritabanı bağlantı bilgilerini /PHPXI/APPLICATION/Config/Database.php yapılandırma dosyasından alır.

    const DB_GroupName = [
        "host" => "localhost", //Database Server
        "port" => 3306, //Database Port
        "user" => "root", //Database User
        "password" => "", //Database User Password
        "name" => "phpxi", //Database Name
        "prefix" => "", //Table Prefix
        "charset" => "utf-8", //Charset
        "collation" => "utf8mb4_general_ci", //Collation
        "driver" => "mysql", //Database Type (MySQL, SQLite, vs...)
        "class" => "mysqli" //or "pdo" or your custom class
    ];

Not : İster tek bir veritabanı kullanın ister birden fazla, her veritabanı bağlantı bilgisinin benzersiz bir grup adı (DB_GroupName) olmak zorundadır.

Manuel Bağlantı

Veritabanına manuel olarak bağlanmak için db_connect() fonksiyonunu kullanabilirsiniz.

$db = db_connect(\Config\Database::DB_GroupName);

DB_GroupName olarak belirtilen bölüm Config/Database.php yapılandıma dosyasında bağlantı bilgilerine verdiğiniz grup adıdır.

Veritabanına Otomatik Bağlanma

Tüm model ve kütüphanelerde kullandığınız bir veritabanı varsa bunu otomatik bağlantı ile çözmek daha hızlı ve akıllıca olacaktır. Bu işlem için /Config/Autoload.php yapılandırma dosyasına açın ve; const DB ye bağlantı yapacağınız veritabanlarını birer eleman olarak ekleyin.

    const DB = [
        "db" => \Config\Database::DB_GroupName
    ];

Bu şekilde bir yapılandırma da $this->db ile veritabanı sınıfına ulaşmış olursunuz.


Veritabanı Kütüphanesi

PHPXI dahili basit ve etkili iki veritabanı kütüphanesine sahiptir ve bu kütüphaneler geliştirilmeye devam etmektedir. Kütüphanelerden PHP'nin dahili MySQLi ve PDO kütüphanelerinden türetilmiştir. Her ikisi de geliştirilmeye devam etmektedir.

Dahili MySQLi - PDO Ortak Metotları

SELECT İşlemleri

Her şeyi seçmek

$this->db->select("*");

Sadece belli sütunları seçmek; (örneğin sutun ve kolon isimli sütunları seçmek için)

$this->db->select("sutun, kolon");

veya

$this-db->select("sutun")->select("kolon");

Tablo adı ile birlikte seçmek için;

$this->db->select("tabloadi.sutun");

Dikkat: Tablo ve sütun adı nokta . ile ayrılmalıdır.

AS ifadesinin kullanımı;

$this->db->select("tablo.sutun as yeniSutun");

şeklindedir.


FROM İşlemi

$this->db->from("tabloadi");

WHERE İşlemleri

$this->db->where("sutun", "value");

Not: Üçüncü parametre belirtilmezse = çalışır.

LIKE kullanımı;

$this->db->where("sutun", "%value%", "like");

NOT LIKE kullanımı

$this->db->where("sutun", "%value%", "not like");

IN kullanımı

$this->db->where("sutun", "1,2,3", "in");

ya da

$this->db->where("sutun", ["1", "2", "3"], "in);

NOT IN kullanımı

$this->db->where("sutun", "1,2,3", "not in");

ya da

$this->db->where("sutun", ["1","2","3"], "not in");

BETWEEN kullanımı

$this->db->where("sutun", array("10", "50"), "between");

bu aşağıdakine benzer bir SQL üretir;

WHERE `sutun` BETWEEN 10 AND 50

NOT BETWEEN kullanımı

$this->db->where("sutun", array("10", "50"), "not between");

şuna benzer bir SQL üretir;

WHERE `sutun` NOT BETWEEN 10 AND 50

diğer kullanım şekilleri;

Küçük eşittir:

$this->db->where("sutun", "5", "<=");

Küçüktür:

$this->db->where("sutun", "5", "<");

Büyüktür:

$this->db->where("sutun", "5", ">");

Büyük eşittir:

$this->db->where("sutun", "5", ">=");

WHERE OR ve WHERE AND

Aldıkları parametre ve kullanım şekilleri where() metodu ile aynı ancak farklı sql sorguları oluşturmayı sağlayan iki temel metot daha vardır.

$this->db->or_where("sutun", "value");
$this->db->and_where("sutun", "value");

Önemli : Üçüncü parametre olarak where() metodunun aldığı parametreleri alabilirler, belirtilmezse = çalışır.


HAVING İşlemi

İlk parametre olarak sütun adı, ikinci parametre olarak veri ve üçüncü parametre olarak operatör belirtilir. Operatör belirtilmezse varsayılan olarak = çalışır

$this->db->having("sutun", "value");

GROUP BY İşlemi

$this->db->group_by("group_name");

ORDER BY İşlemi

$this->db->order_by("sutun", "asc");

Belli bir tablodaki belli bir sutuna göre listeleme yapılacaksa üçüncü parametre olarak tablo adı verilir. Varsayılan olarak from() ya da join() metodu ile kendisinden önce seçilen son tabloyu alır.

$this->db->order_by("sutun", "desc", "tablo_adi");

LIMIT İşlemi

SQL sorgularını limitlemek için kullanılır.

$this->db->limit("1");

veya

$this->db->limit("0, 1");

JOIN Işlemi

$this->db->join("join_tablosu");

ile tablo sorguya dahil edilir. Sorguya dahil edilen tablonun bir sütunu, sorguda yer alan bir tablonun bir sütunu ile eşleştirilmelidir. Bu işlem için join_where() kullanılır.

$this->db->join_where("join_tablosu", "join_sutunu", "from_tablosu", "from_sutunu");

Böylece join_tablosu isimli tabloda bulunan join_sutunu ile from_tablosu isimli tablodaki from_sutunu eşit olmak şartı eklemiş olduk.


GET İşlemi

GET oluşan SQL sorgularını sunucuya gönderir ve sunucunun verdiği cevabı döndürür.

$this->db->get("tablo_adi");

ya da

$this->db->from("tablo_adi")->get();

şeklinde çalıştığında SQL sunucusuna gönderilecek sorgu şu şekildedir;

SELECT * FROM tablo_adi

select(), from(), join(), where(), order_by(), limit() gibi metotlar kullanılarak sorgu şekillendirilebilir. Basit bir örnek aşağıdaki gibidir;

    $this->db->select("sutun")
        ->from("tablo")
        ->where("sutun", "1")
        ->limit("1")
        ->get();

Bunun çalıştıracağı sorgu aşağıdaki şekildedir;

SELECT sutun FROM tablo WHERE sutun = '1' LIMIT 1

QUERY

Kendi SQL sorgunuzu elle yazıp çalıştırmak istiyorsanız query() metodu aşağıdakine benzer şekilde kullanabilirsiniz.

$sql = $this->db->query("SELECT * FROM tabloadi WHERE 1 LIMIT 0, 10");

Bu işlem PHP’nin MySQLI (ya da PDO) sınıfındaki query ile aynı şeyi döndürür. Kullanımı bire bir aynıdır.


NUM_ROWS

Kendisinden önce en son yapılan get() ya da query() işleminden etkilenen satır sayısını döndürür.

$this->db->num_rows();

QUERY_SIZE

Kendisinden önce kaç SQL sorgusunun çalıştırıldığı bilgisini döndürür. Bir tür sayaç görevi görür.

$this->db->query_size();

ROWS

Kendisinden önce yapılan query() ya da get() sonuçlarına ait sonuçları (çoğul) nesne olarak döndürür. Aşağıdakine benzer bir kullanımı vardır.

$this->db->from("tablo")->get();

foreach($this->rows() as $row){
    echo $row->sutun_adi;
}

ROW

Kendisinden önce yapılan query() ya da get() sorgularına sonuçlarını ait sonucu (tekil) nesne olarak döndürür.

$db->from("tablo")->get();
$row = $this->row();
echo $row->sutun_adi;

INSERT İşlemi

İlk parametre olarak bir dizi, ikinci parametre olarak işlemin yapılacağı tablo adını alır.

$data = array(
    "sutunadi" => "sutun value",
    "kolonadi" => "kolon value"
);
$this->db->insert($data, "tabloadi");

İşlem başarılı olursa true, başarısız olursa false döndürür.


INSERT_ID

Kendisinden önceki insert işlemi bir insert id döndürdüyse bu insert id’yi döndürür.

$this->db->insert_id();

UPDATE İşlemi

$data = array(
    "sutunadi" => "sutunda yeni veri",
    "kolonadi" => "kolonda yeni veri"
);
$this->db->from("tabloadi")
        ->where("ID", "5")
        ->update($data);

Öncesinde from() ile hangi tabloda işlem yapılacağı belirtilmelidir. Ya da tablo adı ikinci parametre olarak belirtilmelidir.

$data = array(
    "sutunadi" => "sutunda yeni veri",
    "kolonadi" => "kolonda yeni veri"
);
$this->db->where("ID", "5")
    ->update($data, "tabloadi");

Dikkat : where() metodu ile hangi verilerin güncelleneceği seçilmezse tüm tabloda güncelleme işlemi yapılır.

İşlem başarılı olursa true, başarısız olursa false döndürür.


DELETE

$this->db->from("tabloadi")
        ->where("ID", "5")
        ->delete();

Dikkat : Kendisinden önce from() metodu ile tablo adı belirtilmelidir. Kendisinden önce where() metodu ile hangi verilerin silineceği belirtilmelidir. Ya da birinci parametre olarak where bilgilerini ikinci parametre olarak tablo adı verilebilir.

Dikkat : Hangi verilerin silineceği (where) belirtilmezse tüm tablo içeriğini silecektir.

Aşağıda verilen tüm satırlar bire bir aynı SQL sorgusunu çalıştırır.

$this->db->from("tabloadi")->delete(["ID"=>"5"]);

ya da

$this->db->where("ID", "5")->delete([], "tabloadi");`

ya da

$this->db->delete(["ID" => "5"], "tabloadi");

Başarılı olursa true, başarısız olursa false döner.


DROP

Bir tabloyu verileriyle birlikte kaldırmaya/silmeye yarar.

$this->db->drop("tabloadi");

ya da

$this->db->from("tabloadi")->drop();

Başarılı olursa true, başarısız olursa false döndürür.


TRUNCATE

Bir tablo içeriğini boşaltmak için kullanılır.

$this->db->truncate("tabloadi");

ya da

$this->db->from("tabloadi")->truncate();

Başarılı olursa true, başarısız olursa false döndürür.


MAINTENANCE

Bağlantı bilgilerinde önek (prefix) belirtilmiş ise sadece aynı öneki kullanan, belirtilmemiş ise veri tabanı içerisindeki tüm tablolara bakım işlemlerini (Check, Analyze, Repair ve Optimize) yapar.

$this->db->maintenance();

Bir şey döndürmez ya da çıktı üretmez. İşlem detaylarını /PHPXI/WEIGHT/Logs/ dizininde sistem (system) günlüğüne (log) yazar.


Gerçek PDO veya MySQLi Sınıfına Ulaşmak

Dahili olarak sunulan metotların haricinde PHP tarafından sunulan tüm PDO/MySQLI sınıfına da $pdo ya da $mysqli özelliklerinden (property) ulaşabilirsiniz.

//MySQLi kullanıyorsanız. Örneğin;
$this->db->mysqli->query("SELECT * FROM tabloadi");

//PDO kullanıyorsanız. Örneğin;
$this->db->pdo->query("SELECT * FROM tabloadi");

Kendi Kütüphanenizi Kullanmak

Dahili olarak gelen veritabanı kütüphaneleri yerine kendi yazdığınız yada alışık olduğunuz veritabanı kütüphanelerini de hızlı bir şekilde projenize dahil edip kullanmaya başlayabilirsiniz.

Zorunluluklar

  1. Kütüphane dosyanız içerisindeki kütüphane sınıfınız ile aynı isimde olacak şekilde isimlendirilmelidir.
  2. Kütüphane dosyanızı /PHPXI/APPLICATION/Libraries/ dizininde bulunmalıdır.
  3. namespace Application\Libraries olmalıdır.
  4. Dosya adı büyük harf ile başlamalıdır.
  5. Uyumlu bir __construct() metoduna sahip olmalıdır.

Uyumlu __construct() metodu oluşturma

İlgili veri tabanına bağlantı sağlayabilmeniz için gerekli olan bağlantı bilgileri PHPXI tarafından dizi (array) tipinde bir parametre olarak gönderilecektir.

Dikkat: __construct() metodunuz mutlaka $this döndürmelidir.

İşte anlamanız ve üzerine kendi veri tabanı kütüphanenizi inşa edebileceğiniz bir başlangıç veritabanı kütüphanesi;

/PHPXI/APPLICATION/Libraries/My_SQL.php

    namespace Application\Libraries;

    class My_SQL
    {

        public $db = null;

        private $prefix;

        function __construct($db_conf)
        {
            try{
                $this->db = new \PDO(
                    $db_conf["driver"].":host=".$db_conf["host"].";dbname=".$db_conf["name"].";charset=".$db_conf["charset"],
                    $db_conf["user"],
                    $db_conf["password"]
                );
                $this->db->exec("SET NAMES '" . $db_conf["charset"] . "' COLLATION '" . $db_conf["collation"] . "'")
                $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
            }catch(\PDOException $e){
                echo "Connection Error: " . $e->getMessage();
            }
            $this->prefix = $db_conf["prefix"];
            return $this;
        }

        function __destroy()
        {
            $this->db = null;
        }

        public function query($sql)
        {
            return $this->db->query($sql);
        }
    }

Kütüphanenizi Tanıtmak

Kütüphanenizi varsayılan olarak bir veri tabanında kullanmak için Config/Database.php içerisinde gerekli tanımlamayı yapmanız gerekiyor.

Yukarıda verilen örnekte Config/Database.php yapılandırması şuna benzeyecektir;

const DB_GroupName = [
    "host" => "localhost",
    "port" => 3306,
    "user" => "root",
    "password" => "",
    "name" => "phpxi",
    "prefix" => "",
    "charset" => "utf-8",
    "collation" => "utf8mb4_general_ci",
    "driver" => "mysql",
    "class" => "\Application\Libraries\My_SQL"
];