我认为这个问题已经被问到了php,现在我要求它用于perl。我有2个阵列。我用它来查询我的数据库。现在碰巧这些术语不仅仅是一个单词,因此它可能有空格。
我声明了2个变量,比如$ foo和$ bar。我有2个for循环,它将文件1中的每个术语组合到文件2中的每个术语并查询数据库。每次每个术语都进入变量。数据库是文本索引的。我正在使用DBI模块。我的查询是这样的:
my $query_handle = $connect->prepare("SELECT value FROM value_table WHERE
MATCH(column_text_indexed) AGAINST ('+"$foo" +"$bar"' in boolean mode)") || die
"Prepare failed:$DBI::errstr\n";
它出现以下错误:
Scalar found where operator expected at program.pl line 32, near ""SELECT value FROM value_table
WHERE MATCH(column_text_indexed) AGAINST ('+"$foo"
(Missing operator before $foo?)
String found where operator expected at program.pl line 32, near "$foo" +""
(Missing operator before " +"?)
Scalar found where operator expected at program.pl line 32, near "" +"$bar"
(Missing operator before $bar?)
String found where operator expected at program.pl line 32, near "$bar"' in boolean mode)""
(Missing operator before "' in boolean mode)"?)
syntax error at program.pl line 32, near ""SELECT value FROM value_table WHERE
MATCH(column_text_indexed) against ('+"$foo"
Execution of program.pl aborted due to compilation errors.
另外,我的另一个问题是:当术语类似于“81-α-羟化酶缺乏症”或“26-脱氧活性稳定”时,是否正确使用术语?根据{{3}},如果搜索确切的字词并且我想要搜索确切的字词,它会使用引号。当我使用()时我得到了结果但是我认为它将整个单词用空格分隔为不同的单词,并给出任何一个结果。
非常感谢任何帮助。
谢谢。
答案 0 :(得分:5)
假设您要创建字符串
+"foo" +"bar"
(是的,我现在忽略了插值。)
您不能将整个事物放在双引号中,因为字符串文字将以遇到的第一个双引号结束。您还需要转义现有的双引号(以及双引号字符串中特殊的任何其他字符)。
"+\"foo\" +\"bar\""
或者,您可以使用不同的分隔符,例如
qq!+"foo" +"bar"!
或
qq{+"foo" +"bar"}
现在让我们插入我们想要的值。
qq{+"$foo" +"$bar"}
所有在一起:
my $sth = $dbh->prepare(qq{
SELECT value
FROM value_table
WHERE MATCH (column_text_indexed) AGAINST (? IN BOOLEAN MODE)
});
$sth->execute(qq{+"$foo" +"$bar"});
注意使用占位符!始终使用占位符。 (如果您还不知道,请在DBI文档中搜索该字词。)如果$foo
或$bar
包含双引号或其他奇怪的字符,则您的数据不会被意外解释为代码。
答案 1 :(得分:3)
在双引号字符串中,您不需要将标量变量放在外面,因为它们将插入到字符串中。不太确定你在这里做了什么,因为+
不是你在perl中连接字符串的方式,你使用.
来做到这一点。 +
是为了补充。
"SELECT value FROM value_table WHERE
MATCH(column_text_indexed) AGAINST ('$foo $bar' in boolean mode)"
如果您打算在字符串中包含这些引号,请改用qq()
,因为"
将是双引号字符串中的元字符:
qq|SELECT value FROM value_table WHERE
MATCH(column_text_indexed) AGAINST ('+"$foo" +"$bar"' in boolean mode)|
请注意,qq()
可以使用除()
之外的其他分隔符,在本例中为|
。
请注意,您应该使用占位符,正如其他人所提到的那样。
答案 2 :(得分:1)
抱歉,我不知道你需要什么SQL,但你可以使用qq{}
来编写它:
my $query_handle = $connect->prepare(qq{
SELECT value
FROM value_table
WHERE
MATCH(column_text_indexed) AGAINST ('+$foo +$bar' in boolean mode)
}) || die "Prepare failed:$DBI::errstr\n";
另外(我不确定AGAINST部分中的占位符):您应始终 使用占位符 。