Tırnak işaretleri içine alsanızda sql enjeksiyona maruz kalabilirsiniz.
Mesela:
$b = $a->prepare('SELECT * FROM uyeler WHERE yas = :yas AND cinsiyet = :cinsiyet;');
şeklinde bir sorgumuz olsun. Haliyle yas koşulumuz SAYISAL(integer), cinsiyet koşulumuz DİZGESEL(string) olacaktır.
Eğer biz:
$c = $b->execute([ yas => $_POST['yas'], cinsiyet => $_POST['cinsiyet'] ]);
şeklinde yaparsak. Ayvayı yedik demektir. Bunu önlemek için PDO'nun bindParam ya da bindValue methodlarını kullanacağız.
$b->bindParam('yas', $_POST['yas'], PDO::PARAM_INT);
$b->bindParam('cinsiyet', $_POST['cinsiyet'], PDO::PARAM_STR);
$c = $b->execute();
şeklinde yaparsak herhangi bir sql enjeksiyona maruz kalmayız. PDO sorguya hem ilgili alanları tırnak işaretlerine alacaktır hemde escape işlemini uygulayacaktır.
Yukarıda verdiğim örnekte bindParam ilgili değişkeni referans/pointer olarak kullanır. bindValue ilgili değişkenin içindeki değeri alır.
bindParam:
$yas = 20;
$cinsiyet = 'k';
$b = $a->prepare('SELECT * FROM uyeler WHERE yas = :yas AND cinsiyet = :cinsiyet;');
$b->bindParam('yas', $yas, PDO::PARAM_INT);
$b->bindParam('cinsiyet', $cinsiyet, PDO::PARAM_STR);
$yas = 25;
$cinsiyet = 'e';
$c = $b->execute(); // $yas = 25, $cinsiyet = 'e' olarak kabul edecektir.
bindValue:
$yas = 20;
$cinsiyet = 'k';
$b = $a->prepare('SELECT * FROM uyeler WHERE yas = :yas AND cinsiyet = :cinsiyet;');
$b->bindValue('yas', $yas, PDO::PARAM_INT);
$b->bindValue('cinsiyet', $cinsiyet, PDO::PARAM_STR);
$yas = 25;
$cinsiyet = 'e';
$c = $b->execute(); // $yas = 20, $cinsiyet = 'k' olarak kabul edecektir.
Yani kısaca bindParam ile bindValue arasındaki fark:
bindParam: execute methodu çalıştırıldığı andaki değerleri kullanır.
bindValue: bindValue methodu çalıştırıldığı andaki değerleri kullanır.
Çok teşekkürler. Ben ayvayı yemişim demek ki. Hepsini güncellemem gerek şimdi
Demek ki birkaç kişiye danışmak gerek.