Perl MySQL - 如何拆分搜索字符串并与LIKE%$ word1%$ word2%“动态”匹配?

时间:2011-02-02 22:26:45

标签: mysql perl split sql-like

我再次陷入困境。

我有一个搜索字符串并将其分配给变量:

my $search =  'foo bar blue widget'
$search =~ s/[\n\r]+|^\s+|\s+$//g; #remove leading and trailing spaces n stuff

我正在使用

SELECT FROM `sometable` WHERE `coltosearch` LIKE '%$search%'

但是,只会匹配“foo bar blue widget”或“foo”。

我也希望匹配“foo bars”或“foobar”。

所以,我想我必须这样做:

 my $search =  'foo bar blue widget';
    $search =~ s/[\n\r]+|^\s+|\s+$//g; #remove leading and trailing spaces n stuff
 my $search1 =  $search;
    $search1 =~ s/^\s+|\s+$|\s*//g; #remove all spaces

   SELECT FROM `sometable` WHERE `coltosearch` LIKE '%$search%' OR LIKE '%$search1%'

嗯,这可能适用于“foo bar blue widget”和“foobarbluewidget”。 (如果有效)

所以,我猜我将不得不循环遍历$ search,并为每个单词分配变量。

但是,我从来不知道在$ search中会有多少单词。

所以,我被卡住了。我可以这样做:

my $search =  'foo bar blue widget'; #in from search form. Actually a $var
$search1 =~ s/^\s+|\s+$|\s*//g; #remove all spaces
$search1 = "%$search1%"; # Makes %foobarbluewidget%

## Now make individual words somehow ##
my @searcharry;
my $cnt='0';
my $searchword;
my @searchsplit = $search;
while $searchword (@searchsplit){
push (@searcharry,$searchword[$cnt]);
$cnt++;
}

但我如何将@searcharry纳入:

$search =~ s/\s/%/gi;
$search =~ s/%%/%/gi; #I think makes %foo%bar%blue%widget%

所以我可以:

 SELECT FROM `sometable` WHERE `coltosearch` LIKE '$search' OR LIKE '$search1'

我可能远离基地了。这对我来说真的很难。 我只想匹配搜索字符串中的任何单词,或者如果所有单词一起运行,则匹配。

很抱歉这样的菜鸟。我的粗暴尝试,我相信是对Perl和真正的程序员的侮辱。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

如果您有$string = "foo bar blue widget",那么您可以执行以下操作:

my @values = split '\s+', $string;
my $where = "WHERE $col LIKE ?";
$where .= " OR LIKE ?" x $#values;

这将为WHERE column LIKE ? OR LIKE ? OR LIKE ? OR LIKE ?字符串创建"foo bar blue widget"的where子句。

然后您使用DBI placeholders and bind values,这样您就不必担心代码上的SQL injection attacks