You are on page 1of 5

PHP DATA OBJECTS (PDO)

PHPde mysql fonksiyonlarnn geerliliini yitirmesiyle birlikte mysqli ve PDO arasnda bir
tercih yapmak gerekiyor. PDOnun hz ve gvenlik asndan mysqliye kar byk bir
stnl bulunmasa da destekledii veritaban srcleriyle bir adm ne kyor. Her iki
durumda da nesne tabanl programlamay kullanarak veritaban ilemlerini
gerekletirebiliriz.

PHP Data Objects snf olmann getirdii zelliklere sahip. Kendi iinde
metodlar(fonksiyonlar) olan ve bu metodlara erierek veritaban ilemlerini
gerekletirmenizi salayan bir snf.

Veritabanna balanma ilemi ise bu snfn yeni bir rneini (instance) oluturarak bir
deikene atamakla mmkn oluyor. Bu durum nesne tabanl programlamadan zaten
bildiimiz bir ey. rnekle aklayalm:
<?php
$db = new PDO("mysql:host=localhost;dbname=ornekveritabani","kullanici","sifre");
?>
Yukardaki rnek en sade kullanm biimidir. MySQL kullanlarak localhost zerinde
ornekveritabani veritaban ve bu veritabanndaki bir kullanc ve ifre kullanlarak balant
salanmtr. Bu ifadeyi zelletirmemiz mmkn. rnein burada karakter setini utf8
olarak ayarlayabilir, hata mesajlarn zelletirebiliriz.

Bunu salamann iki yolu var. Birincisi ifreden sonra bir dizi oluturarak snfa ait
zellikleri istediiniz deerleri vererek kullanabilirsiniz. Dier yntem ise setAttribute
metodunu kullanmak.

Her ikisi iin de rnek verelim.


<?php
$db = new PDO("mysql:host=localhost;dbname=ornekveritabani","kullanici","sifre",
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
));
?>
<?php
$db = new PDO("mysql:host=localhost;dbname=deneme","kullanici","sifre");
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');
?>
Balant ilemini gerekletirirken kullandmz ve dier programlama dillerinden de alk
olduumuz bir yntem var. lk olarak bir ileminin baarl olup olmadn kontrol eden ve
baarsz olursa buna uygun hatay dndren bir yap mevcut. zellikle hata yakalama ve
bunu kullancya anlalr biimde belirtme konusunda olduka yetenekli olduunu
belirtmek lazm. Kullandmz yap try-catch yapsdr. Bu ikisi birbirinden bamsz
olarak kullanlamaz. try ile veritabanna balanp balanmadn kontrol edebilir ve eer
bir hata alrsak bunu catch ile ekrana yazdrlmasn salayabiliriz. rnek kullanm:
<?php
try{
$db = new PDO("mysql:host=localhost;dbname=ornekveritabani","kullanici","sifre");
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8);
} catch(PDOException $e){
die('Hata: '.$e->getMessage());
}
?>
Neler yaptmz son rnekte aklayalm. Balangta try-catch yapsn oluturuyoruz.
Veritbanna balanmak iin snfmz kullanp yeni bir nesne oluturarak bunu db
deikenine atadk. Ardndan setAttribute metodunu kullanarak hata ayklama yntemini
ve veritaban sorgularnda utf8 kullanacamz belirttik.

Eer bir hata dnerse bunu PDOException ile birlikte kullandmz e deikenine atadk.
Siz buna farkl isimler de verebilirsiniz. Hata dnerse program sonlandrp hata mesajn
ekrana yazdrmasn istedik.

MySQL dnda MSSQL, PostgreSQL ve dier birok veritaban srcsn


kullanabileceinizi unutmayn.

***
imdi PDO snfn kullanarak sorgu hazrlama, altrma ve sonular elde etmeyi eitli
rneklerle anlatalm. bindValue metodu ile yer tutuculara deer atamay, sorgular
altrmay ve dnen sonular fetch, fetchAll, fetchColumn ve fetchObj metotlar ile elde
etmeyi aklayacaz.

PDO ile veritabanna balandktan sonra bu balanty kullanarak veritaban zerinde


okuma veya yazma ilemlerini gerekletirebiliriz. Bunun iin bir rnekten yola karak
adm adm ilerlemek yararl olacaktr.

