对于Perl的DBI,是否有相当于PHP的mysql_real_escape_string()?

时间:2010-02-05 13:59:53

标签: perl dbi mysql-real-escape-string

有些人可以告诉我,如果某个函数与mysql_real_escape_string()模块中的Perl的PHP DBI的作用相同吗?

5 个答案:

答案 0 :(得分:16)

您应该使用placeholders and bind values

答案 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");

http://metacpan.org/pod/DBI#quote