‘Programlama’ kategorisinde yer alanlar

Doctrine ORM

25.02.2011, 05:04:47

PHP için keşfettiğim Object Relation Mapper (ORM) uygulaması, her bir veritabanı tablosudaki field’ları tıpkı bir nesnenin öğeleriymişçesine (member) düzenlemenize, ekleyip çıkarmanıza imkan veriyor. Üyeler tablosu için çok pratik olarak şöyle bir örnek verilebilir.

$kullanici = new Uyeler();
$kullanici->isim= “alper”;
$kullanici->soyisim= “kaya”;
$kullanici->save();

Doctrine Resmi Sitesi

ezSQL veritabanı sınıfı

02.01.2011, 13:27:29

Aralarında Wordpress’in de bulunduğu PHP tabanlı 100 binin üzerinde websitesi ve onlara bağlı altyapı uygulamaları ezSQL veritabanı sınıfını kullanıyor. Çünkü kendi içinde çok gelişmiş debugging (hatadan arındırma) ve farklı veritabanlarına bağlanma özellikleri bulunuyor. MySQL, Oracle8 ve SQLite bunlardan bazıları ve ilerde bunlara yenilerinin eklenmesi kaçınılmaz.

Kullanıma geçmeden önce Justin Vincent‘in kişisel websitesinden kütüphaneleri indirebileceğinizi belirtelim.

Kullanım ise çok basit:
Örneğin MySQL‘e bağlanmak için sadece 2 tane dosyaya ihtiyacınız var. Bunlar ez_sql_core.php ve ez_sql_mysql.php

Ben öncelikle veritabanı bilgilerini tanımlıyorum.
define("SUNUCU", "localhost");
define("KULLANICI", "root");
define("PAROLA", "123456");
define("VERITABANI", "veritabanimiz");

Daha sonrasında ise ezSQL’e ait bahsettiğim 2 dosyayı çağırıyoruz.
require( "kutuphane/ez_sql_core.php" );
require( "kutuphane/ez_sql_mysql.php" );

Ardından $db adlı bir değişkene ezSQL sınıfının (class) özelliklerini atıyoruz.

$db = new ezSQL_mysql(KULLANICI,PAROLA,VERITABANI,SUNUCU);
$db -> query("SET NAMES utf8");

Bu aşamadan sonra bilgiler doğruysa veritabanına erişmiş olacağız. Sonrasında çok pratik şekilde veri çağırma, ekleme, silme, değiştirme ve result set getirme işlemlerini yapabileceğiz.

