Существует ли эквивалент PHP mysql_real_escape_string() для Perl DBI?
-
18-09-2019 - |
Вопрос
Может ли кто-нибудь сказать мне, есть ли функция, которая работает так же, как PHP? mysql_real_escape_string()
для Perl из ДБИ модуль?
Решение
Вы должны использовать заполнители и значения привязки.
Другие советы
Не.Побег.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 (его нужно подготовить только один раз), и не менее эффективно, если вы этого не делаете (если вы не вызываете метод подготовки явно, он все равно получает вызывается неявно перед выполнением запроса).
Нравиться цитировать?
Я бы также рекомендовал прочитать документацию для ДБД::MySQL если вас беспокоит utf8.
От 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
Метод обработки базы данных "quote"
my $dbh = DBI->connect( ... );
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");