специальные символы в Perl - PullRequest
0 голосов
/ 01 июля 2010

Я создаю форму CGI для обновления хранимой процедуры Sybase.

qq {execute procedure test(123,45,date,'$note');}; переменная $note - это информация, полученная из текстового поля, содержащего информацию журнала заявок на устранение неисправностей. Поскольку такие люди, которые вводят такую ​​информацию, могут и, скорее всего, будут использовать специальные символы, такие как '|"{} и т. Д. Мне интересно знать, есть ли способ получить эту информацию в базе данных через переменную $note.

В большинстве моих исследований были созданы функции DBI-> quote (), но они, похоже, не работают, и я не уверен, насколько они актуальны, поскольку это хранимая процедура.

Сейчас я пытаюсь сделать следующее:

use DBI; <br/>$livedb = DBI->connect("dbi:Sybase:server=test","admin","pass") || die "could not connect to live DB, $DBI::errstr"; <br/>$note = "testing special characters:"; <br/>$livedb->do(qq {execute procedure jinsert(5304905,65,getdate,?);},undef,(param('$note')));

Я получаю следующую ошибку:

Undefined subroutine &main::param called at test.cgi line 11.

когда я использую следующие методы, код завершается ошибкой, если в $note существует ':

$qy = $livedb->prepare($note); <br/>$qy->execute($test) || die "could not journal: $DBI::errstr"; <br/>$qy->finish();

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Во-первых, чтобы ответить на ваш вопрос напрямую: DBI-> quote () действительно ваш друг здесь :-) Он помещает кавычки вокруг строки правильным образом для языка базы данных, которую вы используете (что неизменно являетсято же самое для запросов SELECT / UPDATE / INSERT / DELETE, как и для хранимых процедур, поскольку последние обычно состоят из комбинаций первых!).

Например, предполагая, что $dbh было настроено как соединение DBI длязатем ваша база данных

my $string = "Here's a string that needs \"quoting\"!";

print $dbh->quote($string);

напечатает что-то вроде:

'Here''s a string that needs "quoting"!'

Обратите внимание, как:

  • Это удвоено ' в Here's
  • Он помещает '' кавычки вокруг всей строки.

Точная строка, которую она печатает, будет зависеть от вашей базы данных - некоторые используют немного другие соглашения.

Однако...

Глядя на то, что вы делаете, на самом деле вам не нужно ничего цитировать: пусть DBI сделает всю работу за вас, например:

$livedb->do(qq {execute procedure jinsert(5304905,65,getdate,?);}, undef, $note);

DBIкод знает, что делать, чтобы заменить цитату? с $note.

0 голосов
/ 03 июля 2010

Я наконец понял, в чем проблема.Я могу экранировать все специальные символы из Perl, используя q {$note};.dbh->quote здесь не применимо, так как вызывает хранимую процедуру, и проблема заключается не просто в квотировании.Одиночные qoutes должны быть переданы , переданы в хранимой процедуре.Комбинация q и sed исправили это:

use DBI;<br> $livedb = DBI->connect("dbi:Sybase:server=test","admin","pass") || die "could not connect to live DB, $DBI::errstr";<br> $note = q {testing special characters:''''''''''''''!@#$%^%^&*()};<br> $note =~ s/'/\\'/g;<br> $livedb->do(qq {execute procedure jinsert(5304905,65,getdate,?);},undef,(param('$note')))

Таким образом, в двух словах, при вызове хранимой процедуры, такой как эта, одиночные qoutes необходимо экранировать дважды (один разв perl, второй тип для хранимой процедуры).

...