ÖRNEK 1:
// mysql veri ekleme
$db->query("INSERT INTO kullanicilar (isim, eposta) VALUES ('alper', 'alper@alper.com')";

ÖRNEK 2:
// mysql veri güncelleme
$db->query("UPDATE kullanicilar SET isim='Alper Kaya' WHERE id = 2");

ÖRNEK 3:
// mysql tek veri çekme
$kullanici_sayisi = $db->get_var("SELECT count(*) FROM kullanicilar");

ÖRNEK 4:
$kullanicilar = $db->get_results("SELECT isim, eposta FROM kullanicilar");

foreach ( $kullanicilar AS $kullanici )
{
// nesne biçimli veriye erişim
echo $kullanici ->isim;
echo $kullanici ->eposta;
}

ÖRNEK 5:
// tek bir satırdaki veriye erişme
$kullanici = $db->get_row("SELECT isim, eposta FROM kullanicilar WHERE id = 2");

echo $kullanici ->isim;
echo $kullanici ->eposta;

Nesne temelli çalışmanın yanı sıra eski usül dizi değişkenlerle (array) çalışmak isterseniz sorgu fonksiyonlarında parametre olarak ARRAY_A değerini kullanabilirsiniz. Böylece $kullanici["isim"] biçiminde de veriye ulaşabilirsiniz.

Şehir listesi SQL kayıtları

28.05.2010, 01:20:30

Bugün lazım olduğunda Türkiye’deki şehir adlarını bir sql tablosuna tek tek yazmam gerekti. Başka birisine veya ilerde tekrar bana lazım olursa diye buraya query’leri yazıyorum.

CREATE TABLE `sehirler` (
`id` int(11) NOT NULL auto_increment,
`sehir` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=82 DEFAULT CHARSET=utf8;

INSERT INTO `sehirler` VALUES ('1', 'Adana');
INSERT INTO `sehirler` VALUES ('2', 'Adıyaman');
INSERT INTO `sehirler` VALUES ('3', 'Afyon');
INSERT INTO `sehirler` VALUES ('4', 'Ağrı');
INSERT INTO `sehirler` VALUES ('5', 'Aksaray');
INSERT INTO `sehirler` VALUES ('6', 'Amasya');
INSERT INTO `sehirler` VALUES ('7', 'Ankara');
INSERT INTO `sehirler` VALUES ('8', 'Antalya');
INSERT INTO `sehirler` VALUES ('9', 'Ardahan');
INSERT INTO `sehirler` VALUES ('10', 'Artvin');
INSERT INTO `sehirler` VALUES ('11', 'Aydın');
INSERT INTO `sehirler` VALUES ('12', 'Balıkesir');
INSERT INTO `sehirler` VALUES ('13', 'Bartın');
INSERT INTO `sehirler` VALUES ('14', 'Batman');
INSERT INTO `sehirler` VALUES ('15', 'Bayburt');
INSERT INTO `sehirler` VALUES ('16', 'Bilecik');
INSERT INTO `sehirler` VALUES ('17', 'Bingöl');
INSERT INTO `sehirler` VALUES ('18', 'Bitlis');
INSERT INTO `sehirler` VALUES ('19', 'Bolu');
INSERT INTO `sehirler` VALUES ('20', 'Burdur');
INSERT INTO `sehirler` VALUES ('21', 'Bursa');
INSERT INTO `sehirler` VALUES ('22', 'Çanakkale');
INSERT INTO `sehirler` VALUES ('23', 'Çankırı');
INSERT INTO `sehirler` VALUES ('24', 'Çorum');
INSERT INTO `sehirler` VALUES ('25', 'Denizli');
INSERT INTO `sehirler` VALUES ('26', 'Diyarbakır');
INSERT INTO `sehirler` VALUES ('27', 'Edirne');
INSERT INTO `sehirler` VALUES ('28', 'Elazığ');
INSERT INTO `sehirler` VALUES ('29', 'Erzincan');
INSERT INTO `sehirler` VALUES ('30', 'Erzurum');
INSERT INTO `sehirler` VALUES ('31', 'Eskişehir');
INSERT INTO `sehirler` VALUES ('32', 'Gaziantep');
INSERT INTO `sehirler` VALUES ('33', 'Giresun');
INSERT INTO `sehirler` VALUES ('34', 'Gümüşhane');
INSERT INTO `sehirler` VALUES ('35', 'Hakkari');
INSERT INTO `sehirler` VALUES ('36', 'Hatay');
INSERT INTO `sehirler` VALUES ('37', 'Mersin');
INSERT INTO `sehirler` VALUES ('38', 'Iğdır');
INSERT INTO `sehirler` VALUES ('39', 'Isparta');
INSERT INTO `sehirler` VALUES ('40', 'İstanbul');
INSERT INTO `sehirler` VALUES ('41', 'İzmir');
INSERT INTO `sehirler` VALUES ('42', 'Kahramanmaraş');
INSERT INTO `sehirler` VALUES ('43', 'Karaman');
INSERT INTO `sehirler` VALUES ('44', 'Kars');
INSERT INTO `sehirler` VALUES ('45', 'Kastamonu');
INSERT INTO `sehirler` VALUES ('46', 'Kayseri');
INSERT INTO `sehirler` VALUES ('47', 'Kırıkkale');
INSERT INTO `sehirler` VALUES ('48', 'Kırklareli');
INSERT INTO `sehirler` VALUES ('49', 'Kırşehir');
INSERT INTO `sehirler` VALUES ('50', 'Kocaeli');
INSERT INTO `sehirler` VALUES ('51', 'Konya');
INSERT INTO `sehirler` VALUES ('52', 'Kütahya');
INSERT INTO `sehirler` VALUES ('53', 'Malatya');
INSERT INTO `sehirler` VALUES ('54', 'Manisa');
INSERT INTO `sehirler` VALUES ('55', 'Mardin');
INSERT INTO `sehirler` VALUES ('56', 'Muğla');
INSERT INTO `sehirler` VALUES ('57', 'Muş');
INSERT INTO `sehirler` VALUES ('58', 'Nevşehir');
INSERT INTO `sehirler` VALUES ('59', 'Niğde');
INSERT INTO `sehirler` VALUES ('60', 'Ordu');
INSERT INTO `sehirler` VALUES ('61', 'Rize');
INSERT INTO `sehirler` VALUES ('62', 'Sakarya');
INSERT INTO `sehirler` VALUES ('63', 'Samsun');
INSERT INTO `sehirler` VALUES ('64', 'Siirt');
INSERT INTO `sehirler` VALUES ('65', 'Sinop');
INSERT INTO `sehirler` VALUES ('66', 'Sivas');
INSERT INTO `sehirler` VALUES ('67', 'Şırnak');
INSERT INTO `sehirler` VALUES ('68', 'Tekirdağ');
INSERT INTO `sehirler` VALUES ('69', 'Tokat');
INSERT INTO `sehirler` VALUES ('70', 'Trabzon');
INSERT INTO `sehirler` VALUES ('71', 'Tunceli');
INSERT INTO `sehirler` VALUES ('72', 'Şanlıurfa');
INSERT INTO `sehirler` VALUES ('73', 'Uşak');
INSERT INTO `sehirler` VALUES ('74', 'Van');
INSERT INTO `sehirler` VALUES ('75', 'Yozgat');
INSERT INTO `sehirler` VALUES ('76', 'Zonguldak');
INSERT INTO `sehirler` VALUES ('77', 'Düzce');
INSERT INTO `sehirler` VALUES ('78', 'Karabük');
INSERT INTO `sehirler` VALUES ('79', 'Yalova');
INSERT INTO `sehirler` VALUES ('80', 'Kilis');
INSERT INTO `sehirler` VALUES ('81', 'Osmaniye');

SQL Join

25.03.2009, 03:16:22

SQL üzerinde çalışırken pek çok defa farklı tablolar arasında ilişkiler kurulur. Aynı verileri taşıyan birer field üzerinden bu işlem gerçekleştirilir. Ancak veritabanında bulunan bu verileri bir defada çekmek çok daha mantıklı bir çözümdür. Bunun için genellikle alt sorgular kullanılır.

Örneğin;
“SELECT id,ad,il_id, (SELECT ad FROM iller WHERE id=ilceler.il_id) AS il FROM ilceler;”

Ancak bu yöntemin en büyük dezavantajı eğer iki tablo arasında bir bağlantı bulunamazsa hiçbir verinin dönmeyişidir. Buna alternatif olarak SQL Join teknikleri kullanılabilmekte. Bunlar left join, right join, inner join, outer join gibi çeşitli adlar alsalar da LEFT JOIN bunların en yaygınıdır denilebilir.

Kullanımı ise şu şekilde örnekleyebiliriz:
“SELECT i.id,i.ad,i.il_id,il.ad AS iladi FROM ilceler AS i LEFT JOIN iller AS il ON i.il_id=il.id”

Burada aynı isimli elemanlar bulunduğu için hangi tablodaki veriyi çekeceğini kesinleştirmek için herbir elemanın başına ait olduğu tablonun adını ekledik. Örneğin id ve ad isimli elemanlar her iki tabloda da var. Bunun belirtilmemesi durumunda en son tanımlanın değerini almakta. Bu sebeple bu tablo adlarını kullandık. Hatta bunu yaparken uzun görünüp sorgu cümlesini karmaşıklaştırmamak adına table alias kullandık. Tablo adından sonra AS ifadesi bunun takma ad (alias) olduğunu göstermekte. Hatta bu ifadeye dahi gerek kalmadan bir boşluk bırakarak da bu tanımlama yapılabilmekte ancak böylesi daha anlaşılır olmakta.

ve Google hata yapar…

31.01.2009, 23:38:52

Bugün Google’da arama yapanlar yaklaşık 40 dakika boyunca tüm arama sonuçlarında şöyle bir uyarıyla karşılaştı.
“Bu site bilgisayarınıza zarar verebilir (“This site may harm your computer”)

Tüm arama sonuçlarında böyle bir uyarının gözükmesi, beraberinde tüm bu sayfalara ulaşamaya, ticari ve itibar kayıplarına neden oldu. Bu aşamada Google’ın ortaklaşa çalıştığı stopbadware.org suçlandı. Ancak sonrasında tamamen insan hatası olan birşey keşfedildi. Google’ın kendi yasaklılar listesini oluştururken kullandığı kriterlerden birisi olarak yanlışlıkla “/” karakteri de eklenmişti. Bu da böyle bir soruna neden oldu.

googlemalware

Double quote vs single quote

14.01.2009, 13:39:58

Pek çok programlama dilinde özellikle C tabanlı dillerde string’leri diğer veri tiplerinden ayırmak için tırnak işareti kullanılır. Tek veya çift tırnak. Örneğin PHP dilini ele aldığımızda tek tırnak içersine yazılan değişkenler aynen ekrana basılır, çift tırnak içindeki değişkenlerin ise değeri ekrana basılır. En temel fark budur. Tabi burada şöyle bir durum ortaya çıkıyor. Tüm string, her byte’ı boyunca acaba bir değişken içeriyor mu? 

İşte bu soru beraberinde bir performans konusunu da gündeme getiriyor. Konuyla ilgili kişiler stabil bir bilgisayarda bunun testlerini yapmışlar. Sonuçta tek tırnak kullanımı çok ufak bir farkla da olsa daha performanslı oluyor. Tüm kodu alıp baştan aşağı düzeltmeyi gerektirecek kadar önemli bir konu değil. Yani bir optimizasyon olarak bile görmek doğru değil. Ancak yine de yerine göre böyle bir ayrım yapmayı seviyorum sanırım :)

Performans testinin sonuçları ise şöyle: tek ve çift tırnak’tan oluşan iki değişken 1′er milyon iterasyonla tanımlanmış. Sonucunda 6ms gibi bir farkla tek tırnağın daha hızlı işlendiği ortaya çıkmış. Çok ufak birşey yani :)

