eBurhan VT Class v1.2 yayınlandı
CRUD işlemlerini kolaylaştırmak ve biraz daha fonksiyonel hale getirmek amacıyla yazmış olduğum veritabanı sınıfını 1.2 sürümüne güncelledim. Özellikle hata işlemleriyle ilgili güzel geliştirmeler var. Artık meydana gelen hatanın hangi dosyada ve kaçıncı satırda olduğunu kolayca öğrenebilirsiniz. Güncellenmiş olan bu sürümü eBurhan Araçları sayfasından indirebilir, diğer yenilikleri ise dosyada içerisindeki dökümandan (DOC klasöründeki) okuyabilirsiniz.
6 Ağustos 2009, 12:32
Programlama
Bugün 3 kez, toplamda ise 3.685 kez okundu.
database, mysql, php, veritabanı

















Hmm, tam benlik.
Önceden görmemişim bir bakalım.
Cok tesekkur ederim
Tekrardan merhaba Erhan. Bu güncelleştirmeyi sen yapmasan ben yapmayı düşünüyordum
Sana bir bug daha bildireyim :
sql kodum : “select * from kategoriler inner join basliklar on basliklar.kat_id = kategoriler.id where baslik_id=2″
Daha sonra bunu kullanayım( )
$db = new DB(); // Ben sınıfın adını DB olarak değiştirdim. Sizde VT olması gerekiyor.
$sonuclar = $db->alHepsi();
foreach( $sonuclar as $sonuc ) {
echo($sonuc['kategoriler.id']); // Bu çalışmıyor.
echo($sonuc['id']); // Bu ise sorgudaki ilk seçilen tablodaki idyi döndürüyor.
}
Yani bir çok tablo üzerinde çalışırken sadece kolon adlarını tutturmuşuz. Şöyle bir çözüm sunabilirim :
Seçilen tabloların kolonlarını tablonun adıyla beraber arrayda tutalım. Daha sonra çağarılmak istendiğinde eğer id deniyorsa arrayda tutulan kolonlardan kategori isminden sonra id gelenleri süzelim ve ilk olanı gönderelim. Eğer kategoriler.id deniyorsa tablosuyla beraber arayalım.
tahminimce değiştiğindeki kod :
if( in_array( $istek, $db->sonuclar ) ) {
return $db->sonuclar[$istek];
}
else {
foreach( $db->sonuclar as $key => $val ) {
$kat_kol = split( '.', $key );
if( count($kat_kol) == 2 ) {
if( $kat_kol[1] == $istek ) {
return $kat_kol[$key];
}
}
else if( count($kat_kol) == 1 && $kat_kol != '' ) {
if( $kat_kol[0] == $istek ) {
return $kat_kol[$key];
}
}
}
}
Şu anda kafamdan yazdığımdan kısayol fonksiyonlarını vs. girmedim. Sen düzgün hale getirirsin. Son versiyondaki değişikliklerde bu var mı bilmiyorum. Bunu açık kaynak geliştirme ortamına aktarırsan beraber kod güncellemesi yapabiliriz.
@Oğuz Özcan
ben orada bug olduğunu düşünmüyorum. Yazdığın SQL koduyla alakalı olmalı. Olmalı diyorum çünkü tablonun yapısını tam bilmediğim için kesin yorum yapamıyorum. Fakat yazdığın JOIN koduna bakarsak
echo ($sonuc['id']);yazdığında ilk seçiken tablonun ID’si gelmesi doğal. SQL kodunun içerisinde AS deyimi kullanarak kolon adlarını farklılaştırabilir, böylece istediğin tablonun kolonundan veri çekebilirsin.Sevgili Erhan,
Dediklerinin tamamını biliyorum ve denedim. Senin dediğin gibi
“Fakat yazdığın JOIN koduna bakarsak echo ($sonuc['id']); yazdığında ilk seçiken tablonun ID’si gelmesi doğal”
kısmında ise öyle olmaması gerektiğini söylemedim. Olayın neden kaynaklandığını anlamak için yaptığım bir denemeyi çözümü rahatlatmak için yazdım.
tablolar fark etmez. Herhangi 2 tabloyu join ettirip 2 tablodan da id verisini almak istiyorum. Bunu bana deneyip nasıl yapabileceğimi yazar mısın?
Örnek 2 tablo :
tablo1 :
id | isim
1 | Deneme
2 | Denememe
tablo2 :
id | soyisim | tablo1_id
1 | denedim | 1
sql kodum : “select * from tablo1 inner join tablo2 on tablo2.tablo1id = tablo1.id”
çıktısı :
tablo1.id | tablo1.isim | tablo2.id | tablo2.soyisim
1 | Deneme | 1 | Denedim
yazdırmaya çalıştığım veriler :
tablo1.id ve tablo2.id
2. sql kodum : “select * from tablo1 as t1 inner join tablo2 as t2 on tablo2.tablo1id = tablo1.id”
çıktısı :
t1.id | t1.isim | t2.id | t2.soyisim
1 | Deneme | 1 | Denedim
yazdırmaya çalıştığım veriler :
t1.id ve t2.id
Tekrardan deneyip bana sonucunu yazabilirsen sevinirim.
“select * from tablo1 inner join tablo2 on tablo2.tablo1id = tablo1.id”
bu SQL kodunu ister eb.vt sınıfı ile çalıştır istersen de native mysql fonksiyonları ile çalıştır alttaki gibi çıktı alıyorsun:
stdClass Object
(
[id] => 1
[isim] => Ali
[soyisim] => Kuşcu
[tablo1id] => 1
)
e buradan da tablo2′nin ID’sine erişememem doğal. O zaman SQL kodunu şöyke yazabilirsin:
SELECT tablo1.id AS tablo1_id, tablo1.isim,
tablo2.id AS tablo2_id, tablo2.soyisim, tablo2.tablo1id
FROM tablo1 Inner Join tablo2
ON tablo2.tablo1id = tablo1.id
çıktısı da şöyle olacaktır:
stdClass Object
(
[tablo1_id] => 1
[isim] => Ali
[tablo2_id] => 1
[soyisim] => Kuşcu
[tablo1id] => 1
)
Merabalar sınf içerisinde
function cacheLimit($min){
if( is_int($min) && $min > 0 )
$this->cacheLimit = $min;
}
olan kısımda is_int yerine is_numeric olması ne açıdan değişiklik gösterir? nitekim denemelerimde limit değerini ayar dosyamdan aldığımda işlem yapmadı.
$vtayar = array(vtlimit=>”200″, vtsure=>”30″);
$vt->cacheLimit($vtayar[vtlimit]); // sıfır gibi davranıyor, is_numeric problem yok
bir ikincisi $dkt = $vt->alHepsi(); değerini foreach ile dönderdiğimde ve sql boş geldiğinde hata oluşuyor, while ile değer boşta olsa hatasız döngüsüz oluyorduk. ben burada herhangi bir mantıksal sınama koymak istemiyorum, bu değeri daha farklı nasıl dönderebilirim? while ($my = mysql_fetch_object($sql)) daki gibi olmadığı zaman hata vermesin.
herşey için teşekkür ederim.
@Tufan
“cacheLimit” metodu içerisinde “is_int” kullanıyoruz çünkü gelen değerin “sayısal” bir değer olduğundan emin olmak gerekiyor. Ama “is_numeric” fonksiyonu ise string değeri de kabul ettiği için metot içerisindeki şart yanlış çalışabilir.
Ayarları gönderirken
$vtayar = array(vtlimit=>”200″, vtsure=>”30″);
şeklinde değil de
$vtayar = array(vtlimit=>200, vtsure=>30);
şeklinde gönderebilirsin (tırnaklar olmadan).
Diğer bahsettiğin boş gelme olayına ise bakacağım. Yorumun için teşekkürler.
ayarları o şekilde tutmam işlemlerimi baya bir karıştırır daha doğrusu fazla uğraştırır, nedeni ise ayar dosyamı inputların adları ve inputların değerleri olarak bir dosyaya yazdırıyorum.
is_numeric benim bildiğim tipinden ziyade değerin sayısal olup olmadığını kontrol ediyor bu işlemler arasında ne fark vardırki.
nitekim ben numeric yaptım o şekilde kullanıyorum.
Bu arada cashe limit olayını her sorguya göre ayarlamak daha makul geldi biraz kod kalabalığı olabilir ama 100 olunca almak istediğim bir yerde olabilir, 30 oluncada olabilir
$vt = new VT;$vt->cacheLimit($ayar[cveri]);
$vt->cacheZaman($ayar[ctime]);
$vt->kayitYolu($ayar[cdir]);
$vt->baglan($db_adi, $db_kullanici, $db_sifre,$db_host);
cacheLimit olayını bağlandan sonra sorgulara özel kullanabilmek esneklik olucak gibi düşünüyorum.
Yorum ve yardımın için teşekkürler
peki o zaman ona birşey ekleyecek yeni bir sözüm yok (:
Zaten bunu yapabiliyorsun. Dökümanı açıp SOR isimli metoda bakarsan, her sorgu için farklı cache zamanları atabileceğini göreceksin.
// bu sorgu 10 dakikalığına önbelleğe alınır
$vt->sql("select * from tablo1")
$vt->sor(10);
// bu sorgu 55 dakikalığına önbelleğe alınır
$vt->sql("select * from tablo2")
$vt->sor(55);
evet dakika ayarını yapabiliyoruz ben $vt->cacheLimit(300); buradaki limit olayını diyorum mesela menüler sabit kalıcak ve bunlar 25 tane dolayısıyla casheLimit 300 olduğu için cashe tutulmuyor. sor veya sql metoduna yeni bir parametre uygulansa.
Daha uygun olmazmı istediğimizi sor($dk = 30, limit = 100); gibi uygularsak.
@Tufan
hımm, haklısın ben zaman ayarını soruyorsun sandım. Limit ayarı için gerekli düzenlemeyi de yapacağım ve önümüzdeki birkaç gün içinde v1.3 sürümünü yayınlayacağım. Yorumların için teşekkürler.
Merhabalar..
ben phpye yeni geçiyorum ve haliyle denemeler yapıyorum. sizin veritabanı sınıfınızı kullanıyorum. veritabanımın dil kodlamasını latin5_turkish_ci seçtim. php sayfamada bu metayı koydum. fakat listeleme yaptığımda türkçe karakterlerim sorunlu çıkıyor ama db’de normal. nedenini araştırdım ama tam olarak çözümü bulamadım. şimdiden teşekkürler..
“baglan()” metodu ile veritabanı bağlantısı açtıktan sonra aşağıdaki sorguları gönderin.
$vt->sql("SET NAMES 'latin5'");
$vt->sor();
$vt->sql("SET CHARACTER SET 'latin5'");
$vt->sor();
$vt->sql("SET COLLATION_CONNECTION = 'latin5_turkish_ci'");
$vt->sor();