PHP uygulamas gelitirirken SQL sorgularn sklkla dinamik olarak kullanmamz gerekir.
URL /kullanici?email=ornek@example.com
Yukardaki rnekte olduu gibi belirli bir kullanc iin profil sayfasn gstermek
isteyebiliriz. Bu durumda SQL sorgusu aadaki gibi olur.
SELECT id FROM kullanicilar WHERE email = "ornek@example.com";
Bu sorguyu dinamik hale getirerek profil sayfasna erimek isteyen her kullanc iin
zelletirmeliyiz. Bu durumda basit haliyle sorgu u hale gelir.

$sql = sprintf(
'SELECT id FROM kullanicilar WHERE email = "%s"',
filter_input(INPUT_GET, 'email')
);
Bu uygulanmamas gereken kt kodlamaya bir rnek olarak verilebilir. Yukardaki
kodlama veritabanndaki bilgileri ele geirmek isteyenlere davet karr. Kullanc
tarafndan girilen bilgilerin SQL sorgusunda kullanmadan nce temizlenmesi gerekir. PDO
eklentisi bunu hazr sorgular ile kolayca yapmaktadr.

Hazr sorgular PDOStatement snfnn bir rneini (instance) temsil eder. PDO
ile prepare metodunu kullanarak hazr sorgular elde edebiliriz. Yukardaki rnei PDO
kullanarak deitirelim.
$sql = 'SELECT id FROM kullanicilar WHERE email = :email';
$statement = $pdo->prepare($sql);
Dikkatli bir ekilde incelediinizde email ifadesinin yer tutucu (placeholder) ile gsterildiini
grebilirsiniz. Bu durum dardan kullanc girii ile alnan bilgilerin gvenli bir ekilde
kullanmn salar. email ile temsil edilen alana girilecek bilgiyi ise birden fazla yolla
belirtebiliriz. bindValuemetodu bunlardan bir tanesidir. rnei buna gre geniletelim.
$sql = 'SELECT id FROM kullanicilar WHERE email = :email';
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, 'email');
$statement->bindValue(':email', $email);
Yukardaki gibi bir kullanmda hazr sorgu ile $email deikeni temizlenecek ve olas SQL
injection saldrlarndan veritabann korumu olacaktr. Birden fazla yer tutucuyu ayn SQL
sorgusu iinde kullanabiliriz. Bu durumda her yer tutucu iin bindValue metodunu
kullanmamz gerekir. Bu metodu daha geni biimde aklayalm.
BNDVALUE METODU
Hazr sorgularda belirtilen yer tutucular bir deiken ile ilikilendirir.
bindValue(yer tutucu, deiken, parametre)
Yukardaki syntax genel kullanmdr. Yer tutucu balangta SQL sorgusunda belirtilir.
Yukardaki rnekte email buna rnek olarak verilebilir. Deiken, yer tutucuya atanacak
olan deerdir. Kullancnn bir form ile veritabanna bilgi kaydettiini dnelim. Bu veya
buna benzer kullanc girii ile elde edilen bilgilerin dorudan veritabanna kaydedilmesi
gvenlik riski tar. bindValue metodu alnan bu bilgilerin sorgu iin hazr hale getirilmesini
salar. Son olarak parametre ise girilen bilginin hangi veri trne ait olduunu belirtir. Bu
ifade bir tam say, string veya baka bir deer olabilir. Eer parametre kullanlmazsa
varsaylan deer PDO::PARAM_STR olarak tanmlanr.
bindValue metodunu iki ekilde kullanabilirsiniz. lk olarak yer tutucuyu bir isim ile
ilikilendirelim.
$sql = 'SELECT id FROM kullanicilar WHERE email = :email and kullanici = :kullanici';
$statement = $pdo->prepare($sql);
$statement->bindValue(':email', $email,PDO::PARAM_STR);
$statement->bindValue(':kullanici', $kullanici,PDO::PARAM_STR);
SQL sorgusunda iki yer tutucu kullandk. Bu sorguyu prepare ile hazr hale getirdik. Fakat
yer tutuculara deerlerini atamamz gerekiyor. Bunun iin bindValue metodunu kullandk.
Metodu bu yntemle kullanrsanz yer tutuculara hangi srada deer verdiiniz nemli
deildir. rnein nce kullanc ardndan email tanmlayabilirsiniz.
kinci yntemde ise yer tutucular ? (soru iareti) ile gsterilir. Burada bir sralama sz
konusu olur.
$sql = 'SELECT id FROM kullanicilar WHERE email = ? and kullanici = ?';
$statement = $pdo->prepare($sql);
$statement->bindValue(1, $email,PDO::PARAM_STR);
$statement->bindValue(2, $kullanici,PDO::PARAM_STR);
rnekte soru iareti ile gsterilen yer tutuculara srayla deer atanr. email ifadesi birinci
srada olduu iin ona atanacak deerin banda bu belirtilir. Ayn durum dier yer
tutucular iin de geerli olur. Parametre olarak kullanlabilecek rnekler:
PDO::PARAM_BOOL
PDO::PARAM::NULL
PDO::PARAM_INT
PDO::PARAM_STR
olarak verilebilir. u ana kadar sorgular hazrladk ve artk altrmaya hazrz.

