为什么我会逃避错误?

时间:2012-05-08 19:56:18

标签: mysql perl

我写了一个非常简单的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%'\');
  ');

其中customdata是一个表。

但是,我总是抱怨语法错误抱怨“WHERER”条款:

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

因为它是引用声明中的引用,所以我试图像上面的那样转义单引号。任何人都可以帮助我找出我出错的地方吗?

谢谢!

4 个答案:

答案 0 :(得分: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%');
  ");

答案 1 :(得分: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%')
});

您也可以使用heredocs:

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中连接的正确方法是:

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

以及在perl中分隔的正确方法是:

my $string = 'foo \'bar\''; ## foo 'bar'

答案 2 :(得分: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%\');
  ');

答案 3 :(得分:0)

你可以使用双引号来缓解你的痛苦,但你的问题是你只是在不使用.(点)运算符的情况下连接字符串。