我最近采用了PDO编写的声明。在编写WHERE MATCH子句时,我曾经按如下方式执行精确的字符串MATCH:
WHERE MATCH(some_column) AGAINST('\"$some_term\"')
完美无缺。现在我已经切换到使用PDO bindValue,如下所示:
WHERE MATCH(some_column) AGAINST(:some_term)
当用多个单词绑定一个字符串,例如"橙色自行车"时,我会得到" orange"的结果。和"自行车"而我想要的是与#34;橙色自行车完全匹配"。
如何为我的PDO预处理语句强制使用精确的字符串MATCH?
(我在这个网站上搜索过并搜索过但我在任何地方找不到任何关于这个问题的讨论。我不能成为第一个提出这个问题的人,但我找不到答案!)
答案 0 :(得分:2)
确保在AGAINST
中指定的变量周围加上引号。
在PHP中:
$some_term = '"'.$some_term.'"'; // Adds quotes around string
$stmt = $db->prepare('SELECT * FROM example WHERE MATCH(some_column) AGAINST(:some_term)');
$stmt->bindParam(':some_term', $some_term, PDO::PARAM_STR);
$stmt->execute();
或者您也可以在MySQL语句中执行此操作:
$stmt = $db->prepare('SELECT * FROM example WHERE MATCH(some_column) AGAINST(CONCAT(\'"\',:some_term,\'"\')');
$stmt->bindParam(':some_term', $some_term, PDO::PARAM_STR);
$stmt->execute();
根据MySQL documentation on Boolean Full-Text Searches:
包含在双引号(“”“)字符中的短语仅匹配包含短语的行,因为它是键入的。全文引擎将短语拆分为单词并在FULLTEXT索引中执行搜索单词。非单词字符不需要完全匹配:短语搜索只需要匹配包含与短语完全相同的单词并且顺序相同。例如,“test phrase”匹配“test,phrase”。
如果短语不包含索引中的单词,则结果为空。例如,如果所有单词都是停用词或短于索引单词的最小长度,则结果为空。