SORGU SONULARINI ELDE ETME


Veritabanna CRUD ilemlerini (Create, Read, Update, Delete) yaptrmak iin hazrlanan
sorgular altrmamz gerekiyor. Bunun iin execute metodunu kullanacaz. rnein
SQL ile SELECT ilemini yaptmzda dnen kaytlar alabiliriz. Bunun iin fetch,
fetchAll, fetchColumn ve fetchObject metotlarn kullanyoruz.
FETCH
fetch metodu sonular ierisinde bir sonraki satr dndrr. Genellikle ok fazla kaydn
bulunduu durumlarda kullanlr. Bir rnekle aklayalm.
$sql = 'SELECT email FROM kullanicilar WHERE email = :email';
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, 'email');
$statement->bindValue(':email', $email, PDO::PARAM_STR);
$statement->execute();

while (($sonuc = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {


echo $sonuc['email'];
}
lk drt satrdaki ilemlerin ne anlama geldiini biliyoruz. execute metodu hazrlanan
sorgularn altrlmasn salad. Bu sayede veritaban zerinde SQL sorgusuna gre bir
sonu elde ettik. Elde ettiimiz sonular ise fetch metodunu kullanarak aldk ve ekrana
yazdrdk. Metodun ierisinde kullandmz PDO::FETCH_ASSOC sonularn nasl
yakalanacan belirtir. Burada ilikili diziyi kullandk fakat baka yntemler de bulunuyor.
FETCH_ASSOC ilikili dizi dndrr. Dizi anahtarlar veritabanndaki stun isimlerine
eittir.
FETCH_NUM nmerik dizi dndrr. Dizi anahtarlar veritabanndaki stun isimlerinin
saysal olarak sralanm halidir.
FETCH_BOTH hem ilikili hem nmerik dizi dndrr. Yukardaki iki kullanmn
birleimidir.
FETCH_OBJ veritaban stunlarn bir nesne olarak dndrr.
FETCHALL
Grld zere dnen kaytlar elde etmek iin kullanlabilecek birok yntem bulunuyor.
Eer dnen tm sonular elde etmek istiyorsanz fetchAll metodunu kullanmalsnz.
Fakat bu yntemin sadece az kaydn dndrld sorgularda kullanlmas gerektiini
hatrlatalm.
$sql = 'SELECT email FROM kullanicilar WHERE email = :email';
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, 'email');
$statement->bindValue(':email', $email, PDO::PARAM_STR);
$statement->execute();

$sonuclar = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($sonuclar as $sonuc) {
echo $sonuc['email'];
}
Yukardaki rnekte fetchAll metodu ile elde edilen kaytlar dizi
olarak sonular ifadesine atand. Diziler iin kullandmz foreach dngs ile her bir
kayd ekrana yazdrm olduk.
FETCHCOLUMN
Eer sadece bir stundan veri almak istiyorsanz fetchColumn metodunu kullanmalsnz.
Bu metot seilen stunun index deerini alarak almaktadr. rnekle aklayalm.
$sql = 'SELECT email FROM kullanicilar WHERE email = :email';
$statement = $pdo->prepare($sql);
$email = filter_input(INPUT_GET, 'email');
$statement->bindValue(':email', $email, PDO::PARAM_STR);
$statement->execute();

while (($email = $statement->fetchColumn(1)) !== false) {


echo $email;
}
Index sras 1 olan stundan dnen deerleri while dngsn kullanarak ekrana
yazdrm olduk. Stunlarn index deeri sfrdan balamaktadr. rnekte email stununun
veritabannda ikinci srada olduu dnlmeli.
FETCHOBJECT
Son olarak fetchObject metodunu aklayalm. Bu metot ile dnen sonularn stun
isimlerine gre nesne olarak kullanabileceimiz sylemitik.
while(($sonuc = $statement->fetchObject()) !== false ){
echo $result->isim;
}
fetchObject ile edilen sonular, stun isimlerine gre bir nesne olarak kullanlabilir.
rnekte veritabanndan elde edilen sonularda isim stununa ait bilgiler ekrana yazdrld.

You might also like