Codeigniter ve Database (Query helper)

Codeigniter ve database ayarları için gerekli ayarların yapılmasını ve Codeigniter ve Standart Database İşlemlerini önceki yazılarımda anlatmıştım. Bu yazımda ise query helper fonksiyonlarını ve Active record classını anlatmaya çalışacağım.
Query helper bir çok kişinin zaman zaman aradığı ve bulamadığı fonksiyonlardan bazılarını içermesi açıkcası beni mutlu etti. Query helper ile en son eklenen kaydın ID numarasını, bir önceki sorguda etkilenen satır sayısını, bir tablodaki kayıt sayısını, database platformunu, versiyonu, son sorgu sql satırını, tabloya veri ekleme ve verileri update etmenize olanak sağlamaktadır.
Son eklenen verinin ID numarasını alma
Son eklenen verinin ID numarasını almak aslında göründüğü kadar zor değil. MySql de son eklenen datanın Primary Key (ID) sini almak için mysql_insert_id() fonksiyonu işimizi görmektedir. Yine MsSql de SELECT IDENT_CURRENT('tabloadi') sorgusu sonucunda son eklenen verinin ID numarasını alabiliyoruz. Fakat codeigniter bunu bir fonksiyon haline getirerek ister Mssql olsun, ister Mysql olsun ID numarasını almak için $this->db->insert_id() yazmamız yeterlidir.
Etkilenen satır sayısını alma
Son yapılan sorgudan etkilenen MySql'de satır sayısını bulmak için mysql_affected_rows() kullanılmaktadır. MsSql'de ise PHP için mevcut olan fonksiyon mssql_rows_affected() kullanılmaktadır. (Konumuz ile alakası yok fakat belki bir gün birine lazım olabilir diye değinmek istiyorum. ASP kullanıcıları @@ROWCOUNT ile bu sayıyı alabilirler.) Codeigniter'da bu satır sayısını almak için $this->db-> affected_rows() yazılması yeterlidir. Şimdi diyorsunuzdur. İyi güzelde bu değer ne işimize yarayacak diyenleri duyar gibiyim. En basit ibare ile bir sql çalıştırdınız örneğin
mysql_query('DELETE FROM TABLOADI WHERE id < 10');
echo 'silinen kayıt sayısı = '$this->db->affected_rows();
//(sorgu sonucunda 5 adet silindi ise) sonuç: silinen kayıt sayısı = 5 olacaktır
Sadece bu işimize mi yarayacak. Bu fonksiyonu şu şekilde de kullanabilirsiniz. Örneğin bir veri varsa güncellemek yok ise eklemek için yapacağınız bir uygulama ilede kullanabilirsiniz.
Not: Mysql'de platformunda $this->db-> affected_rows() kullanılırsa ve Where şartı olmadan silme işlemi yapılırsa (Örneğin DELETE FROM TABLOADI) sonuç 0 olarak dönmektedir.
Tablodaki toplam kayıt sayısını alma
Birçok kişinin kullanmış olduğu ve nerdeyse herkesin bildiği bir sorgudur aslında bu. MSSql'de de MySql'de "SELECT COUNT(*) FROM TABLOADI" ile bu sonuca ulaşılmaktadır. Codeigniterda ise $this->db->count_all('TABLOADI') ile bu sonuca ulaşabiliriz.
Database platformu
Database platformu kullanılan database tipini göstermektedir (MySql, MsSql ...vb). $this->db->platform() ile database platformunu alabilirsiniz.
Database versiyonu
Çalışan database'in versiyonunu öğrenmek için echo $this->db->version(); yazmanız yeterlidir. MsSql'de SELECT @@VERSION sorgusu ile MySql'de ise SELECT version() sorgusu ile versiyonu öğrenebilirsiniz. Yine genel kültür olması için SELECT SERVERPROPERTY('productversion') ile SQL Server 2005'in hangi sürümünün çalıştığını bulabilirsiniz.
Son sorguyu alma
Yapılan son sorgu tam olarak ne işimize yarar bilemiyorum. Şuana kadar hiç bir uygulamamda açıkcası kullanmadım ve gerekte duymadım. Ama kullanmak isteyenler codeigniter ile $this->db->last_query() şeklinde kullanabilirler.
Kolay yoldan update SQL elde etme
Codeigniterda update_string ile update etmek oldukça kolay, Önce bir array'e bilgileri alıyoruz devamında ise update_string fonksiyonunu çalıştırıyoruz. Resmi sitesinde yapmış olduğu örneği burada bizde paylaşalım. Bu kısayolda ayrıca değerlerde sql injection saldırılarını önlemek için gereken escape otomatik yapılmaktadır.
$data = array('name' => $name, 'email' => $email, 'url' =>$url);
$where = "author_id = 1 AND status = 'active'";
$str = $this->db->update_string('table_name', $data, $where);
Sql;
UPDATE table_name SET name = 'Rick', email = 'rick@example.com', url = 'example.com' WHERE author_id = 1 AND status = 'active'
Kolay yoldan insert SQL elde etme
Bu fonksiyonda update gibi sql injection saldırılarını önlemek için gereken escape otomatik yapılmaktadır. Kullanımı ise;
$data = array('name' => $name, 'email' => $email, 'url' => $url);
$str = $this->db->insert_string('table_name', $data);
Sql;
INSERT INTO table_name (name, email, url) VALUES ('Rick', 'rick@example.com', 'example.com')
Bir sonraki yazımda Codeigniter'da database işlemlerini bitirmek ümidiyle :)
23 Aralık 2009, 02:59
CodeIgniter ile ilgili yazdıklarınızı takip ediyordum. Güzel yazıyorsunuz. Devam etme gibi bir düşünceniz var mı? İyi çalışmalar… :)
23 Aralık 2009, 09:48
İlginizden dolayı teşekkür ederim Cihan. Codeigniteri aktif olarak kullanıyorum. Ondan dolayı yazılarım da gelecektir :) Şuan yeni bir layout kullanımı üzerinde çalışıyorum tamamlanınca onu paylaşacağım. Ondan sonra devam ederim yazılarıma :)
16 Şubat 2010, 14:40
Sevgili dostım, CodeIgniter yazılarınızın devamını bekliyoruz. :)
Teşekkürler…
04 Mayıs 2010, 22:52
Üzerinden aylar geçmiş artık yeni bir yazıyı hak etmiyor muyuz? :D
18 Mayıs 2010, 15:56
slm yazıların çok güzel bilgilerini paylaştığın için tşk ederim bişe sorucam acaba yadımcı olabilir misin _?_ codeigniter de yeniyim bir proje üzerinde çalışıyoz akadaşlarla mysql tablomuzdaki bir sutundaki rakamsal verilerin hepsini toplamamız gerekiyor acaba kolay bi yolu varmı _?_
27 Mayıs 2010, 07:37
Merhaba empt, bunu sql sorgusu ile çok kolay alabilirsiniz. Örneğin: “SELECT SUM(FIELD) AS TOPLAM FROM TABLO WHERE ….”
29 Ağustos 2010, 18:04
@empt; CI’da select_sum(); diye bir metod var. şöyle kullanabilirsin.
$this->db->select_sum(‘toplanacak_alan)->get(‘tablo’);