SQL varchar ve char

14.01.2009, 13:30:55

SQL temelli veritabanı uygulamalarında veri tipi olarak eğer 255 karaktere kadar bir ihtiyacınız varsa tercih edeceğiniz en mantıklı seçenek varchar olarak bilinir. Halbuki char adında bir başka veri tipi daha vardır. Pek kullanıldığına şahit olmasam da bazen kullandığım oluyor. Farkı ise şu:

Varchar tipinde bir verinin uzunluğu değişkendir. Yani siz 255 byte’lık bir tanımlama yapıp da bir kısmını kullandıysanız yine disk üzerinde sizin girdiğiniz kadar yer kaplar. Ancak char tipinde ayırdığınız alanı ister kullanın, ister kullanmayın. Ne kadarlık bir sınırlama getirdiyseniz her durumda o kadarlık yer kaplar. Yani buradan anlaşılan şey, varchar daha az yer kaplar, sorgular falan daha hızlı olur? Hayır değil. Eğer o field’a gireceğiniz verinin uzunluğunu net olarak biliyorsanız char çok daha hızlı işlem yapar ve boyut tespitiniz daha rahat olur. Ama dediğim gibi kullanımı çok kısıtlı. Belki çok çok büyük bir projede gerçek anlamda performans farkını hissedebilirsiniz. Ama yine de böyle bir durumda aklınızda bulunsun :)