PHP veritabanı sınıfı
Şuan hali hazırda bir sürü PHP veritabanı sınıfı mevcut. Bunlardan bir kaçını saymak gerekirse; ezSQL, ADOdb, MeekroDB. Hepsinin bir çok fonksiyonu ve bazı farklı özellikleri var, incelemenizi öneririm. Fakat sonuç olarak baktığımda aslında ben bunların bir çoğunu kullanmıyorum ve kod kalabalığı gibi geliyor. Bu nedenle kendi veritabanı sınıfımı oluşturma ihtiyacı duyup klasik ve basit bir sınıf hazırladım. Uzun zamandır her türlü çalışmamda kullandığım ve bundan sonraki yazılarımda da kullanacağım bir sınıftır.
Bu sınıfta temel olarak CRUD dediğimiz veri ekleme, silme, düzenleme, listeleme dışında tek bir satır alma ve tek bir veri alma işlemleri yapabiliyoruz. Benim favorilerim bu son ikisi.
MySQL’e bağlanmak
MYSQL bağlantısı oluşturmak için öncelikle mysql_connect fonksiyonu ile veritabanı bilgileri girilir, sonra mysql_select_db fonksiyonu ile kullanılacak veritabanı seçilir. Hazırladığım bu sınıfta bu iki fonksiyon yerine daha sınıfı tanımlarken bağlantıyı yapmış oluyorsun.
$vt = new vt('kullanıcı', 'şifre', 'veritabanı');
Evet bu kadar basit. Bu satırdan sonrasında $vt değişkeni üzerinden tüm veritabanı işlemlerini gerçekleştirebiliriz. Eğer MySQL hostunuz localhost haricinde ise bunun için 4. parametreyi kullanabilirsin, bu parametre varsayılan olarak localhost tanımlı.
Veri eklemek
Bunun için 2 yöntem hazırladım. Birincisi ve benim önerdiğim yöntem eklenecek verileri array ile iletmek. Bu metodda ilk parametre her zaman tablo adı olacak.
$vt->ekle('uyeler', array('ad' => 'Musa', 'soyad' => 'Avcı'));
Güzel yanı çok fazla veri ekleyeceğimiz zaman düzenli oluyor.
$vt->ekle('siparisler', array( 'adres' => $adres, 'fiyat' => $fiyat, 'urun' => $urun, 'kargo' => $kargo, 'tarih' => time() ));
Diğer yöntem ise eklenecek verinin her değerini ayrı bir parametre olarak girmek.
$vt->ekle('uyeler', 'ad=Musa', 'soyad=Avcı');
Bu yöntemde daha az değer içeren ve array() yazmaya değmeyecek kadar kısa eklemeler için tercih edilebilir.
Bu metod her iki yöntemde de cevap olarak mysql_insert_id() değerini yani yeni eklenen satırın ID’sini döndürür. Eğer eklenmez ise de olumsuz döner.
Veri düzenlemek
Bu metod içinde 2 yöntem mevcut ve yine mantığı eklemedeki olay gibi. 3 parametreli bu metodun ilk parametresi yine tablo adı, ikinci parametre düzenlenecek değerler, son parametre ise hangi verilerin düzenleneceğini belirtecek koşul.
$vt->duzenle('uyeler', array('ad' => 'Ahmet'), array('NO' => 15)));
Bu ifade “uyeler” tablosunda NO’su 15 olan verinin “ad” değerini “Ahmet” olarak değiştir.
Her iki parametreye de birden fazla değer girerek koşul ya da düzenlenecek değer sayısını artırabilirsin.
$vt->duzenle('uyeler', 'ad="Mehmet"', 'NO=20');
Bu yöntemde eklemeden farklı olarak yazı değerleri tırnak içine almamız gerekiyor.
Veri silmek
Yine ilk parametrede tablo adı ve ikincide de koşulu giriyoruz, gayet basit. Eğer ikinci parametreyi yani koşulu girmezseniz MySQL “Truncate Table” komutunu çalıştırarak tüm tabloyu boşaltır.
$vt->sil('uyeler', array('NO' => 15)); // ya da $vt->sil('uyeler', 'NO=15');
Sorgu yapmak
Eğer yapmak istediğiniz düzenleme, silme ya da ekleme işlemi rutinin dışındaysa normal bir MySQL sorgusu çalıştırmak için sorgu metodunu kullanabilirsin.
$vt->sorgu('UPDATE haberler SET hit = hit + 1 WHERE NO = 37');
Tablo olarak verileri okumak
3 farklı veri okuma metodu hazırladım. Bunların başında tablo olarak çekmek var. Yani birden fazla değer içeren birden fazla içeriği göstermek için bu metodu rahatlıkla kullanabilirsin.
$uyeler = $vt->tablo('SELECT * FROM uyeler LIMIT 10'); foreach($uyeler as $uye) { echo $uye->NO . ' - ' . $uye->ad . ' ' . $uye->soyad . '<br/>'; }
Misalen ekranda şöyle bir çıktı oluşur:
1 - Musa Avcı 2 - Hakan Beşikçi
Tek satır veri okumak
Çekmek istediğiniz veri tek bir satırsa, örneğin sadece bir üyenin bilgisi gibi, bunun için satir metodunu kullanıyoruz. Kasaplardaki satır değil ha.
$uye = $vt->satir('SELECT * FROM uyeler WHERE NO = 1'); echo $uye->ad;
Ekranda 1 NO’lu üyenin adı yazar.
Tek bir değeri okumak
Diğer iki metoda göre en basit ve işlevsel okuma metodu bu diyebilirim. Çünkü tek bir değer okumaktan ziyade bir çok kontrol ya da sayaç işlerinde kullanılabiliyor.
echo $vt->veri('SELECT ad FROM uyeler WHERE NO = 1');
Ekranda direkt 1 NO’lu üyenin adı yazar. Bunun dışında giriş kontrol işlemlerinde ya da toplam verilere ulaşmak için kullanışı ise şöyle.
$var_mi = $vt->veri('SELECT COUNT(NO) FROM uyeler WHERE ad = "Musa"'); if($var_mi) { echo 'Musa adında bir üye var!'; } else { echo 'Musa adında bir üye yok.'; } $toplam_uye = $vt->veri('SELECT COUNT(NO) FROM uyeler'); echo 'Toplam ' . $toplam_uye . ' adet üye var.';
Yaklaşık 100 satırlık bu sınıf ile temel olarak genel bir çok projenin rahatlıkla veritabanı yönetimi ihtiyacını karşılayacağına inanıyorum. Daha fazla beklemeden sınıfı indirip kurcalayıp kullanmaya başlamak için buraya tıklayın.
Bir başka PHP serüveninde görüşmek üzere hoşçakalın.
Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.
peki bu class ta mesala bir veri insert ettiğimizde o verinin eklenip eklenmediğine göre hata mesajını neye göre vereceğiz ?
veri ekleme başlığının son paragrafında açıkladığım gibi:
yani şöyle kullanabilirsin:
Tebrik ederim genel olarak yazılarınız açıklayıcı ve bilgilendirici çok verimli çalışmalar olmuş..
Bu son sınıf da türkçe CRUD işlemleri yapmak isteyenler için birebir.
Yazılar için teşekkür ederim bi sorum olacak genel class larla alakalı.. class dışında oluşturduğumuz class yapısında olmayan bir fonksiyonu class içinde kullanamaz mıyız?
sınıfların dışında tanımlanmış normal bir fonksiyonu istediğin yerde kullanabilirsin.
[…] sonra “PHP veritabanı sınıfı” adlı yazıyı incelemenizi tavsiye […]
Sınıflar konusunda yeniyim ama anlatımınızı çok beğendim. yalnız bir sorum olacaktı. sayfama sınıfınızı çağırdım, sayfamın içinde de birden fazla fonksiyon var, her fonksiyon içinde yeniden $vt=new vt() diyerek yeniden tanımlamak gerekiyor heralde. başka çözüm yolu var mıdır acaba?
ben genelde baglanti.php adında bir dosya oluşturuyorum ve bu dosyayı tüm diğer sayfalarda en başta include ediyorum, içeriğide şöyle:
her yerde yeniden tanımlamak değilde bir yerde tanımlayıp onu her yere include etmen gerekiyor.
çok pardon, sorunu tekrar okuyunca yanlış anladığımı farkettim. Bunun için fonksiyonun içerisinde global ifadesini kullanarak dışarıdaki $vt değişkenini fonksiyon içerisine ulaştırman gerekiyor. Bunu da bir örnek ile göstereyim:
$eklenen
=
$vt
->ekle(
'uyeler'
,
array
(
'ad'
=>
'Musa'
));
if
(
$eklenen
) {
echo
$eklenen
.
' NO'lu yeni üye eklendi!'
;
}
else
{
echo
'Yeni üye eklenemedi.'
;
}
$varmi = mysql_num_rows(mysql_query("select id,kadi from uyeler where kadi='$kadi'"));
Bu sorguyu nasıl çalıştırabiliriz bu sınıfta veritabanında varmı yokmu diye?
son konuda bunun örneğini vermiştim:
Gerçekten okadar aradım taradım böyle bir sınıf bulamadım kullanmayacağım şeyler mevcut içerisinde çoğunun. Peki:
$vt->duzenle(‘uyeler’, array(‘ad’ => ‘Ahmet’), array(‘NO’ => 15)));
burada nosu 15 ve sıranosu 12 olanları nasıl düzenleyebiliriz. Kısacası bunun içinde and yada or kullanabilir miyiz?
Çalışmalarınızda başarılar diler teşekkür ederim…
daha fazla koşul için arraya ekleme yapman gerekiyor, yani şöyle;
Çok teşekkür ederim hızlı cevabınız için.Birşey daha sormak istiyorum:
$vt->ekle('deneme', array(
'ad' => $ad,
'soyad' => $soyad,
'metin' => $deneme
));
şeklinde ekleme yaptırıyorum ve:
if($ekle){
echo 'eklendi';
}else{
echo 'eklenemedi';
}
gibi kontrol ettiriyorum ama veri eklenmiyor “eklenemedi yazıyor”?
Pardon dikkatsizliğimden kaynaklanmış 🙂
$ekle = $vt->ekle şeklinde belirtmemişim acele ile
tekrardan teşekkür ederim 🙂 sitenizin takipçisiyim bundan böyle…
Merhaba ben sınıfla biraz oynadım:
private $onek = “onek”; şeklinde tabloların başına önek ekledim. yani onek_tablom şeklinde oldu (prefix)
$ekle = $this->Sorgu(‘INSERT INTO ‘.$this->onek.’_’.$tablo.’ (‘.$alan.’) VALUES (‘.$veri.’)’);
şeklinde de veri ekleme,silme ve güncelleme fonksiyonlarını düzenlemeyi başardım. Fakat tablo olarak verileri okumak:
$vt->tablo(‘SELECT * FROM tabloadi LIMIT 10’);
Tek satır veri okumak:
$vt->satir(‘SELECT * FROM tabloadi WHERE id = 1’);
yada Tek bir değeri okumak:
$vt->veri(‘SELECT isim FROM tabloadi WHERE id=13’);
gibi yerlere tanımladığım private $onek = “onek”; i ekleyemedim. Ne yapmam gerek sınıf konusunda yeniyim lütfen yardımcı olun 🙁
bunun için önce sınıf içinde tanımladığın $onek değişkenine dışarıdan ulaşabilmek için private değilde public yapmalısın. sonrasında o tip sorgularda şu şekilde kullan;
96. satırdaki:
return $this->sorgu('TRUNCATE TABLE '.$tablo);
kullanılması doğru bir yaklaşım değildir.
biliyorsunuz “truncate” tablodaki tüm verileri sildiği gibi tablonun “AUTO_INCREMENT” değerini de sıfırlar. bir tablodaki tüm verileri silerseniz ve daha önce o tabloyla ilişkili başka bir tablo varsa ve verilerin silindiği tabloya daha sonra yeniden veri girerseniz ilişkilendirme hatasıyla karşılaşırsınız (kod hatası değil mantıksal hata).
TRUNCATE TABLE yerinde iki satır üstteki DELETE kullanılması doğru yaklaşım olacaktır.
105. ve 111. satırdaki addslashes’ler yerine mysql_real_escape_string kullanılması gerekiyor. addslashes sql için yeterli kaçış işlemi uygulamaz.
sil metodu için bu durumu açıkladım:
eğer ilişkili bir tabloyu bu şekilde silmek isterseniz sorun çıkartır, bu yöntem “TRUNCATE TABLE” kullanımının kısayolu olarak yapıldı. “AUTO_INCREMENT” değerinin sıfırlanmadan tamamını silmek istiyorsanız kendiniz bir sorgu çağırabilirsiniz.
addslashes yerine mysql_real_escape_string kullanılabilir, dediğiniz gibi bu fonksiyon diğerinden daha kapsamlı temizleme uyguluyor. Geliştirici yorumlarınız için teşekkürler.
merhaba yaptığınız sınıf harika teşekkür ederim sınıfınızı mennuniyetle kullanıyorum yapmak istediğim birşey var checkbox ile seçilen verileri silmek istiyorum ama sizin sınıfı kullanarak bunu nasıl yaptırabilirim yardımcı olursanız sevinirim.
isteğiniz üzerine bu konuyla alakalı bir yazı hazırladım, yorumunuz ve ilginiz için teşekkürler.
http://www.phpr.org/php-ile-checkbox-kullanimi/
bunu kasdetmemiştim bunu biliyorumda sizin bu sınıfı kullanarak toplu silme işlemini nasıl yaparım onu kasdetmiştim.
checkbox ile toplu silme olayının asıl mevzusu o yazıda anlattığım şekliyle gerçekleşiyor, veritabanı sınıfı ile alakalı olan kısım sadece en son örneğimde yazdığım mysql sorgusu. bunun için normal
$vt->sorgu('...')
diyebilir ya da$vt->sil('tablo', 'NO IN ( ' . $silinecekler . ' )');
diyebilirsiniz.merhaba,
çoklu veri eklerken mesela
aciklama[]
adet[]
fiyat[]
bunları nasıl ekleyebiliriz
birden fazla açıklama, birden fazla adet falan gibi mi?
name=”aciklama[]”
name=”aciklama[]”
name=”aciklama[]”
name=”adet[]”
name=”adet[]”
name=”adet[]”
name=”fiyat[]”
name=”fiyat[]”
name=”fiyat[]”
Merhaba veritabanına kayıtladığım zaman son id yi normalde yanlış hatırlamıyorsam last_insert_id şeklinde alıyorduk bunu sınıfı kullanırken nasıl alabilirim
“Veri eklemek” başlığının son paragrafına bakınız.
Seflink İçin Yaptığım Fonksiyon İle Gelen Veriyi Örnek İnternetli ve Şarjlı Minibüsler Geliyor Bu Başlığı internetli-ve-sarjli-minibusler-geliyor Bu Şekle Ceviriyor Sizin Sınıfınız İle Kayıt İşleminde Veritabanına nternetli-ve-arjl-minib-sler-geliyor bu şekle ceviriyor 🙁
tirnakKes fonksiyonunu kaldırmama rağmen yapıyor 🙁
bence bu sorun karakter setleri ile alakalı. veritabanı tablonuzda ilgili değerlerin ve php dosyalarının karakter setlerini kontrol edin. ben hepsinin utf-8 olmasını öneririm.
sql tablom utf8 olarak ayarlı herşey lakin hala ynı 🙁
ayrıca utf8 ilgili birşey olmuş olsa bence diğer verilerdede problem olurdu birtek seflink yapmamda sorun oluyor 🙁
sef link yapmak için şu fonksiyonu deneyebilir misin:
teşekkür ederim bu fonksiyon sorunsuz çalıştı
özür dilerim oldu sandım ama olmamış 🙁
Merhaba Bu Sınıfa Veritabanı Backup Alma Özelliği Koyabilmemiz Münkünmü Münkünse Nasıl Koyabiliriz. SQL Dosyasını cıktı vericek yada ftp de saklıcak.
Merhaba Musa, sınıf için teşekkürler.
Fakat nedense ekle fonksiyonu ikikere ekliyor ve sorununu çözemedim belki benim kodlamamda bir sorun var.. Formdan gelenleri eklemek için şöyle birşey yapmaya çalışıyorum..
get_template fonksiyonum sadece tema içinden ekle.php’yi getiriyor. içerisinde de form mevcut.
ooopps..
Çözümü buldum… ekle.php içinde kontrol yaptırıyorum, eklendiyse veya hata varsa uyarı ver diye.. O zaman iki satır ekliyor. Fakat if-else’i bir üstteki fonksiyonumun içinde dönderdiğim zaman tek satır ekliyor…
Son eklenen satırın id’sini almak için sınıfın sonuna aşağıdaki fonksiyonu ekledim.
function idAl(){
return mysql_insert_id();
}
$vt->idAl yaparak kullanabilirsiniz.
bu özellik zaten sınıfın yeni veri ekleme metodunda mevcut. “Veri eklemek” başlığının son paragrafına bakınız.
Sınıftaki ekle metodundaki mysql_insert_id() değerinin her daim 0 dönmesinin sebebi return kısmındaki gizemde yatıyor.
if($ekle) return mysql_insert_id();
değeri
if($ekle) return mysql_insert_id($this->baglanti);
şeklinde değiştirilirse sorun çözülür.
hocam sql injectiondan korkmadan rahatlıkla kullanabilir miyiz sınıfınızı ilk kez sınıf olayına girecegimde cehaletimi bağışlayın lutfen 😉
direkt sorguyu yazıp kullandığınız metodlar haricinde diğer metodlarda “addslashes” fonksiyonu ile tırnak işareti önlemlerini alıyor, bunun haricinde yine çalışmanızı sürdürürken gerekli denemeleri ve önlemleri uygulayarak devam etmekte fayda var.
Merhabalar Musa hocam,
üyelik kontrolü yapmak istediğimde undefined index user ve pass sorunu alıyorun. nerde hata yapıyorum acaba
veri("SELECT * FROM admin WHERE username='$kadi' AND password='$sifre'");
if($var_mi) {
$_SESSION["giris"] = "true";
$_SESSION['uye'] = $kadi;
echo '';
}
else {
echo " Hata: Lütfen Bilgilerinizi kontrol edip tekrar deneyin.
";
}
?>
merhabalar, paylaştığınız kod ve hata sorunu anlamamız için yeterli değil. hatanın tam metnini, hangi satırda olduğu ve o satırı da paylaşabilirseniz daha iyi yardımcı olabiliriz.
güzel bir class ancak bukadar basit kalmamalı diye düşünyürum. Mesela JOIN, LEFT, RIGHT gibi fonksiyonlarıda içermeli. teşekkürler yinede.
Sınıfınız çok kullanışlı. Benim sorum: Sınıfta veri tabanını kapatan bir fonksiyon göremedim. bir kaç girişten sonra “too many connections” uyarısı alıyorum. Nasıl çözebilirim?
Teşekkürler
PHP’de mysql kapatma fonksiyonuna gerek duyulmuyor, yani zorunlu değil. Her sayfa çalışması sona erdiğinde PHP siz kapatmasanız bile otomatik olarak kapatmaktadır. Bahsettiğiniz hatayı almanızın sebebi sunucunuza olan aşırı yük ya da saldırıdan kaynaklanıyor olabilir.
Peki free_result için ne öneririsiniz hocam? sınıfın içinden mi çözmeyi yoksa dışardan nasıl olur?
bahsettiğiniz metodu ben hiç kullanmadım. araştırdığım kadarıyla eğer bir betik içerisinde çok büyük MySQL verileri içeren sorgular yapıyorsanız MySQL’in hafızasını boşaltıp yeni sorgulara yer açmak için faydalı olabilir. Fakat eğer çok büyük verilerle çalışmıyorsanız kullanmanıza pek gerek yoktur.
Asıl sorunuza gelince isterseniz sınıf içerisine böyle bir metod dahil edebilirsiniz.
“Sorgu yapma” basligi altindaki örnekte “update” fonksiyonu kullanilmis. “query” olmayacakmiydi?
Selamlar
sorgu yapma başlığında örnek amaçlı “update” yani güncelleme sorgusu yapmayı gösterdim, sorgu metodunu kullanarak istediğiniz SQL sorgusunu yapabilirsiniz.
Selamlar; Aynı domaindeki bir veri tabanından diğerine aktarım yapmam gerekiyor. Fakat sadece birine ulaşabiliyorum. Sanırım sorun “mysql_select_db”. Sınıfa nasıl bir ekleme yapmalıyım ??? Teşekkürler
Biraz kendim sordum kendim cevapladım gibi oldu ama bu problemle karşılaşan arkadaşlara yardımcı olması açısından bilgiyi paylaşayım:
Sınıftaki bağlantı parametreleri
$this->baglanti = mysql_connect($host, $kullanici, $sifre) or die(‘MYSQL ile bağlantı kurulamadı’);
şeklindeydi. mysql_connect için bir dördüncü parametre sorunu çözdü
$this->baglanti = mysql_connect($host, $kullanici, $sifre, TRUE) or die(‘MYSQL ile bağlantı kurulamadı’);
ilgilenen arkadaşlara yardımcı olur umarım.
merhaba, sınıf çok güzel olmuş fakat sormak istediğim bir şey var kayıt ekleme işlemini array ile yapıyorum ve aşağıdaki gibi bir arrayım var
$telefon=array(
“nokia”=>335,
“Sony”=>250,
“Samsung”=>200,
“LG”=>250
);
örnek olarak nokia ya gelen value yu x() fonksiyonundan samsung tan gelen value yu sef() fonksiyonundan geçirmem gerekiyor bazılarını da direkt eklemem gerekiyor bunun ayrımını sınıf içinde nasıl yapabilirim?
Çok teşekkürler üstad, gerçekten başarılı olmuş.
Buna birde memcache eklense süper olur 🙂
merhabalar, öncellikle çok teşekkür ederim mükemmel anlatmışsınız. Benim bu konu ile ilgili sorum yok fakat öğrenmek istediğim bir takım ifadeler var. Örnekse ?, =>, -> gibi operatörler görmeye başladım makalelerde, bununla ilgili bir makale yazarmısınız veya bir açıklama yapar mısınız?
Merhabalar,
Öncelikle bu pratik sınıf için teşekkürler.
Makalenize aynı anda birden fazla veri çekme ekleme gibi bilgileride eklemeniz yararlı olacaktır.
Saygılar.
duzenle metodu için koşul parametresini boş gönderemiyoruz. örneğin;
$vt->duzenle(‘kisiler’, array(‘ad’ => ‘Kadir’));
veya
$vt->duzenle(‘kisiler’, array(‘ad’ => ‘Kadir’), ”);
iki şekilde de hata veriyor. tablodaki tüm verileri güncellemek için bu sorgu çalıştırılması gerekiyor. duzenle metodu için koşul varsa “where” sorgusunu eklemesi gerek.
merhaba ilk fonksiyon yapıcı fonksiyon yanı class başka sayfada oluşturulup çağrıldığında çalışması gerekiyor kendiliğinden. ama henüz belirlenmemiş vt fonkisyonunun parametreleri var nasıl oluyor. çalışması için parametre mi bekliyor acaba kendiliğinden onu merak ettim.
birde bazı fonksiyonları anlayamadım acaba neden fonkisyon içinde aynı fonksiyon var. mysql_query ile sorgu fonksiyonu aynı mesela sadece iç içe
bloglara pek yazı yazmam ama senin blog bir başka dostum..
bu veri alma düzenleme silme işlemlerini form kullanarak naısl yapabiliriz? bu konuda aydınlatabilir misin?
iyi çalışmalar
Mysql komutlarını Mysqli ye çevirebilirmisin acaba . yeni php sürümüyle hata veriyor.
mysql veri tabanına bağlanırken yazdığımız $vt= newvt(‘kullanıcı’, ‘şifre’, ‘veritabanı’); newvt yerine localhost yazacağız öyle değilmi