PHP:在 mysql 中搜索组合字段中的多个 AND 条件

PHP: Making a search in mysql for multiple AND conditions within combined fields

我正在尝试以最优雅的方式在两个字段中搜索多个(单词的数量可能会有所不同)术语,这些术语只需要在找到所有单词(AND 而不是 OR)时提供结果。

下面给我一个 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 脚本要处理的更多。 有什么建议吗?

如评论中所述,代码易受 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`";

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";