Professional Documents
Culture Documents
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.
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.
***
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.
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.
$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();