我再次陷入困境。
我有一个搜索字符串并将其分配给变量:
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和真正的程序员的侮辱。
感谢您的帮助。
答案 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。