【问题标题】:Perl MySQL - How do I split a search string and match with LIKE %$word1%$word2% "dynamically"?Perl MySQL - 如何拆分搜索字符串并“动态”匹配 LIKE %$word1%$word2%?
【发布时间】:2011-02-02 22:26:44
【问题描述】:

我又卡住了。

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

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 bar”或“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 和真正的程序员的侮辱。

感谢您的帮助。

【问题讨论】:

  • MySQL 的 RLIKE 可能更容易使用:SELECT * FROM tab WHERE col RLIKE 'foo|bar|blue|widget';
  • 如果字符串包含所有一起运行的搜索词,那么它也会匹配任何搜索词。为什么这比col LIKE '%$term1%' OR col LIKE '%$term2%' OR ... col LIKE '%$term4%' 更复杂?

标签: mysql perl split sql-like


【解决方案1】:

如果你有$string = "foo bar blue widget",那么你会这样做:

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

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

然后您使用DBI placeholders and bind values,因此您不必担心代码中的SQL injection attacks

【讨论】:

  • @CanSpice 谢谢,我想我理解了,但是,这是循环还是什么?我可以有一个更详细的例子吗?非常感谢..
  • @Stephayne:不,它不在循环中,它只是直接的代码。您将构建您的 SQL 语句 (SELECT * FROM whatever),然后将上述代码 sn-p 中的 where 子句连接起来。然后,您将按照我的回复中第一个链接中的说明准备并执行语句。
  • @CanSpice 那么 $col 在哪里设置为列?另外,什么是“x $#values”。我真的很抱歉我缺乏理解。在再次发表评论之前,我确实试图找到它们是什么。附言我正在使用占位符和 DBI,但试图使问题代码更短。因此,execute($var1,$var2,(thru how many $where)) 也需要动态生成。
  • @Stephayne $col 是您的列名。这是一个变量。 x $#values 表示“重复x $#values 次之前的字符串”,$#values@values 数组中的元素数减一。您不必执行execute($var1, $var2, ...),因为您已经在@values 数组中拥有所有这些变量。
  • @CanSpice 现在我真的很困惑。你的意思是像:“$dsn = $dbh->prepare(qq{SELECT @values});”那么我将如何执行查询? “$dsn->执行(什么?);” ??我再次道歉。我必须明白这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多