Perl MySQL. Как разделить строку поиска и сопоставить ее с LIKE% $ word1% $ word2% «динамически»?

0

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

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

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
    С RLIKE в MySQL проще работать: SELECT * FROM tab ГДЕ col RLIKE 'foo | bar | blue | widget';
  • 0
    Если строка содержит все условия поиска, выполняемые вместе, то она также будет соответствовать любому из условий поиска. Почему это сложнее, чем col LIKE '%$term1%' OR col LIKE '%$term2%' OR ... col LIKE '%$term4%' ?
Теги:
split
sql-like

1 ответ

3
Лучший ответ

Если у вас есть $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-инъекций" на ваш код.

  • 0
    @CanSpice Спасибо, я думаю, я понимаю, но это в цикле или что-то? Могу ли я привести более подробный пример? Спасибо..
  • 0
    @ Stephayne: Нет, это не в цикле, это просто прямой код. Вы должны создать свой оператор SQL ( SELECT * FROM whatever и т. Д.) И затем объединить предложение where из приведенного выше фрагмента кода. Затем вы подготовите и выполните инструкцию, как описано в первой ссылке в моем ответе.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню