PHP: hazırlanmış deyimleri kullanarak Enjeksiyon koruması

2 Cevap php

Ben mySQL sorguları gerçekleştirmek için PHP kullanarak aşina değilim. Ancak, enjeksiyon saldırılarına karşı koruma olarak belgeli EXPS kullanıyoruz. SO burada birkaç soru / cevapları okuduktan sonra, ben yerine hazırlanan tablolardan tercih karar verdik.

(Daha fazla varsa bana bildirin) mevcut iki seçenek var:

  1. mysqli prepared statements
  2. PDO prepared staments

Question 1

Ben bağlantılı sayfalarda verilen kod örnekleri anlamak için çalışıyorum.

Için mysqli, Örnek 1:

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);

What does the "s" parameter do?
If I need more than 1 paramater, how do I do that?

Için PDO, Örnek 1:

$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

PDO::ATTR_CURSOR ve PDO::CURSOR_FWDONLY Buradan amacı nedir?

Question 2

Hangisini, mysqli veya PDO, tavsiye ederim? Artıları ve eksileri?

2 Cevap

Question 1

S parametresi bağlar ":" $ şehir olan ne değeri. Yani sql "SELECT District FROM City WHERE Name = s", senin idam sorgu olacağını ise "SELECT District FROM City Where Name = $city".

Daha parametreleri bağlamak için, sadece her bir parametre için bindParam diyoruz. Ayrıca PDOStatement bir dizi iletebilirsiniz :: yürütmek.

Question 2

I bazı farklı veritabanları (MySQL ve SQLLite) bu yana i PDO ile çalışmayı tercih. Bu konuda Fore daha fazla bilgi, http://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons bakın.

s $city bir dize olması bekleniyor olduğunu gösterir

PDO::ATTR_CURSOR parçası bir PDO geçiyoruz ayar adıdır. Değer PDO::CURSOR_FWDONLY (ki varsayılan, bu yüzden eğer belirtmeniz gerekmez) her biri için size PDOStatement::fetch() Eğer sonuç bir sonraki satır verilecektir yapmak çağrı anlamına gelir ayarlayın. Alternatif seçenek PDO::CURSOR_SCROLL - olurdu ama özel olarak bu ihtiyacı (ve veritabanı destekliyorsa) bilmiyorsanız varsayılan olarak bırakın gerekir.