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";
我正在尝试以最优雅的方式在两个字段中搜索多个(单词的数量可能会有所不同)术语,这些术语只需要在找到所有单词(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";