有些人可以告诉我,如果某个函数与mysql_real_escape_string()
模块中的Perl的PHP DBI的作用相同吗?
答案 0 :(得分:16)
答案 1 :(得分:9)
别。逃逸。 SQL。
别。引用。 SQL。
使用SQL占位符/参数(?
)。 SQL语句的结构和占位符表示的数据值完全分开发送到数据库,因此(除了数据库引擎或DBD模块中的错误),绝对没有办法将数据值解释为SQL命令。
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
作为附带好处,如果您重新使用SQL语句(只需要准备一次),使用占位符也会更有效,如果不这样做,则使用占位符的效率也会更低(如果您没有明确地调用prepare,它仍然在执行查询之前被隐式调用。)
答案 2 :(得分:5)
赞quote?
如果您担心utf8,我还建议您阅读DBD::MySQL的文档。
答案 3 :(得分:2)
来自http://www.stonehenge.com/merlyn/UnixReview/col58.html:
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
答案 4 :(得分:0)
数据库句柄方法“quote”
my $dbh = DBI->connect( ... );
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");