Xpoint
   [напомнить пароль]

PostgreSQL + Perl: Как экранировать значение?

Метки: [без меток]
2006-11-14 16:55:49 [обр] Roman R.R.Musin(0/16)[досье]
use DBI;
my $str = 'маша%';
my $dbh = DBI->connect(
   'DBI:Pg:database=mybase',
   'user',
   '',
   { PrintError=>1, RaiseError=>0 }
);
my $sth = $dbh->prepare('SELECT * FROM mytable WHERE name ILIKE ?');
$str = $dbh->quote($str);
$sth->execute('%'.$str.'%');
Как экранировать значение $str? Такие метасимволы как _%...
спустя 1 час 37 минут [обр] Алексей Севрюков(0/1292)[досье]
Roman R.R.Musin[досье] a quote разве этого не делает? Кстати, в таком контексте quote можете не вызывать явно, перед выполнением запроса он будет вызван автоматически для всех заполнителей.
спустя 10 часов [обр] Роман Чемисов(0/350)[досье]
Roman R.R.Musin[досье]
Алексей Севрюков[досье] прав, в Вашем случае, quote должен вызваться автоматически.
спустя 12 часов [обр] Roman R.R.Musin(0/16)[досье]

В моем случае должна быть двойная обратная косая черта перед метасимволом(т.е. если нужно найти %, то он предварительно должен экранироваться \\).
Как используя DBI/DBD экранировать все метасимволы?

Опыты. Исходный вариант:

$sth->execute('%'.$str.'%');
print "String: $str\n";
print "ParamValues: \n".Dumper($sth->{ParamValues})."\n";
while( my @row = $sth->fetchrow_array ){
   print join(' | ', @row), "\n";
}

Выдает:

String: маша%
ParamValues:
$VAR1 = {
          '1' => '%маша%%'
        };

quote -> обособляет, а мне нужно экранирование:

my $quote_str1 = $dbh->quote($str);
$sth->execute('%'.$quote_str1.'%');
print "String: $quote_str1\n";
print "ParamValues: \n".Dumper($sth->{ParamValues})."\n";

Выдает:

String: 'маша%'
ParamValues:
$VAR1 = {
          '1' => '%\'маша%\'%'
        };

Ручками (а хочется стандартного решения):

my $quote_str2 = $str;
$quote_str2 =~ s/(%)/\\$1/;
$sth->execute('%'.$quote_str2.'%');
print "String: $quote_str2\n";
print "ParamValues: \n".Dumper($sth->{ParamValues})."\n";

Выдаёт (причем находит как раз правильно)

String: маша\%
ParamValues:
$VAR1 = {
          '1' => '%маша\\%%'
        };
Powered by POEM™ Engine Copyright © 2002-2005