Могли некоторые говорить мне, если существует функция, которая работает то же PHP's mysql_real_escape_string()
для Perl от модуля DBI?
Следует использовать закладные и значения привязки .
Как quote?
Я также рекомендую прочитать документацию к DBD::MySQL, если вас беспокоит utf8.
Не надо. Побег. 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 явно, он по-прежнему вызывается неявно перед выполнением запроса).
Из 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