使用Perl在mysql中使用空格查询字符串

时间:2011-12-13 02:49:04

标签: mysql perl full-text-search dbi

我认为这个问题已经被问到了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}},如果搜索确切的字词并且我想要搜索确切的字词,它会使用引号。当我使用()时我得到了结果但是我认为它将整个单词用空格分隔为不同的单词,并给出任何一个结果。

非常感谢任何帮助。

谢谢。

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部分中的占位符):您应始终 使用占位符