2011-10-17 10 views
1

私はDB内のいくつかのレコードを操作し、その値を別のテーブルに書き込む必要があります。これらの値の中には、文字列に '&'という文字列が含まれています(「& You」など)。これらの値をすべて見つけ出し、&の前に\を置くのではなく、どのようにしてこれらの値を&で窒息するテーブルに挿入できますか?perl DBクエリでエスケープすると

+0

あなたはhttp://stackoverflow.com/questions/1137354/oracle-pl-sql-escape-character-for- – vol7ron

+0

を読んでいますか? DBIを使用している場合は、bind_param()を使用して値をテーブルに引用します。 (文字列クエリを作成し、それを準備/実行することを前提としていますか? –

答えて

12

プレースホルダを使用します。 '$who'をSQL文に入れるのではなく、?代わりに$ whoをバインドするか、または適切な引数として$ whoを実行します。

my $sth = $dbh->prepare_cached('INSERT INTO FOO (WHO) VALUES (?)'); 
$sth->bind_param(1, $who); 
my $rc = $sth->execute(); 

これはあなた自身で行うよりも安全で速いです。 (DBIには「見積もり」メソッドがありますが、これはそれより優れています)

+0

ありがとう – Lazloman

+1

* This *。http://bobby-tables.com/perl.htmlも参照してください。 –

+1

Oracleはプレースホルダと呼ばれます: '$ sth = $ dbh-> prepare_cached( 'INSERT INTO FOO(WHO)VALUES(:who)');' '$ sth-> bind_param( ':who'、$ who);'これは、 SQLの移植性は低下しますが、すでにOracleに密接に結びついている場合は、メンテナンス性が大幅に向上します。 –

8

これは間違いなく再発明する必要のないホイールです。 DBIを使用している場合は、入力をエスケープしないでください。プレースホルダを使用します。

例:

my $string = "database 'text' with &special& %characters%"; 
my $sth = $dbh->prepare("UPDATE some_table SET some_column=? 
         WHERE some_other_column=42"); 
$sth->execute($string); 
DBD::Oracle

モジュール(および他のすべてのDBD::xxxxxモジュール)広範なテストと実世界の使用を受けています。テキストをデータベースに挿入する方法を心配しましょう。

関連する問題