我写了一个非常简单的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'\"
因为它是引用声明中的引用,所以我试图像上面的那样转义单引号。任何人都可以帮助我找出我出错的地方吗?
谢谢!
答案 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)
你可以使用双引号来缓解你的痛苦,但你的问题是你只是在不使用.
(点)运算符的情况下连接字符串。