
PHP
PHP PDO ile veri tabanı bağlantısı kurabilmemiz için php.ini dosyasındaki pdo desteğini açmamız gerekmektedir.
PHP PDO PostgreSQL-MySQL-ORACLE-SQLite veritabanlarnına destek sağlamaktadır.
PHP PDO Bağlantısı PDO($DSN[,$Kullanici[,$parola[,$secenekler]]]) şeklinde kurulur.
DSN MYSQL “mysql:host=$host; dbname=$db”
DSN MYSQL “mysql:host=$host; port=3306; dbname=$db”
Charset PDO::MYSQL_ATTR_INTI_COMMAND=>’SET NAME utf8′
Hata Yakalama
PDO:ATTR_ERRMODE=> PDO::ERRMODE_EXEPTION
PDO:ATTR_ERRMODE bu kullanım üç değer alır
PDO::ERRMODE_SILENT Sadece hata kodlarını gösterir.
PDO::ERRMODE_EXCEPTION Bir istisna blogu olşur ve try/catch blogu ile hata yakalanır.
PDO::ERRMODE_WARNING Bir E_WARNING çıktısı verir
setAttribute() : PDO bagkulumunda ek fonksiyolar girmede kullanılır
exec() : sql deyimi çalıştırı ve etkilenen satır sayısını geri dönderir. (INSERT-UPDATE-DELETE) SQL deyimlerinin çalıştırılmasında tercih edilir.
query() : SQL deyimini çalıştırıp tabloda veri sonuçlarını bir dizi değişken olarak dönderir. ikinci parametresi sonuc döndürme biçimidir.
PDO::FETCH_ASSOC : Sutun isimlerine göre indisli bir dizi dönderir.
PDO::FETCH_BOT : Bir varsayılandır. Hem sütün isimlerine hemde sütun numaralarına göre indislenmiş bir dizi dönderir.
PDO::FETCH_BOUND : Sütün degerlerini bindColumn() ile ilişkilendirilmiş PHP değişkenlerine atar ve TRUE dönderir
PDO::FETCH_INTO : Bir sınıfın örneğini sütun isimlerini sınıf özelliklerini eşleyerek günceller
PDO::FETCH_NUM : Sütun numaralarına göre bir dizi dönderir.
PDO::FETCH_OBJ : Bir sınıfı metotları bir anonim nesne örneği dönderir.
PDO::FETCH_LAZY : PDO::FETCH_OBJ ve PDO::FETCH_BOTH sabitlerinin birleşimidir.
quote() : PDO da exec ve query yapılan baplantırlarda sql enjeksiyonu önlemek için kullanılır.
$sonuc->rowCount() : Gelen verinin satır sayısını öğrenmek için kullanılır.
$db->beginTransaction() : Veri tabanı üzerinde geçici işlemler yapmamızı sağlar. Geçici olarak yapılan işlemler PDO nesne örneği üzerinden veritabanında yapılan değişiklikler commit() çağrısı ile işleme konur. Eğre iptal edilecekse rollBack() ile geri alınır.
1 2 3 4 5 6 7 8 9 | //Örnek bir veritabanı bağlantı fonksiyonu. function caglarbostanci(){ //hataları kontrol etmek için try yapısını kullanıyoruz. try{ $pdobagkur=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); }catch(PDOException $ht){ //Olası bir hatada bu kısım çalışacak ve iligili hatayı ekrana basacak. die("HATA :".$ht->getMessage()); } |
PHP PDO exec Kullanımı
Exec metodu sql komutlarını hızlı bir şekilde çalışmasını sağlar. Sistemin kendi içerisinde yapcağı kayıtlarda etkin olarak kullanmakta fayda var. Örneğin hata ve log kayıtlarında. Dikkata edilmesi gereken husus ise exec metodu dışarıdan gelen tehtidlere açıktır bu nedenle prepare metodunu dışarıdan gelen verilerde kullanmanızı önririm. Aşağıda örnek bir veri giriş scripti bulunmaktadir.
1 2 3 4 5 6 7 8 9 10 11 12 13 | try{ //Veri tabanı bağlantısı kuruyoruz. $db=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //karakter setini belirliyoruz. exec("SET NAME latin5"); }catch(PDOException $ss){ //hataya düşerse iligili hata mesajını basıyoruz. die("hata:".$ss->getMessage());} //sql komutunu hazırlayıp exec ile veri tabanına direk veri giriş yapmasını sağlıyoruz. $sonuc=$db->exec("INSERT INTO cagsoz (soz_sahibi,guzel_soz) VALUES('BAKİ','ŞU KUBBEDE BAKİ KALAN HOŞ BİR SADA İMİŞ')"); //yapılan işlemin sonucunu kontrol ediyoruz. if($sonuc<1) die("HOOP: KAYIT EKLENEMEDİ."); echo $sonuc." kayıt eklendi."; |
Diğer bir exec örneği. Bu sefer veri güncellemesi yapıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | try{ //Veri tabanı bağlantısı kuruyoruz. $db=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //karakter setini belirliyoruz. exec("SET NAME latin5"); }catch(PDOException $ss){ //hataya düşerse iligili hata mesajını basıyoruz. die("hata:".$ss->getMessage());} //sql komutunu hazırlıyoruz. $sonuc2=$db->exec("UPDATE cagsoz SET soz_sahibi='obenoben' where id=351"); //Veri sonucunu bakıyoruz eğer sonuc 0 ise hata veriyoruz. if($sonuc2<1) die("HOOP: KAYIT güncellenemedi."); // problem yoksa işlem başarılı mesajını veriyoruz. echo "<br> bir kayıt güncellendi. "; //silmi işlemi için sql hazırlıyoruz. $sonuc3=$db->exec("DELETE FROM cagsoz WHERE id=352"); //sonucu kontrol ediyoruz. if($sonuc3<1) die("HOOP: KAYIT SİLİNEMEDİ."); //ekrana durumu basıp echo "<br>$sonuc3 bir kayıt silindi. "; //Veri tabanı bağlantısını kapatıyoruz. $db=null; |
PHP PDO HATA AYIKLAMA
Veri tabanı girdi-çıktılarında her hangi bir hata sonucu sistemin aksamasını istemiyorsak hata ayıklama try metodunu kullanıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | try{ //veri tabanı bağlantısı kuruyoruz. $yenipdo=new PDO("mysql:host=localhost; dbname=aolyedekweb", "root","cglr3193+", $yenipdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $ss){ //veri tabanı bağlantısı ile ilgili bir hata oluştuğunda mesaj verecek die("HOOP : ".$ss->getMessage()); } try{ //güncelleme sql hazırlanıyor $sonuc=$yenipdo->exec("update cagsoz set soz_sahibi='benim o ben'"); //güncelleme durumu kontrol ediliyor hata varsa HOOP yazıyor. if($sonuc==false) die("HOOP:"); echo $sonuc." KAYIT GÜNCELLENDİ"; }catch(PDOException $sss){ //olası bir sql hatasında mesaj verecek die("Hata : ".$sss->getMessage());} } |
PHP PDO query() Kullanımı
Veritabanından verileri okumak için query metodunu kullanıyoruz. Dikkat edilmesi gereken dışarıdan gelen verileri quote() metodu uygulanarak zararlı veriler pasifize edilmeli. Ben bu metodu hızlı olması nedeniyle sayfa okumalarından sunucu tarafından gönderilen verilerin basımında kullanıyorum. Dışarıdan gelen verilerde Prepare metodunu öneriyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | try{ //Bagkuruyoruz. $vertab=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //hata gösterim tipini belirtiyoruz. $vertab->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $ht){ //hata varsa mesajı verip sistemin çalışmasını durduruyoruz. die("hata : ".$ht->getMessage()); } //sql komutumuzu hazırlayıp gelecek olan dizi formatını belirliyoruz. $sonuc=$vertab->query("select * from cagsoz limit 10",PDO::FETCH_NUM); //döngüye sokarak gelen verileri ekrana . foreach($sonuc as $gelen){ //printf metodu kullanarak ekrana basıyoruz. printf("<br> %s %s",$gelen[1],$gelen[2]); } //Veritabanı işlemini sonlandırıyoruz. unset($vertab); |
Her veri tabanı işlemi sonucunda veritabanı bağlantı değişkeni yok ediliyor.
Veri tabanında gelen dizi tipi belirtilmezse? Yani PDO::FETCH_… Metodu kullanılmazsa, sistem standart olarak hem tablo sutun başlıklarına hemde sutun numara sırasına göre verileri getiriyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | try{ //Bagkuruyoruz. $vertab=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //hata gösterim tipini belirtiyoruz. $vertab->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $ht){ //hata varsa mesajı verip sistemin çalışmasını durduruyoruz. die("hata : ".$ht->getMessage()); } try{ $sonuc2=$vertab->query("SELECT * FROM cagsoz limit 10 OFFSET 9"); foreach($sonuc2 as $gelen2){ printf("<br> %s %s",$gelen2[1],$gelen2[2]); } echo "<hr />"; foreach($vertab->query("select * from cagsoz limit 5 offset 20") as $gelen3){ echo "<br>".$gelen3["soz_sahibi"]; } }catch(PDOException $ss){ die("HATA : ".$ss->getMessage());} unset($vertab); |
Veri tabanı bağlantısını sonlandırıyoruz.
PHP PDO quote() Kullanımı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //bağlatı kuruluyor $veritab3=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //hata ayıklama tipi belirleniyor. $veritab3->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Dışarıdan veri geliyormuş gibi get küresel değişkenine veri atanıyor. $_GET['GELEN']="55"; //Sql injectionı önelemek için quote metodundan geçiriliyor. $gelendeger=$veritab3->quote($_GET["GELEN"]); //quote nasıl bir işlem yapmış görelim (Temizlemişmi diye test ediyoruz.) echo $gelendeger."<BR>"; //sql hazırlayıp çalıştırıyoruz. $sorveri=$veritab3->query("select * from cagsoz where id=$gelendeger"); //gelen veri dizi tipini belirtiyoruz. $gelendegeri=$sorveri->fetch(PDO::FETCH_NUM); //gelen veriyi ekrana basıyoruz. echo $gelendegeri[2]; |
Çoklu verilerde ise aşağıdaki gibi kullanılır.
1 2 3 | $GELENDEGERLER=array_map(array($veritab3,'quote'),$_POST); <a href="" onclick="return confirm('Emin misin?')">LİNK</a> <a href="" onclick="return confirm('BAK BİDAHA SORMAM')">LİNK 2</a> |
Burada post ile gelen bütün verilere quote() metodunu uyguladık.
________________________________________________________________________
quote() metodu dış verilerde kesinlkle uygulanması gerekmektedir.
PHP PDO PREPARE METODU
-> SQL sorgusunu bir kez yorumlar. Bir çok kez çalıştırma imkanı verir.
-> Yapısında temizleyici bulunduğundan SQL enjektionu önler.
-> SQL sorguları bir kez torumlandığı için genellikle daha hızlıdır.
bindParam() : bindParam metodu prepare ile hazırlanan sql sorgusunda ? işareti veya bir :isim ile belirtilen parametrelerin hazırlanıp değişkenler için tanımlanmasını sağlar
$sonuc->bindParam(parametre,deger,veritipi);
bindParam veri tipleri
PDO::PARAM_INT : Sayıları tanımlamak için kullanılır.
PDO::PARAM_STR : Her türden yazı, harf, sembol vb gibi veriler için kullanılır.
PDO::PARAM_LOB : Binary türü verileri tanımlamak için kullanılır.
PDO::PARAM_INPUT_OUTPUT : Değişkenin bir saklı yordam için bir girdi/çıktı değiştirgesi olduğunu gösterir.
PDO::PARAM_NULL : NULL bir degeri tanımlamak için kullanılır.
execute() : prepare metodu ile hazırlanmış bir SQL deyimini çalıştırır.
bindColumn() : Prepare metodu üzerinden çalıştırılmak üzere SQL deyimini değişkenlere bağlar ve bu değişkenlere göre değer döner.
$sonuc->bindColumn(sütun,degişkne[veritürü[uzunluk[seçenekler]]]);
fetchAll() : prepare() ve execute() ile çalıştırılan bir SQL sorgusuna ait sonuç kümesinin tüm satırlarını içeren bir dizi döndürür.
lastInsertId() : INSERT sorgusu ile eklenen kaydın id nosunu verir.
rowCount() : DELETE INSERT UPDATE gibi sql sorgularından etkilenen satır sayısını verir. SELECT sorgu
PDO::FETC_CLASS : PDO ile bir sınıfın metodu (fonksiyonu) veya özellikleri değişkenleri ilişkilendirilerek kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | //Veri tabanı bağlantısı kuruyoruz. $DBpre=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); //hata ayılama tipini belirtiyoruz. $DBpre->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //sql komudunu hazırlıyoruz. $prsor=$DBpre->prepare("select * from cagsoz limit :limit"); //limitimizi bir değişkene aktarıyoruz. $limit=10; //limit parametresini sql deki string e bağlıyoruz. $prsor->bindValue(":limit",$limit,PDO::PARAM_INT); //sql i çalıştırıyoruz. $prsor->execute(); //gelen veriyi döngüye sokarak ekrana basıyoruz. while($deger=$prsor->fetch(PDO::FETCH_ASSOC)){ echo $deger['soz_sahibi']."<br>"; } //Veri tabanı bağlantısı kuruyoruz. $DBpre=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); //hata ayılama tipini belirtiyoruz. $DBpre->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //ilgili id değişkene atıyoruz. $aranan=1; //sql komudunu hazırlıyoruz. $prvericek=$DBpre->prepare("select * from cagsoz where id=?"); //parametre tipini belirterek sql deki string değere parametreyi bağlıyoruz. $prvericek->bindParam(1,$aranan,PDO::PARAM_INT); //sql komutu çalıştırıyoruz. $prvericek->execute(); //verileri satır numarasına göre alıyoruz.(Veritabanı tablosundaki sutunlar) $prdegeri=$prvericek->fetch(PDO::FETCH_NUM); //ilk satır ilk sutun verisini ekrana basıyoruz. echo $prdegeri[1]; |
______________________________________________________________
execute() Kullanımı
prepare metodu ile hazırlanmış bir SQL deyimini çalıştırır.
1 2 3 4 5 6 7 | $DBpre=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); $DBpre->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //hata ayıklama türünü belirtik. $aranan=1; $prvericek=$DBpre->prepare("select * from cagsoz where id=?");//sql komutu hazırladık $prvericek->execute(array($aranan));//sql de belirtilen parametrelere gelecek olan değlerin eşleştirmesini yapıp komutu çalıştırıyoruz. $prdegeri=$prvericek->fetch(PDO::FETCH_NUM); //gelen verilerin dizi metodunun satır numarası baz alınarak gelmesini istiyoruz. echo $prdegeri[1]; //gelen verilerde ilk satır birinci sutun değerini ekrana çıktısını veriyoruz |
Yine excute() metodunu aşağıdaki gibi sadece dizi göndrerekte çalıştırabiliriz.
Dikkat etmiz gereken şey ise sql komuta :parametre ile bilirtiğimiz parametrelerin yerine
soru işareti “?” konuyoruz. Tabi execute metodunda ise soru işareti sırasına göre
gelecek olan değerleri dizi şeklinde sıralıyoruz.
1 | //veritabanı bağlatımızı kuruyoruz.<br>$DBpre=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+");<br>//hata ayıklama türünü belirtik.<br>$DBpre->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);<br>//aranan verinin id bilgisini bir değişkene atadık.<br>$aranan=1;<br>//sql komutu hazırladık<br>$prvericek=$DBpre->prepare("select * from cagsoz where id=?");<br>//sql de belirtilen parametrelere gelecek olan değlerin eşleştirmesini yapıp komutu çalıştırıyoruz.<br>$prvericek->execute(array($aranan));<br>//gelen verilerin dizi metodunun satır numarası baz alınarak gelmesini istiyoruz.<br>$prdegeri=$prvericek->fetch(PDO::FETCH_NUM); <br>//gelen verilerde ilk satır birinci sutun değerini ekrana çıktısını veriyoruz<br>echo $prdegeri[1]; |
PHP PDO bindColumn() Kullanımı
Bindcolumn ise veri tabanındaki sütünlerin direk ilgili değişkenlere atanmasını
sağlıyor. Bu bize ekran çıktılarını ve tasarımı daha kolay ve hızlı yapmamızı sağlıyor.
Aşağıda cagsoz tablosundaki soz_sahibi, guzel_soz sutunları $soz ve $metin isimli
değişkenlere direk bağlanıyor. Bu değişkenlerin ekran çıktıları veriliyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //veri tabanı bağlantımızı kuruyoruz $vrbndclmn=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); //Hata ayılama türünü belirtiyoruz. $vrbndclmn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //sql komutumuzu hazırlıyoruz. $verisor=$vrbndclmn->prepare("select * from cagsoz where id=?"); //aranan id numarasını bir değişkene atıyoruz. $aranan=10; //execute metodu ile sql çalıştırıyor ve sql komutundaki parametrelere gelecek olan değerleri bağlıyoruz. $verisor->execute(array($aranan)); //veri tabanından gelen verilerdeki sutunların değerini ilgili değişkenlere bağlıyoruz. $verisor->bindColumn('soz_sahibi',$soz); $verisor->bindColumn('guzel_soz',$metin); //Veri gelen dizi tipini belirtiyoruz. $verisor->fetch(PDO::FETCH_BOUND); //bağlanan değişkenlerdeki verileri ekrana basıyoruz. echo $soz." : ".$metin; |
PHP PDO fetcAll() Kullanımı
Veri tabanından gelen verileri döngüye sokup satır satır almak yerine tek seferde
hepsinin alındığı bir dizi göndermesini sağlıyor. Bu komutu genelde class
yazımlarında çok işe yarıyor. Klasdaki metodlarda return ile tek seferde alınıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //veri tabanı bağlantımızı kuruyoruz $vrft=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); //Hata ayılama türünü belirtiyoruz. $vrft->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //sql komutumuzu hazırlıyoruz. $ftcver=$vrft->prepare("select * from cagsoz limit 10"); //belirlediğimiz limiti bir değişkene atıyoruz. $limit=5; //sql komudumuzu çalıştırıyoruz $ftcver->execute(); //$ftcver->fetchAll() ile aldığımız verileri dögüye sokarak ekrana basıyoruz. foreach($ftcver->fetchAll() as $dd){ echo "<br>".$dd['soz_sahibi']." ".$dd[2]; } |
PHP PDO lastInsertId() ve rowCount() Kullanımı
1 2 3 4 5 6 7 8 9 10 | //veri tabanı bağlantısı kuruyoruz $vrlii=new PDO("mysql:host=localhost; dbname=aolyedekweb","root","cglr3193+"); //Hata ayıklama metodunu etkinleştiriyoruz. $vrlii->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //sql komutumuzu hazırlıyoruz. $liiSor=$vrlii->prepare("INSERT INTO cagsoz (soz_sahibi,guzel_soz) VALUES ('ÇAĞLAR BOSTANCI','BİR UMUTTUR HAYAT')"); //sql komutu çalıştırıyoruz. $liiSor->execute(); //girilen satır sayısını ve girilen verinin id numarasını alıyoruz. echo "GİRİLEN SATIR SAYISI : ".$liiSor->rowCount()."<BR>GİRİLEN VERİ ID : ".$vrlii->lastInsertId(); |
PHP PDO PDO::FETCH_CLASS Kullanımı
Bu yöntemle arayüzleri sınfılarda hazırlayarak sadece arayüzün adının verilmesiyle sayfanın oluşmasını sağladığımız sistemlerde kullanıyoruz MVC kullanımlarında etkin olarak kullanılmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //önce sınıfınızı oluşturuyoruz. class listele{ private $soz_sahibi,$guzel_soz; public function liste(){ echo '<tr>'; echo '<td>'.$this->soz_sahibi."</td> "; echo '<td>'.$this->guzel_soz."</td>"; echo '</tr>'; } } //Veri tabanı bağlantısını kuruyoruz. $vrclass=new PDO("mysql:hoat=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); //hata ayılamam metodumuzu belirtiyoruz. $vrclass->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //sql komutumuz hazırlıyoruz. FETCH metodunu belirttikten sonra sınıfın adını belirtiyoruz. $versonuc=$vrclass->query("SELECT * FROM cagsoz limit 10",PDO::FETCH_CLASS,'listele'); echo "<table><tr><td>SOZ SAHİBİ</td><td>SÖZ</td></tr>"; //Döngüye sokarak ekrana basıyoruz. while($ver=$versonuc->fetch()){ $ver->liste(); } echo "</table>"; //Veri tabanı bağlatısını sonlandırıyoruz. $vrclass=null; |
Daha detaylı bilgi çin php.net e bakabilirisiniz.
Başarılar…