Есть ли эквивалент PHP mysql_real_escape_string () для DBI Perl? - PullRequest
8 голосов
/ 05 февраля 2010

Могут ли некоторые сказать мне, если есть функция, которая работает так же, как PHP mysql_real_escape_string() для Perl из DBI модуля?

Ответы [ 5 ]

16 голосов
/ 05 февраля 2010

Вы должны использовать заполнители и значения связывания .

9 голосов
/ 06 февраля 2010

Не. Побег. SQL.

Не. Quote. 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 явно, он по-прежнему вызывается неявно до выполнения запроса).

5 голосов
/ 05 февраля 2010

Мне нравится Цитата ?

Я бы также порекомендовал прочитать документацию по DBD :: MySQL , если вас беспокоит utf8.

2 голосов
/ 05 февраля 2010

С 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
0 голосов
/ 05 ноября 2015

Метод дескриптора базы данных "цитата"

my $dbh = DBI->connect( ... );
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
          $dbh->quote("Don't");

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

...