Hemen hemen her web uygulaması bir veritabanı ile etkileşim kurar. Cotonti, bu etkileşimi basit ve anlaşılır hale getirir.
Şu anda MySQL 5.1+ desteklenmektedir.
Veritabanı bağlantı yapılandırması, uygulamanın yapılandırma dosyası olan datas/config.php içinde bulunur. Bu dosya Cotonti kurulumu sırasında otomatik olarak doldurulur.
Cotonti veritabanı bağlantı nesnesine Cot
facade sınıfı ile erişebilirsiniz. Cotonti veritabanı nesnesi, PDO üzerine inşa edilmiştir ve SQL sorgularını çalıştırmak için yöntemler sunar. Ayrıca, INSERT
, UPDATE
ve DELETE
sorgularını daha basit hale getiren ek yöntemler içerir.
Bir SQL sorgusu çalıştırmak için aşağıdaki adımları takip edebilirsiniz:
Aşağıdaki örnek, veritabanından veri çekmenin farklı yollarını göstermektedir:
1 2 3 4 5 6 7 8 9 10 11 12 |
// Bir dizi satır döndürür. Her satır, sütun adları ve değerleri içeren bir ilişkisel dizidir. // Eğer sorgu sonuç döndürmezse, boş bir dizi döndürülür. $posts = Cot:: $db ->query( 'SELECT * FROM post' )->fetchAll(); // Sonuç kümesinden tek bir (ilk veya sonraki) satırı döndürür. // Eğer sorgu sonuç döndürmezse, FALSE döndürülür. $post = Cot:: $db ->query( 'SELECT * FROM post WHERE id=?' , 1)->fetch(); // Sonraki satırın tek bir sütun değerini döndürür. // Eğer başka satır yoksa FALSE döndürülür. $titles = Cot:: $db ->query( 'SELECT title FROM post' )->fetchColumn(); $count = Cot:: $db ->query( 'SELECT COUNT(*) FROM post' )->fetchColumn(); |
Veri döndürmeyen sorgular için PDOStatement::execute() metodunu çağırmanız gerekir. Örneğin:
1 |
Cot:: $db ->query( 'UPDATE post SET status=1 WHERE id=1' )->execute(); |
INSERT
, UPDATE
ve DELETE
sorguları için doğrudan SQL yazmak yerine, sırasıyla insert()
, update()
ve delete()
metodlarını kullanabilirsiniz. Örneğin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// INSERT (tablo_adi, sutun_degerleri) Cot:: $db ->insert( 'posts' , [ 'title' => 'Lorem ipsum' , 'text' => 'Morbi imperdiet tortor ut nisl ultricies finibus' , ] ); $newPostId = Cot:: $db ->lastInsertId(); // UPDATE (tablo_adi, sutun_degerleri, koşul, parametreler) $condition = [ "created_at < '" . date ('Y-m-d H:i:s ', time() - 3600) . "' ", 'category = :category' , ]; $updatedRowsCount = Cot:: $db ->update( 'posts' , [ 'status' => 1], $condition , [ 'category' => $category ] ); // DELETE (tablo_adi, koşul, parametreler) $deletedRowsCount = Cot:: $db -> delete ( 'posts' , 'status = 0 AND category = ?' , $category ); |
insert()
, update()
ve delete()
metodları tablo adının özel karakterlerle kaçış işlemine tabi tutulmasını gerektirmez. Bu işlem otomatik olarak yapılır.
insert()
ve update()
metodları, ekleme/güncelleme için verilen dizilerin öğelerini kaçış işlemine tabi tutmaz.
update()
ve delete()
metodları, bir SQL koşulu olarak bir dize veya bir dizi kabul eder. Eğer bir dizi sağlanırsa, her dize parantez içine alınır ve AND
operatörü ile birleştirilir.
Yukarıdaki örnekte:
1 2 3 4 |
$condition = [ "created_at < '2024-07-08 12:45:56'" , 'category = :category' ]; |
aşağıdakine eşdeğerdir:
1 |
(created_at < '2024-07-08 12:45:56' ) AND (category = :category) |
SQL sorgularında parametreler oluştururken, SQL enjeksiyon saldırılarını önlemek için neredeyse her zaman parametre bağlama işlemi yapmalısınız. Örneğin:
1 2 3 4 |
$post = Cot:: $db ->query( 'SELECT * FROM post WHERE category = ? AND status = ?' , [ $category , $status ] )->fetch(); |
Sorgu çalıştırıldığında, her soru işareti sırasına göre dizideki karşılık gelen değerle güvenli bir şekilde değiştirilir.
Eğer sorgunun yalnızca bir parametresi varsa, dizi yerine doğrudan bir değişken geçebilirsiniz:
1 |
$post = Cot:: $db ->query( 'SELECT * FROM post WHERE category = ?' , $category )->fetch(); |
Adlandırılmış parametreleri de kullanabilirsiniz:
1 2 3 4 |
$post = Cot:: $db ->query( 'SELECT * FROM post WHERE id = :id AND status = :status' , [ 'id' => $id , ':status' => $status ] )->fetch(); |
1 2 3 4 |
Cot:: $db ->query( 'SELECT * FROM ' . Cot:: $db ->quoteTableName(Cot:: $db ->pages) . ' WHERE page_cat = ' . Cot:: $db ->quote( $category ) )->fetchColumn(); |
Kaçış işlemi yapan metotlar:
Cot::$db->quoteTableName()
veya kısa versiyonu (Cot::$db->quoteT()
)Cot::$db->quoteColumnName()
veya kısa versiyonu (Cot::$db->quoteC()
)Cot::$db->quote()
Bir dizi işlemi bir veritabanı işlemi içinde çalıştırmak için Cot::$db->transaction()
metodunu kullanabilirsiniz. Eğer işlem bloğunda bir hata oluşursa, işlem otomatik olarak geri alınır (rollback) ve hata tekrar fırlatılır. Eğer işlem başarıyla tamamlanırsa, işlem otomatik olarak onaylanır (commit). Manuel geri alma veya onaylama ile uğraşmanıza gerek kalmaz:
1 2 3 4 5 6 7 8 |
Cot:: $db ->transaction( function (): void { Cot:: $db ->update( 'posts' , [ 'status' => 1], 'category = ?' , $category ); Cot:: $db -> delete ( 'posts' , 'status = 0' ); // ... diğer SQL sorgularını çalıştır ... } ); |
İşlemleri manuel olarak da yönetebilir ve geri alma (rollback), onaylama (commit) ve hata yakalama (error handling) üzerinde tam kontrol sahibi olabilirsiniz. Yukarıdaki örneğin eşdeğeri şu şekildedir:
1 2 3 4 5 6 7 8 9 10 11 |
Cot:: $db ->beginTransaction(); try { Cot:: $db ->update( 'posts' , [ 'status' => 1], 'category = ?' , $category ); Cot:: $db -> delete ( 'posts' , 'status = 0' ); // ... diğer SQL sorgularını çalıştır ... Cot:: $db ->commit(); } catch (\Throwable $e ) { Cot:: $db ->rollBack(); throw $e ; } |
Cotonti, işlemleriniz için izolasyon seviyelerini ayarlamanızı destekler. Varsayılan olarak, yeni bir işlem başlatıldığında, veritabanı sisteminizin varsayılan izolasyon seviyesi kullanılır. Varsayılan izolasyon seviyesini aşağıdaki gibi değiştirebilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$isolationLevel = \cot\database\DataBaseDictionary::REPEATABLE_READ; Cot:: $db ->transaction( function (): void { .... }, $isolationLevel ); // veya Cot:: $db ->beginTransaction( $isolationLevel ); |
Cot::$db->transaction()
metodu, ölü kilit oluştuğunda işlemin kaç kez tekrar deneneceğini belirleyen isteğe bağlı üçüncü bir argüman alır. Bu tekrar deneme sayısı tükendiğinde, bir istisna (exception) fırlatılır:
1 2 3 4 5 6 7 8 |
Cot:: $db ->transaction( function (): void { .... }, $isolationLevel , 5 ); |
(Bu bölüm güncelleniyor)
Cotonti veritabanı nesnesi, veritabanı şeması ile çalışmayı kolaylaştıran çeşitli metotlar sunar:
tableExists($tableName)
- Bir tablonun var olup olmadığını kontrol eder.fieldExists($tableName, $fieldName)
- Bir sütunun var olup olmadığını kontrol eder.indexExists($tableName, $indexName, $indexColumns = [])
- Bir indeksin var olup olmadığını kontrol eder.addIndex($tableName, $indexName, $indexColumns = [])
- Bir indeks oluşturur. $indexColumns
, tek bir sütun adı için bir dize veya birden fazla sütun için bir dizi olabilir. Eğer $indexName
boş bırakılırsa, otomatik olarak bir ad oluşturulur.CotDB::runScript($script, $transaction = false)
metodu, SQL betiklerini (SQL dosyalarının içeriği) çalıştırmanıza olanak tanır. Tablo adları, MySQL kaçış sembolü `
ile kaçış işlemine tabi tutulmalı ve cot_
öneki içermelidir. Bu önek, datas/config.php dosyasındaki ayarlarla değiştirilir.