Perl MySQL. Как разделить строку поиска и сопоставить ее с LIKE% $ word1% $ word2% «динамически»? - PullRequest
0 голосов
/ 03 февраля 2011

Я снова застрял.

У меня есть строка поиска и я назначил ее переменной:

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 Ответ

3 голосов
/ 03 февраля 2011

Если у вас есть $string = "foo bar blue widget", то вы бы сделали что-то вроде:

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

Это создаст предложение where WHERE column LIKE ? OR LIKE ? OR LIKE ? OR LIKE ? для вашей строки "foo bar blue widget".

Затем вы используете DBI-заполнители и значения привязки , поэтому вам не нужно беспокоиться о атаках SQL-инъекций на ваш код.

...