PDO MySQL veritabanı sınıfı
Bir önceki yazımda PDO konusuna giriş yapıp temel kullanım şeklinden bahsetmiştim. Şimdi ise PDO ile MySQL bağlantısı yapıp rahat bir şekilde kullanabileceğimiz bir static PDO sınıfını sunacağım.
Kullanımı kolay ve performanslı olabilmesi için static bir sınıf hazırladım. Aynı zamanda singleton pattern yapısında, yani sadece siz veritabanına ihtiyaç duyduğunuzda sunucuya bağlanır ve tekrarlamaz.
Yapmanız gereken veritabanı bilgilerinizi ilgili sabit değerler ile tanımlayıp bu sınıfı include edip kullanmak. Burada bu yazıdan sonra anlatacağım tüm çalışmalarda bu sınıf ile veritabanı bağlantısı yapacağız.
Sınıfın özellikleri
PDO zaten kendi halinde tüm temel isteklere cevap verecek metodlara sahip. Bu sınıfın metodlarını hazırlarkende bir kaç satır kod kullandığımı görebilirsiniz. Artıları nedir derseniz;
- Öncelikle her sınıfın sağladığı pratikliği sağlıyor. Herhangi PDO bağlantı terimiyle uğraşmadan dosyaları uygulamanıza ekleyip ayar dosyasındaki sabitlerden veritabanı bilgilerini girip kullanmaya başlayabilirsiniz.
- Sınıf singleton pattern yapısına sahip ve aynı zamanda statik olduğu için uygulamanızın en başında bir değişkene atanma ya da uygulama başlar başlamaz veritabanına bağlanma ihtiyacı duymaz. Örneğin uygulamanızda içerikleri cache ile sakladınığınızda ve yanlızca belirli dakikalarla veritabanından çekmek istediğinizde diğer zamanlarda gereksiz bağlantılar yapmamış olursunuz.
- Bir satır bir satırdır. getVar, getRow gibi metodlar sayesinde tek bir satırda ihtiyacınız olan satır ya da verilere ulaşabilirsiniz.
- Tüm içerik çeken metodlarında ikinci parametre olarak bindings değerlerini alıyor. Bu sayede yine bir kaç metod daha kısaltıyoruz.
- Sorgulardan dönen tüm içerikler obje tipinde dönmesini sağlıyor. Değerleri daha hızlı yazıp daha temiz görmemizi sağlıyor.
- Get metodu ile sorgunun tüm satırlarını arraya yüklenmiş bir şekilde alıyoruz. Elde ettiğimiz sonucu direkt cache yapabilir ya da foreach ile döndürebiliriz.
- getLastError metodu ile daha pratik hata karşılayabiliyoruz.
- Insert metodu direkt olarak eklenen satırın ID’sini veriyor.
- Tüm bunların yanında deneysel ve olayları daha iyi kavrama amacıyla dizayn ettiğim bu sınıf sayesinde PDO’ya daha iyi hakim olabiliyorum.
Özetle sınıf; statik, pratik ve singleton. PDO kendi haliyle yeterli bile olsa elinizin altında bu tarzda bir sınıfınızın olması mutlaka işlerinizi daha da kolaylaştıracaktır.
PDO’nun kendisi
Sınıf PDO’dan extends edilmedi, fakat __callStatic sihirli metodu sayesinde sınıfa statik olarak yapılan her çağrı direkt olarak PDO’da çalışacak. Yani bu sınıf ile bir önceki yazımda bahsettiğim ve bahsetmediğim tüm PDO metodlarını statik olarak çağırabilirsiniz.
$posts = DB::query('SELECT * FROM posts'); foreach($posts as $post) { echo $post->title . '<br/>'; }
SQL Injection’a son
Neredeyse tüm amatör PHP ve MySQL projelerinde SQL injection açığı bulunuyor. Fakat PDO’nun binding özelliği sayesinde sorgu içerisindeki değişken değerler harici olarak dahil ediliyor ve kaçış karakterleri ekleniyor. Bu sayede bu basit açıktan da arınmış oluyoruz. Aşağıdaki sorguyu korkusuzca çalıştırabiliriz.
$post = DB::query('SELECT * FROM posts WHERE id = ?', array($_GET['id']));
Bindings (Hazır Deyimler) kullanımı
Yukarıdaki örnekteki query metodu PDO’nun binding özelliği ile birleştirdiğim bir metoddur. İlk parametresine sorguyu ikinci parametreye ise sorgu içerisinde “?” (soru işareti) ile ifade ettiğimiz yerlere gelecek değerleri vereceğimiz dizidir. Daha geniş bir binding örneği;
DB::query( 'SELECT * FROM users WHERE id = ? AND name = ? AND email = ? LIMIT 1', array($id, $name, $email) );
Bu yöntemi anlatacağım tüm içerik çekme metotlarında kullanabiliriz.
İçeriklerin obje tipinde dönmesi
Sınıfta PDO’nun veri çekme metodunu obje olarak belirledim. Yani çektiğimiz sonuçları bize varsayılan array tipinde değil obje olarak döndürecek.
Obje tipi ile yazması daha hızlı ve görüntüsü daha hoş. Örneğin;
// Obje tipi ile echo $user->name; // Array tipi ile echo $user['name'];
Tek bir değeri çekmek
Sınıfın asıl esprilerine gelelim. “getVar” metodu ile yazdığınız sorgunun döndüreceği tek değeri alıyoruz. Örneğin sadece bir üyenin adını ya da toplam üye sayısını almak istiyorum.
// Bir kullanıcının adı $name = DB::getVar('SELECT name FROM users WHERE id = 1 LIMIT 1'); echo 'Selam ' . $name; // Ya da toplam kullanıcı sayısı $count = DB::getVar('SELECT COUNT(id) FROM users'); echo 'Toplam üye sayımız ' . $count;
Tek bir satırı çekmek
getRow metodu ile yazdığımız sorgunun döndüreceği bir satırı alabiliyoruz. Bir üyenin ya da bir içeriğin değerlerine ulaşmak için ideal.
$user = DB::getRow('SELECT * FROM users WHERE id = 1 LIMIT 1'); echo 'Merhaba ' . $user->name . '!'; echo 'E-mail adresin: ' . $user->email;
Birden fazla satır çekmek
Tablodaki içerikleri listelemek için iki farklı yöntem mevcut. Ya varsayılan olarak PDO’nun query metodu ile ya da sınıftaki get metodu ile tüm sonucu arraya çevirip bir değişkene atayabilirsiniz.
$books = DB::get('SELECT * FROM books ORDER BY price DESC LIMIT 30'); foreach($books as $book) { echo $book->title . "n"; }
Yeni bir satır eklemek
Yukarıda bahsettiğimiz binding yöntemi ve insert metodu ile satır ekleme sorgumuzu hazırlıyoruz. Bu metot sonuç olarak son eklenen ID’yi döndürüyor.
$name = 'Bill Gates'; $email = '[email protected]'; $password = md5('linux'); $id = DB::insert( 'INSERT INTO users (name, email, password) VALUES (?, ?, ?)', array($name, $email, $password) ); echo 'Yeni eklenen üyemizin ID'si ' . $id;
Satırları düzenlemek veya silmek
Yukarıdaki insert metodu ile aynı şekilde çalışan exec metodu ile düzenleme ve silme sorgularımızı çalıştırabiliriz. Tek farkı bu sefer etkilenen satır sayısını alırız.
// Düzenlemek $affected = DB::exec('UPDATE users SET scores = 10 WHERE id > 30'); echo $affected . ' adet üye düzenlendi.'; // Silmek $affected = DB::exec('DELETE FROM users WHERE id < 30'); echo $affected . ' adet üye silindi.';
Hataları karşılamak
Eğer hata kontrolleri de yapmak istiyorsanız getLastError metodunu kullanabilirsiniz. Eğer son yapılan sorguda bir hata meydana geldiyse hata kodu ve mesajını içeren bir array döndürür. Eğer bir sorun çıkmadıysa false döner.
$id = DB::insert( 'INSERT INTO users (name, email) VALUES(?, ?)', array('Ahmet', '[email protected]') ); if($error = DB::getLastError()) { echo 'Bir hata oldu, hata mesajı: ' . $error[2]; } else { echo 'Başarıyla eklendi! Eklenen ID ' . $id; }
Sonuç
Bundan önce anlattığım veritabanı sınıfı artık müfredattan kalkıyor, bu nedenle artık herkese PDO ve güncel alternatifleri olan MySQLi gibi sınıfları öneriyorum. Ayrıca önermekle kalmayıp temel ihtiyaçları rahatlıkla karşılayan ve rahat bir şekilde kullanılabilecek olan bu statik ve singleton yapıya sahip sınıfı sunuyorum.
Sırayla gitmeyi seven birisi olarak (en temel derslerden bu konulara gelmemden anlayacağınız üzere) yine yukarıda belirttiğim gibi bundan sonraki örnek çalışmalarda bu sınıfı kullanarak bir şeyler anlatmaya çalışacağım.
PDO MySQL veritabanı sınıfının dosyalarını indirmek için tıklayın.
Bir sonraki PHP serüveninde görüşmek üzere hoşça kalın.
Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.
ya hocam bi önceki pdo yazınızdan ne farkı var bunun.bi kaç farklı kod var .kullanmak şartmı.
ben bi önceki yazınızdan öğrendiğimle yaptığım projedeki tüm veritabanı işlemlerini gerçekleştirebileceğimi düşündüm.doğru demi
eleştirmek için değil öğrenmek için böyle bi üslüp kullandım
Güzel soru. Yazının içerisine “Sınıfın özellikleri” diye bir başlık daha ekledim.
gayet başarılı temel seviyedeki developerler için çok başarılı bir kaynak olacak diye düşünüyorum
Eline sağlık Musa, ufak çaplı işlerde bir önceki veritabanı sınıfını kullanıyorduk. Şimdi bunu kullanma zamanı 🙂 Aslında biraz daha geliştirilebilinir. Basit tablo ilişkileride ekleyebiriz.
Faydalı bi makale daha. Eline sağlık Musa 🙂
Güzel anlatım, işe yarar temiz bir sınıf. Teşekkürler.
Çok yararlı bilgiler vermişsin ve güzel anlatmışsın teşekkürler.
Musa hocam sizden bir istekte bulunabilirmiyim?
PDO’ya memcache entegre edebilmek için.
örnek verecek olursan mysql_query(“select * from konular”,300)
300 saniye cachlesin. bu örnek mysql_* için oldu ama 🙂
Çogu arkadaşın işlerinde kolaylık olmuş olur.
Güzel anlatım için teşekkürler. Sitenizde ki yazıların tamamı çok akıcı ve anlaşılır..
merhaba hocam pdo ya şu makalenizden başladım
http://www.phpr.org/php-data-objects-pdo/
sonra fark ettimki pdo nun parametreli hali var.fakat kararsız kaldım sizin bu sayfada anlattığınızdanmı gitmeliyim yoksa şurdanmı
http://tr.php.net/manual/tr/pdo.prepared-statements.php
Merhaba; PDO’ya yeni geçiş yapıyorum. Açıkçası PHP’de de yeniyim. Sizin PDO için yazmış olduğunuz sınıfı indirdim. Gayet güzel çalışıyor. Ancak config adında bir klasör oluşturup, config.php ve db.php dosyalarını config klasörü içine koyuyorum. Sonrasında ise root’ta bulunan index.php sayfama require ile config/config.php dosyasını çekiyorum. Fakat böyle yapınca hata veriyor ve çözemedim sorunu. Yardımcı olabilirseniz sevinirim.
Aldığım hata:
Fatal error: Call to undefined method DB::getRow() in C:xampphtdocssuhaindex.php on line 3
index.php dosyamın içeriği ise:
include("config/config.php");
$ayarlar = DB::getRow('SELECT * FROM sitesettings WHERE SetID = 1');
echo $ayarlar->SiteTitle;
merhaba burada global olarak db değişkeni tanıtmak gerekiyo galiba bu konuyla alakalı açıklama yapar mısınız
Merhaba,
Bu class’ı kullanmayı denerken sql sorgusu yapmak istediğimde primary olan stun ile rahatlıkla sorgu yapabiliyorum.
Örn: Bu kodu çalıştırdığımda bir sıkıntı olmuyor.
$users = DB::getRow(‘SELECT * FROM customer WHERE customer_id = 12 LIMIT 1’);
Fakat bu tablosan başka bir stun ile sorgulama yapmaya çalıştığımda ise sonuç negatif.
Örn:$users = DB::getRow(‘SELECT * FROM customer WHERE email = admin@localhos LIMIT 1’);
Bu arada belirteyim. Php’yi sayenizde öğrendim. Emeğinize sağık.
Yardımınızı bekliyorum.
sorguda sayı ya da mantıksal olmayan yazı ve metin gibi degerleri tırnak içinde yazmanız gerekiyor. yani sorgunuzun şöyle olması lazım;
SELECT * FROM customer WHERE email = “admin@localhos” LIMIT 1
Teşekkür ediyorum.
Cevabınızı görmeden az önce sorunu deneme yanılma ile çözdüm.
Ama kalıcı oldu, hatayı tekrarlamam umarım.
Çalışmalarınızda başarılar dilerim.
Selamlar.
Paylaşımlar çok yararlı ciddi manada çok teşekkürler yalnız benim bir sorum var. PHP de PDO kullanırken veritabanında id ye göre satırları çekmek istiyorum. Yani id yi çektim mi isim, soyisim ne varsa o satırda o id ye ait gelsin istiyorum bu nasıl mümkündür?
Teşekkürler.
merhaba
$sorgu_eposta = DB::getRow(‘select EPosta from profil where EPosta = ? ‘,array($g_ePosta)); kullandığımda eğer veritabanından kayıtlı eposta yoksa hata veriyor varsa hata vermiyor bu yazmış olduğunuz class la mı alakaladır ve düzeltmek için ne yapabilirim
Merhaba Verdiğiniz Classı Kullanırken Sorun Yaşıyorum. Localde Sıkıntı Yok, Hostinge Geçtiğim Zaman
Fatal error: Call to undefined method DB::prepare() in /home/enoyunoy/public_html/conf.php on line 71
Hatası Alıyorum
Merhaba,
DB::getLastError() konusunda bir sorun var.
Fatal error: Call to a member function errorInfo() on a non-object in ……
gibi bir hata veriyor
Onun yerine DB::errorInfo() kullanılınca sorun çıkmıyor.
gerçekten güzel bir paylaşım. özellikler uzun sorgular yazarken array kullanmak gerçekten iyi gelebilir. böylece oluşturulan sorgularda string toplamaktan rahat olacak.
Hocam pdo hakkında çok fazla kaynak yok böyle sınırlı kaynak varken pdo’ya geçilmesi çok uzun zaman alacak gibi. Sizin sayenizde bu teknolojilerden geri kalmıyoruz. Bu örneği daha iyi anlaşılması açısından form işlemleri ile nasıl yapabiliriz acaba. Bu konuda yeni bir yazı hazırlamayı düşünyor musunuz.
[…] […]
Merhaba… Ben PhpMysql de içe aktarma sorunu yaşıyorum. Herrhangi bir .sql dosyasını içeri aktar dediğimde ” Gönderilen dosya açılamaz çünkü sunucu /tmp dizinine (geçici dosyalar için) erişmeden open_basedir etkinleştirildi.” mesajı alıyorum. Google’da bunun güvenlik amaçlı olduğu ve geçici dizin oluşturmam gerektiği yazıyor ancak bunu yapamadım. Neler yapmam gerektiği konusunda fikrinizi öğrenmek isterim. Teşekkürler…
Allah razı olsun
çoklu satır okumada LIKE komutunu kullanabiliyorumuyuz ? sürekli hata alıyorum
tam olarak anlamadım, biraz daha açabilir misiniz?
kodda hata yapmışım problem yok , teşekkürler gayet güzel bir sınıf olmuş
Güncelleme işlemni nasıl kullanıyoruz her şekilde denedim hiç bir sonuç alınmıyor DB::exec fonksiyonu çalışmıyormu yoka yada benmi yapamıyorum çoklu üncelleme olmuyor bu işte yeniyim ama yardımcı olurmusunuz ?
kullandığın sorguyu da yazabilir misin?
$affected = DB::exec(‘UPDATE uyeler SET kull = ‘$kull’, sifre = ‘.$sifremd5.’, tarih = ‘$tarih’ WHERE kull > ‘$kull”);
Tamam sorunu çözdüm kodlarda hiç bir hata yok zaten kodlarda hata var demedim ama nasıl bir yanlışlık yapmış olabilirirm demiştim ellerine yüreğine sağlık hocam çok güzel bir class yapmışsın 🙂
Güncelleme işlemiyle ilgili birlgi verecek yokmu ?
Sorguşöyle:
$affected = DB::exec(‘UPDATE uyeler SET kull = ‘$kull’, sifre = ‘.$sifremd5.’, tarih = ‘$tarih’ WHERE kull > ‘$kull”);
Sorgunu şu şekilde değiştirirsen sorun kalmaz.
$affected = DB::exec(‘UPDATE uyeler SET kull = ?, sifre = ?, tarih =? WHERE kull > ?’,array($kull,$sifremd5,$tarih,$kull));
Bu fonkiyonu nasıl sizin veritabanı class ıyla tekrar düzenlenebilir ?
Function kategori($kategriid= 0, $sec = 0, $kategorialt){
$kat = mysql_query(‘SELECT * FROM kategoriler WHERE kategorialt=”‘.$kategriid.'” ORDER BY kategriid ASC’);
if(mysql_affected_rows()){
While ($yaz = mysql_fetch_assoc($kat)):
echo ”.str_repeat(‘ ‘, $sec).$yaz[“kategoriisim”].”;
kategori($yaz[“kategriid”], $sec + 1, $kategorialt);
endWhile;
}else {
return false;
}
}
merhabalar, bunu memcache uyarlı nasıl yapabiliriz.
Bu sınıfı kullanan sistemim son zamanlarda “Too many connections” hatası vermeye başladı. Bu sorunu nasıl çözebilirim ..?
Müzeyyen çok fazla bağlantı açmışsın yada muhtemelen açtığın bağlantıları kapatmıyorsun.
Bende de “too many connections” uyarısı verdi ve host firmam uyarıyor sürekli. Acaba sınıfta bir sorun mu var?
Aksine class her sorgu için tekrar tekrar bağlantı açmayacak şekilde hazırlanmıştı. Aldığınız trafiklerde artış oldu mu acaba?
Yok trafikte bir artış olmadı. Yalnız sınıfta birşey ilişti gözüme. Bağlantıyı sonlandırmamışsınız. Önceki pdo dersinde bağlantıyı zaten php sonlandırıyor demişsiniz. Ama yine de bağlantı değişkenini null yapabilirsiniz diye de belirtmişsiniz. Bu sınıfta böyle bir kullanım yapmak istesek. __destruct içerisinde mi belirtmeliyiz? Sınıfta ne gibi bir değişiklik yapmamız gerek? Yada unset mi kullanmalıyız?
Sayın hocam bu statik sınıf içerisinde bindParam kullanımı neden yok soru işareti kullanmaktansa onu kullansak daha iyi olmaz mı? rollback te yok bunları da ekleyip sınıfı güncellerseniz süper olur.
DB::beginTransaction();
$id = DB::insert(
‘INSERT INTO users (name, email) VALUES(?, ?)’,
array(‘Ahmet’, ‘[email protected]’)
);
$affected = DB::exec(‘UPDATE users SET scores = 10 WHERE id > 30’);
// Yukarıda bir problem olursa
if($error = DB::getLastError()){
DB::rollBack(); // Herşeyi geri al
}else{
DB::commit(); // Tüm işlemleri işle
}
Trafikte bir artış yok. Ancak hostgator’un shared hosting için belirlediği sınıra takıldığımı farkettim. Aynı anda 25 bağlantı diyor ve 400 kişinin online olduğu bir forumda sorunsuzca çalışabilirsiniz diye eklemiş. Sanki sınıfta __destruct metodu olmalı ancak nasıl yapacağımı bilmediğimden uygulayamadım…
public function __destruct()
{
unset($this->last_stmt);
}
Şeklinde unset edebilirsiniz arkadaşlar.
class DB içindeki fonksiyonlar arasına ekleyerek, sayfa yada sorgu sonunda DB::__destruct(); olarak mı bağlantıyı sonlandıracağız ?
PHP bu tür işlemleri otomatik yapıyor, bu yüzden gerek yok. Fakat sayfanın ortasında bir yerde özellikle sınıfı ve bağlantıyı sonlandırmak istiyorsan kullanabilirsin.
Hocam öncelikle bu class için teşekkürler. Gerçekten çok işime yaradı.
Şimdiye kadar bir çok çalışmam da sorunsuzca kullandım fakat yeni bir hostingte aşağıdaki hatayı alıyorum.
Call to undefined method DB::prepare() in /home1/xxx/public_html/xxx.com/inc/xxx.php on line 72
localimde sorunsuzca çalışıyor fakat hostingte birşey eksik sanırım o yüzden çalışmıyor yardımınızı rica ederim.
PHP versiyonu ile alakalı olabilir
hocam getRow ile getVar arasındaki fark ne acaba ?
Hocam class için teşekkürler. Benim bu class ile ilgili problemim var. Turk Telekom serverini kullanıyorum PDO açık. Normal komut yapısı ile veritabanı işlemleri çalışıyor fakat yazmış olduğunuz veritabanı sınıfı çalışmıyor. Sorun da ekrana çıkmıyor. Sizce problem nerden kaynaklı olabilir?
sunucuda hata raporlama kapalı olabilir, aşağıdaki kodu kodun başına ekleyip hatayı görebilirsin.
Teşekkür ederim hocam. Fatal error: Undefined class constant ‘ATTR_DEFAULT_FETCH_MODE’ in /db.php on line 53 hatası aldım. Çözmeye çalışıyorum.Çoğu yerde sunucuya yeniden PDO lurulması lazım demişler.
merhaba hocam, çok bilgim yok ama biraz araştırdım sonuç olarak da fetchAll kullanımı bana lazım etti ama bir türlü yapamadım. bana yardımcı olmanız mümkün mü ?
yapmak istediğim şu; 100 kayıt olan bir tablodan 10 tanesini alıp, checkbox durumunu kontrol etmek istiyorum.
s.a kardeş, bir türlü çözemedim, fetch ve fetchAll kullanımı hakkında bilgi verebilirmisin ?
Kardeş ellerine sağlık çok güzel bir yazı olmuş.Benim sorum olacakdı PDO-dan pekde iyi anlamasamda.Sınıflarda acaba sql sorgularını hazırlayan bu -quote,prepare(bindParam) – metotlar varmı? Ben göremedim.
Evet var, yazının “Bindings (Hazır Deyimler) kullanımı” başlığını inceleyebilirsin.
Merhabalar yukarıda insert, update, delete, select örneklerini vermişsiniz çok teşekkürler PDO konusunda buradan başladım son makalenize kadar da devam edeceğim inşallah… burada veritabanında arama yaparken array döngüsüne nasıl alıyoruz.
dostum öncelikle eline sağlık, uzun zamandır paylaştığın class’ı ufak tefek projelerde kullanıyorum. çok işimi gördü diyebilirim o yüzden teşekkürü borç bilirim. şu güne kadar bir sıkıntı da yaşamadım. fakat bugün enteresan bir durum fark ettim. ckeditor gibi bir editör ile mysql tablosuna html tagları içeren bir veri göndermek istersek ve içeriğinde atıyorum gibi bir veri varsa ” dan sonrasını silip atıyor normal olarak. bunun için ? yerine : gibi bir string ile yollanması gerekiyor bildiğim kadarıyla. bu durumu class’a eklemek istesek nasıl bir şey yapmamız gerek sana sormak istedim. yada sen bu gibi durumlar da nasıl bir yol kullanıyorsun. kolay gelsin…
Bu yazıdaki “Bindings (Hazır Deyimler) kullanımı” başlığına bakabilirsin
Musa Hocam ,
Öncelikle bu kullanışlı sınıfı paylaştığın için teşekkür ederim , benim sorunum tek tırnağin kayıt yaparken problem olmamasına rağmen update işleminde hata vermesi , bu konu ile ilgili çözüm öneriniz nedir.
binding kısmını doğru kullanıp kullanmadığınızı incelemenizi öneririm
$affected = DB::exec(‘UPDATE users SET scores = 10 WHERE id > 30’);
bu kodda scores a string kayıt etmek istesek nasıl kaydedicez çift tırnak kullanmamız gerekmiyor mu
$DEGISKEN = ‘abcde\’sadsad’;
$affected = DB::exec(‘UPDATE users SET scores =”$DEGISKEN” WHERE id > 30′);
İçinde tek tırnak olduğu için update işlemi yapmıyor
Bu şekilde de denedim;
$affected = DB::exec(“UPDATE users SET scores =’$DEGISKEN’ WHERE id > 30”);
bunda da update olmuyor.
Musa hocam çözüm yolu bekliyorum
Bindings yönetimi kullanarak şu şekilde çalıştırabilirsiniz;
Teşekkür ederim deniyeceğim şimdi
Herkes yorum yapmış bende yapayım dedim eline sağlık musa güzel yazı olmuş 🙂
ben çok geriden geliyorum galiba :). millet 2012/13 lerde yorumlarını yazmışlar kullanmaya başlamışlar. Ben daha yeni yeni öğrenmeye başlayacam pdo’yu. Diyeceğim şu ki Musa kardeşim hala burada etkinmisin bir sorum olsa buraya yazabilrmiyim?
buralardayım, olmasan da sorabilirsin, cevaplayan başka arkadaşlarda var sağolsunlar
İlk Sorum şu: Gösterdiğiniz şekilde veritabanına bağlantımı yaptım ve yine gösterdiğiniz şekilde veritabanından verileri çektim, Yalnız türkçe karakter sorunuyla karşılaştım acaba pdo da türkçe karakter sorunun nasıl giderebilirim ? Yazılarınızda rastlamadım da.. (Dil UTF8)
Hallettim saolun 🙂
Merhaba, bu sınıf için teşekkür ederim çok işime yarıyor. Kullanırken bir eksiklik gördüm, belirtmek isterim. Herhangi bir veri ekleme, silme, çekme veya sorgu yapılmadan getLastError methodu çalıştırılırsa $stmt değişkeni null olarak kaldığı için Fatal error: Call to a member function errorInfo() on null hatası veriyor.
Hatanın çözümü 152. satırı şu şekilde değiştirmekle çözülüyor.
Merhaba, bu sınıfı kullanarak aynı IP’deki birden fazla veritabanı üzerinde nasıl işlem yaparım. Hepsi farklı hosting hesaplarında, gerekli işlemlerin tamamı yapıldı sadece bu sınıfı kullanarak istediğim zaman istediğim DB’yi nasıl seçeceğimi bilemedim. Yardımcı olursanız çok sevinirim.
Pdo sınıfında ufak çaplı bir güvenlik açığı mevcut. Sınıfın kullanıldığı host da eğer php error gösterimi açıksa ve sınıf herhangi bir nedenden dolayı mysql servera connect olamazsa. Php’nin döndürdüğü connection hatasında mysql kullanıcı adı ve şifreyi ekrana basıyor. Bu aslında sınıfın açığı değil pdo’nun yaptığı bir olay. Ama rahatsız edici ve tehlikeli. Class içierisinde init fonksiyonunu aşağıdaki şekilde değiştirirseniz problem ortadan kalkıyor.
public static function init()
{
$connection = ‘mysql:host=’ . MYSQL_HOST . ‘;dbname=’.MYSQL_DB;
$user = MYSQL_USER;
$pass = MYSQL_PASS;
try {
self::$pdo = new PDO($connection,$user,$pass);
self::$pdo->exec(‘SET NAMES `’ . self::$charset . ‘`’);
self::$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}
catch (PDOException $e) {
die(‘Connection error’);
}
return self::$pdo;
}
Çok faydalı oldu , kolayca uyguladım teşekkürler.
Musa bey 2013 yılında hazırlamış bu sınıfı üzerinden 7 yıl geçmiş merak ettiğim konu 7 yıl içinde hiç güncellemiş mi sınıfı ilk gün ki gibi mi hala ve kullananlar tereddüt ediyorlar mı ?
buradaki sınıfı halen kullanmaya devam edebilirsin, bunun yanı sıra daha fazla güvenlik ve performans için sunucundaki PHP sürümünü güncel tutun.