PHP: Выполнение поиска в MySQL для нескольких условий И в объединенных полях

Я пытаюсь собрать наиболее элегантный способ поиска в двух полях для нескольких (количество слов может отличаться) терминов, которые должны обеспечивать результаты только тогда, когда все слова найдены (И вместо ИЛИ).

Ниже приводится сообщение об ошибке синтаксиса SQL:

$search = $_GET["search"];
$searcharray = explode('|', $search);
$query=("SELECT username,sender,message,subject,timestamp,threadid,msgtype
FROM Messages WHERE  ('" . implode("'|'",$searcharray) . "') IN CONCAT
(message,subject)  ORDER BY timestamp");

Конечно, я мог бы установить цикл foreach для каждого совпадения первого слова, которое разрывается с инструкцией, чтобы не добавлять результат, если какие-либо другие слова не найдены в этих двух полях, но это гораздо больше для сценария PHP справиться, я думаю.
Какие-либо предложения?

0

Решение

IN должен сопровождаться списком значений в скобках, или SELECT подзапрос. Вы не можете использовать его для сопоставления с образцом.

Чтобы найти в столбце слово, вам нужно использовать LIKE, с % вокруг слова. И нет быстрого поиска для нескольких слов, вы должны искать каждое из них и комбинировать их с AND,

$tests = array_map(function($word) {
return "CONCAT(message, subject) LIKE '%$word%'";
}, $searcharray);
$where = implode(' AND ', $tests);
$query = "SELECT username,sender,message,subject,timestamp,threadid,msgtype
FROM Messages WHERE $where ORDER BY timestamp";
1

Другие решения

Как уже упоминалось в комментариях, код подходит для внедрения SQL. Это, как говорится, и, так как я не хочу переписывать весь код ;-), вот один из способов создать предложение where.

$search = $_GET["search"];
$searcharray = explode('|', $search);
$qstr = "SELECT
`username`,
`sender`,
`message`,
`subject`,
`timestamp`,
`threadid`,
`msgtype`
FROM `Messages`
WHERE ";
$w = array();
foreach($searcharray as $key => $val) {
$w[] = "CONCAT(`message`,`subject`) LIKE '%" . $val . "%'";
}
$w_str = implode(" AND ",$w);
$qstr .= $w_str . " ORDER BY `timestamp`";
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector