Gerçekten PDO ve hazırlanmış deyimleri kullanıyor olmalıdır?

6 Cevap php

PDO ve hazırlanan tablolar olursa olsun şimdiye kadar onlar hakkında okumak ne kadar, hala tür kafa karıştırıcı benim için vardır. Bu yüzden onlar "güvenli" daha fazla ama bu gerçekten önemli olduğunu biliyor musunuz? Ben temel mysql_real_escape_string ile mysql () ve htmlspecialchars () sağ kullanılarak aynı sonuç alabilirsiniz demek?

6 Cevap

Sen, ancak PDO ve hazırlanan tablolar mutlak güvenli vardır olabilir. Eğer bunu elle yapmak ve mysql_real_escape_string() işlevini kullanabilir miyim? Tabii. Aslında, çıkış aynı görünebilir. Ama sonunda, PDO gerektirecek kodu elle yapmış olsaydı kod çok daha kısa bir cehennem olurdu.

Eğer hazırlanmış deyimleri kullanarak değilseniz Ayrıca, insan hatası riskini çalıştırın: Bir değer kaçmak veya bir girdiyi unutmak demek. Diğer tüm kod ile karışık, düzgün sterilize olmayan bir satır yolda bir kabus kadar kırpma olabilir.

Bu yardımcı olur umarım!

Gerçekten PDO arayüzü gibi. Buna alışmak, o mysql_ * işlev tarzında çok daha temiz. Bu da, onu anlamaya biraz zaman aldı, ama buna değer.

Kafa karıştırıcı bulundu bölümü yöntemler PDO DB bağlantı nesnesi kendisine ait hatırlayarak, ve deyim nesnelerin parçası olan oldu.

Bazı eylemleri ile, sen de hazır deyimleri yinelenen bir performans yararı alırsınız. Eğer bir döngü içinde ekler bir demet yapıyoruz Örneğin, sen deyimi hazırlamak, ve sonra takmadan önce döngü içinde yeni veri her zaman bağlarlar.

Güvenlik o size her uçta veri kaçmak için bir iyi test kütüphaneye güvenerek, çok daha iyi de. Bu kriptografi gibi - neden kendiniz yapmak, bu önemli bir şey alıyorsunuz? Kendinizi yanlış (yani, yanlışlıkla bir sorgu içine bir şey takılı kaçan kaçırmak) almak için bir şans vermek için hiçbir neden yok.

Ben bu excellent giant book on Mysql yazdı yazar, this guide PDO öneririz.

Ben konumsal parametre stili kullanmak ister, ve o zaman sadece verilerin bir dizi yapmak ve My sorgular gibi bakmak içeri geçmek

$pdo_db=pdo_connect('cow_db');
$sql='select this,that,count(those) as snout from lovely_table where name=? and horses=?';
$data=array($username,$horse_count);

$query_stmt=$pdo_db->prepare($sql);
$result_handle=$query_stmt->execute($data);

//then I have a function to load data from the result handle
$info=load_array($result_handle);

Bu gibi işlevler standart php mysql arayüzü ile çalışmak için, ama neden sadece PDO kullanamadı?

Ben hazırlanmış sorguları kullanarak genellikle kaçan fonksiyonlarını kullanarak daha iyi olduğunu söylemek başkaları ile katılıyorum. Doğru kullanımı kolay, ve değer SQL sorgusu ayrı RDBMS sunucusuna gönderilir beri parametre değerleri, SQL enjeksiyon sorunları tanıtmak için hiçbir yolu yoktur.

SQL sorgusu dinamik parçaları bir ifadede değişmez bir değer yerine bir parametredir sadece Ancak, parametreler kullanılarak yararlıdır. Eğer bir tablo adı, sütun adı, bir SQL ifadesi, ya da değerler (bir IN( ) yüklem örneğin argümanlar) bir liste yerine bir sorgu parametresini kullanamazsınız.

Hazırlanan sorgular da better performance (en azından MySQL) olmayan hazırlanmış sorguları daha var. Çoğu insan tersini söylüyorlar, ama saygın mysqlperformanceblog.com test yaptım:

http://www.mysqlperformanceblog.com/2006/08/02/mysql-prepared-statements/

Sürece sorguları için uygun verileri sterilize gibi o zaman have PDO / hazırlanmış ifadeler kullanmak gerekmez. Though, ben şahsen ikisi geliştirme / daha kolay hata ayıklama ve hazırlanmış ifadeler bile bir sorgu için alıyorum yanlış veri türlerini önlemek yapabilirim çünkü PDO / hazırlanmış deyimleri kullanarak öneriyoruz.

Eğer işlevi için basit bir hazır deyimi görünüm oluşturmak için nasıl hakkında daha fazla bilgi edinmek istiyorsanız sprintf. Sadece bir tür belirleyici vb ile herhangi bir değişken dizeler, tamsayılar, replace (bu durumda %s ve %d, sırasıyla).

Yani aşağıdaki sorguda örneğin, ben id tamsayı olacak (nümerik olacak) ve name bir dize (alfanümerik) olacağını biliyorum.

$username = 'Simon';
$id       = 3;
$query    = "SELECT FROM `users` WHERE `id` = {$id} AND `name` = '{$username}'";

(Örneğin bir POST / GET olarak) bir un-güvenilir bir kaynaktan bu değişkenlerin birini alıyorum sonra ben (bir {[ile son satır ($ sorgu kümesi) değiştirerek emin onlar doğru veri türleri vardır yapabilirsiniz 0)]} Bu gibi diyoruz:

$username = 'Simon';
$id       = 3;
$query    = sprintf( "SELECT FROM `users` WHERE `id` = %d AND `name` = '%s'", $id, $username );

sprintf sadece bana verilen veri türlerini doğru garanti denir $ isim için $ id veya bir tamsayı için bir dize kullanmanıza izin vermez (bu bana verir güvenlik fazladan bit) . Yanlış veri türleri verilirse daha sonra I believe bu istenen türüne değişkenleri döküm olacak.

Hakkında daha fazla bilgi için sprintf burada ziyaret edin: http://php.net/sprintf

Ben bu yeterli (benim ilk cevap :)) açıklar umuyoruz.

Eğer başlık altında pdo kullandığı Zend_Db deneyebilirsiniz. (mdb2 kullanabileceğiniz başka bir seçenektir.)

PHP istediğiniz her şeyi sağlar, ve sadece bu yüzden PDO çok daha az kod ile "istediğiniz" ne yapar olur. :)