2012-05-08 5 views
0

次の行を含む非常に単純なPerlスクリプトを書きました。エスケープエラーが発生するのはなぜですか?

my $q_it = $dbh->prepare('SELECT customdata.Field_ID, 
    customdata.Record_ID, 
    customdata.StringValue 
    FROM customdata 
    WHERE customdata.Field_ID='\'10012'\' && (StringValue LIKE '\'1%'\' OR StringValue LIKE '\'2%'\' OR StringValue LIKE '\'9%'\'); 
    '); 

ここで、カスタムデータはテーブルです。それは引用文の中の引用であるので、私は上記のような単一引用符をエスケープしようとしたので

Backslash found where operator expected at /home/wblocaladmin/Robert_2.pl line 18, near "'10012'\" 

はしかし、私はいつも「WHERER」句文句構文エラーを得ました。私の体がどこに間違っているのかを助けることができますか?

ありがとうございます!

+0

短い答え: ' 'FOO' \「バー''は有効なPerlではありません。 – ikegami

答えて

5

なぜ文字列を囲むのに二重引用符を使用しないだけですか?

my $q_it = $dbh->prepare("SELECT customdata.Field_ID, 
    customdata.Record_ID, 
    customdata.StringValue 
    FROM customdata 
    WHERE customdata.Field_ID='10012' && (StringValue LIKE '1%' OR StringValue LIKE '2%' OR StringValue LIKE '9%'); 
    "); 
+0

@Kevin、 'fetch *'は 'prepare'によって生成されたsthで呼び出され、dbhではありません – ikegami

+1

はい、$ dbhではなく$ q_itで呼び出さなければなりません – aleroot

0

あなたはあなたの痛みを和らげるために、二重引用符を使用することができますが、ここでの問題は、あなただけの.(ドット)演算子を使用せずに文字列を連結していることです。

3

aleroot's answerの代わりに、引用符をエスケープするように修正することができます。エスケープされたものの周りに不要な一重引用符があります。

my $q_it = $dbh->prepare('SELECT customdata.Field_ID, 
    customdata.Record_ID, 
    customdata.StringValue 
    FROM customdata 
    WHERE customdata.Field_ID=\'10012\' && (StringValue LIKE \'1%\' OR StringValue LIKE \'2%\' OR StringValue LIKE \'9%\'); 
    '); 
4

使用qその中に単一引用符で文字列を引用する:

my $q_it = $dbh->prepare(q{SELECT customdata.Field_ID, 
    customdata.Record_ID, 
    customdata.StringValue 
    FROM customdata 
    WHERE customdata.Field_ID='10012' 
    && (StringValue LIKE '1%' OR StringValue LIKE '2%' OR StringValue LIKE '9%') 
}); 

あなたはまた、ヒアドキュメントを使用することができます。

my $q = <<'QUERY'; 
    SELECT customdata.Field_ID, 
    customdata.Record_ID, 
    customdata.StringValue 
    FROM customdata 
    WHERE customdata.Field_ID='10012' 
    && (StringValue LIKE '1%' OR StringValue LIKE '2%' OR StringValue LIKE '9%') 
QUERY 
my $q_it = $dbh->prepare($q); 

注:それはないので、私は、セミコロンを削除DBIクエリに属しています。

記録のために、perlでconcatinateするための正しい方法は次のとおりです。

my $string = 'foo' . 'bar'; ## foobar 

とperlで区切るための正しい方法は次のとおりです。

my $string = 'foo \'bar\''; ## foo 'bar' 
関連する問題