绑定多个参数匹配全文搜索

时间:2016-03-16 17:20:16

标签: php mysql sql

我正在实施基于代码的搜索功能,我有以下SQL来匹配我的某个表格中#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0) #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width) #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height) #define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT)) #define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT)) #define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0) #define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0) #define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0) #define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0) 列中的关键字。

示例:

tags

SQL:

row 1 tags column:   car city night
row 2 tags column:   truck city day

但是,如果用户搜索以空格分隔的多个关键字,例如“car city ...”,则查询应为:

WHERE MATCH(s.tags) AGAINST (+:keyword IN BOOLEAN MODE)

目前我只是

WHERE MATCH(s.tags) AGAINST ('+:keyword1 +:keyword2 +...' IN BOOLEAN MODE)

这不会产生我想要的东西,我相信它会产生:

$stmt->bindParam(":keyword", $keyword);

如果关键字数量未知,我将如何单独绑定每个关键字以产生该关键字?或者还有另一种方式吗?

1 个答案:

答案 0 :(得分:0)

我相信我能够解决它。

使用单个占位符:

WHERE MATCH(s.tags) AGAINST (:keyword IN BOOLEAN MODE)

将关键字拆分为由空格分隔的单词数组:

$keywords = preg_split('/\s+/', $keyword);
$numKeywords = count($keywords);

然后在绑定参数时,使用加号:

连接每个关键字
for ($i = 0; $i < $numKeywords; $i++){
  $keywordBind .= "+".$keywords[$i]." ";
}
$stmt->bindParam(":keyword", $keywordBind);