2010-02-05 24 views

cevap

16

placeholders and bind values kullanmalısınız.

+1

'DBH-> bind()' doğrudan eşdeğerdir, fakat Sinan'ın dediği gibi, bunu yapma. Yer tutucuları ile doğru şekilde yapın ve değerleri bağlayın. – mpeters

2

:

quote gibi
 
    use SQL::Abstract; 
    ... 
    my $sqa = SQL::Abstract->new; 
    my ($owner, $account_type) = @_; # from inputs 
    my ($sql, @bind) = $sqa->select('account_data', # table 
            [qw(account_id balance)], # fields 
            { 
            account_owner => $owner, 
            account_type => $account_type 
            }, # "where" 
           ); 
    my $sth = $dbh->prepare_cached($sql); # reuse SQL if we can 
    $sth->execute(@bind); # execute it for this query 
+0

. Güzel. –

5

?

Ayrıca, utf8 hakkında endişeniz varsa, DBD::MySQL belgelerini okumanızı tavsiye ederim.

9

etmeyin. Kaçış. SQL.

Yapmayın. Alıntı. SQL. SQL yer tutucularını/parametrelerini kullanın (?). SQL tablosu ve tutucuları ile temsil veri değerlerinin yapısı tümüyle ayrı veritabanına gönderilen, böylece (veritabanı motoru veya DBD modülünde bir hata engelleme) veri değerleri SQL olarak yorumlanabilir kesinlikle hiçbir yolu yoktur edilir emreder. Eğer SQL deyimi yeniden kullanırsanız tutucuları kullanarak bir yan fayda olarak

my $name = "Robert'); DROP TABLE Students; --"; 
my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?'); 
$sth->execute($name); # Finds Little Bobby Tables without harming the db 

, (ve eğer yapmazsan az verimli (bu sadece bir kez hazırlanacak gerekiyor) da daha etkili olduğunu eğer yapmazsan arama açıkça hazırlanın, hala sorgu yürütülmeden önce örtülü olarak çağrılır). "SQL Enjeksiyon saldırılarını önleme" Randal Schwartz'ın makale

İlgili konular