Принудительно «подразумевать И» вместо «подразумеваемое ИЛИ» в логическом совпадении mysql? - PullRequest
0 голосов
/ 27 ноября 2009

В логическом совпадении mysql, если нет операторов, подразумевается ИЛИ. Если вы хотите AND, вам нужно добавить + к каждому ключевому слову.

Таким образом, запрос «word1 word2» равен «word1 ИЛИ word2», «+ word1 + word2» равен «word1 AND word2»

Я не хочу, чтобы пользователи вводили + перед каждым ключевым словом, каковы мои варианты?

Предлагаемый вариант 1: есть ли что-то в my.conf, который я могу изменить, чтобы установить значения по умолчанию (я ничего не нашел)

Предлагаемый вариант 2: разобрать запрос и вручную добавить + к каждому слову. Любой простой код для этого вы можете поделиться?

Проблема в том, что если пользователь добавляет «кавычки» или операторы (+ - * <>) и т. Д., Это нарушает мой код синтаксического анализа.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2009

Я пошел со вторыми предложениями на моем сайте.

Простая строка для добавления + перед каждым словом, если вы имеете дело только со словами (не со строками в кавычках)

$q = implode(' ', array_map(create_function('$a', 'return "+".$a;'), preg_split('`\\s+`', $q))))

или даже более простое регулярное выражение замените, сделав то же самое:

echo preg_replace('`(\\W|^)\\w`', '\\1+\\2', $q);

если у вас есть не только отдельные слова, но и фразы в кавычках для поиска, следует добавить + перед каждым отдельным словом без кавычек и каждой строкой в ​​кавычках

echo preg_replace('`(\\s|^)(\\w|"[^"]+")`', '\\1+\\2', $q);
0 голосов
/ 27 ноября 2009

Нет способа изменить поведение полнотекстового сопоставления в логическом режиме без операторов, кроме редактирования источника. Вам придется использовать вариант 2 (как показывают другие) в той или иной форме. Просто будьте осторожны, как вы это делаете, если поисковое выражение исходит от пользователя.

0 голосов
/ 27 ноября 2009

Не уверен, что вы имеете в виду, но вот пример того, как вы можете добавить + перед каждым словом.

$s = "a string with several words in it";
$words = preg_split('/\s+/',$s,null,PREG_SPLIT_NO_EMPTY);
if (count($words)) {
    $str = '+' . implode(' +',$words);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...