Obsidya adlı üyeden alıntı: mesajı görüntüle
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.