RSS

PDO MySQL veritabanı sınıfı

75 28 Temmuz 2013 ~ Musa Avcı — İleri

databaseBir ö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.

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PDO MySQL veritabanı sınıfı" yazısı için 75 yorum yapılmış.

  1. erkin dedi ki:

    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

  2. gayet başarılı temel seviyedeki developerler için çok başarılı bir kaynak olacak diye düşünüyorum

  3. Tamer dedi ki:

    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.

  4. zeyd dedi ki:

    Faydalı bi makale daha. Eline sağlık Musa 🙂

  5. Görkem dedi ki:

    Güzel anlatım, işe yarar temiz bir sınıf. Teşekkürler.

  6. Çok yararlı bilgiler vermişsin ve güzel anlatmışsın teşekkürler.

  7. Kadir dedi ki:

    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.

  8. İsmail ÇAKIR dedi ki:

    Güzel anlatım için teşekkürler. Sitenizde ki yazıların tamamı çok akıcı ve anlaşılır..

  9. erkin dedi ki:

    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

  10. Süha Duran dedi ki:

    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;

  11. Kadir Malakcıoğlu dedi ki:

    merhaba burada global olarak db değişkeni tanıtmak gerekiyo galiba bu konuyla alakalı açıklama yapar mısınız

  12. Şebnem DUYAR dedi ki:

    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.

    • Musa Avcı dedi ki:

      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

  13. Şebnem DUYAR dedi ki:

    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.

  14. Baran Şengül dedi ki:

    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.

  15. Kadir Malakcıoğlu dedi ki:

    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

  16. Süleyman Yılmaz dedi ki:

    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

  17. Savaş dedi ki:

    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.

  18. Onur dedi ki:

    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.

  19. Ali Kemal dedi ki:

    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.

  20. Anonim dedi ki:

    […] […]

  21. parsanka dedi ki:

    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…

  22. Emrah dedi ki:

    Allah razı olsun

  23. Emrah dedi ki:

    çoklu satır okumada LIKE komutunu kullanabiliyorumuyuz ? sürekli hata alıyorum

  24. Cemal dedi ki:

    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 ?

    • Musa Avcı dedi ki:

      kullandığın sorguyu da yazabilir misin?

      • Cemal dedi ki:

        $affected = DB::exec(‘UPDATE uyeler SET kull = ‘$kull’, sifre = ‘.$sifremd5.’, tarih = ‘$tarih’ WHERE kull > ‘$kull”);

        • Cemal dedi ki:

          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 🙂

  25. Cemal dedi ki:

    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”);

    • Raşit Olcay dedi ki:

      Sorgunu şu şekilde değiştirirsen sorun kalmaz.

      $affected = DB::exec(‘UPDATE uyeler SET kull = ?, sifre = ?, tarih =? WHERE kull > ?’,array($kull,$sifremd5,$tarih,$kull));

  26. Cemal dedi ki:

    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;
    }
    }

  27. Ahmet Varlı dedi ki:

    merhabalar, bunu memcache uyarlı nasıl yapabiliriz.

  28. Müzeyyen dedi ki:

    Bu sınıfı kullanan sistemim son zamanlarda “Too many connections” hatası vermeye başladı. Bu sorunu nasıl çözebilirim ..?

  29. Adamın Dibi dedi ki:

    Müzeyyen çok fazla bağlantı açmışsın yada muhtemelen açtığın bağlantıları kapatmıyorsun.

  30. Phpci dedi ki:

    Bende de “too many connections” uyarısı verdi ve host firmam uyarıyor sürekli. Acaba sınıfta bir sorun mu var?

    • Musa Avcı dedi ki:

      Aksine class her sorgu için tekrar tekrar bağlantı açmayacak şekilde hazırlanmıştı. Aldığınız trafiklerde artış oldu mu acaba?

  31. Phpci dedi ki:

    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?

  32. Ahmet dedi ki:

    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.

    • Yusuf dedi ki:

      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
      }

  33. Müzeyyen dedi ki:

    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…

  34. Ahmet Varlı dedi ki:

    public function __destruct()
    {
    unset($this->last_stmt);
    }

    Şeklinde unset edebilirsiniz arkadaşlar.

    • MURAT İNTEPE dedi ki:

      class DB içindeki fonksiyonlar arasına ekleyerek, sayfa yada sorgu sonunda DB::__destruct(); olarak mı bağlantıyı sonlandıracağız ?

      • Musa Avcı dedi ki:

        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.

  35. Raşit Olcay dedi ki:

    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.

  36. onur dedi ki:

    hocam getRow ile getVar arasındaki fark ne acaba ?

  37. Metin Kartal dedi ki:

    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?

    • Musa Avcı dedi ki:

      sunucuda hata raporlama kapalı olabilir, aşağıdaki kodu kodun başına ekleyip hatayı görebilirsin.

      error_reporting(E_ALL);
      ini_set("display_errors", 1);
      
  38. Metin Kartal dedi ki:

    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.

  39. serhan dedi ki:

    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.

  40. onur dedi ki:

    s.a kardeş, bir türlü çözemedim, fetch ve fetchAll kullanımı hakkında bilgi verebilirmisin ?

  41. Huseyn dedi ki:

    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.

    • Musa Avcı dedi ki:

      Evet var, yazının “Bindings (Hazır Deyimler) kullanımı” başlığını inceleyebilirsin.

  42. erkan dedi ki:

    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.

  43. Deha Talu dedi ki:

    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…

  44. Ali Aydın dedi ki:

    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.

    • Musa Avcı dedi ki:

      binding kısmını doğru kullanıp kullanmadığınızı incelemenizi öneririm

      • Ali Aydın dedi ki:

        $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

        • Musa Avcı dedi ki:

          Bindings yönetimi kullanarak şu şekilde çalıştırabilirsiniz;

          $affected = DB::exec("UPDATE users SET scores = ? WHERE id > 30", array($degisken));
  45. Herkes yorum yapmış bende yapayım dedim eline sağlık musa güzel yazı olmuş 🙂

  46. Emin dedi ki:

    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?

    • Musa Avcı dedi ki:

      buralardayım, olmasan da sorabilirsin, cevaplayan başka arkadaşlarda var sağolsunlar

      • Emin dedi ki:

        İ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)

  47. Selim ŞİMŞEK dedi ki:

    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.

    $error_info = self::$last_stmt ? self::$last_stmt->errorInfo() : null;
  48. İbrahim dedi ki:

    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.

  49. Göksel Tığlı dedi ki:

    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;
    }

  50. MUSTAFA BARAK dedi ki:

    Çok faydalı oldu , kolayca uyguladım teşekkürler.

  51. Kaan YILMAZ dedi ki:

    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ı ?

    • Musa Avcı dedi ki:

      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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir