我正在学习 MySQL 中的 MATCH .. AGAINST
并且打算在了解它的基础知识后使用它。我遇到了一些遗留代码并希望获得一些反馈。在这里:
foreach( $validSearchWords as $word ) { //this is a cleaned array of the user query phrase
$mycount++;
// uses a special character
if (strpos($word,"'")) {
$wordCriteria['keyword'] .= '"'.$word.'"'; //really? can't be right!
// if only one search term
} elseif ($vcount == $mycount) {
$wordCriteria['keyword'] .= $word.'*';
// if term is second or higher
} else {
$wordCriteria['keyword'] .= $word.'* ';
}
}
我明白这里正在尝试什么,但我怀疑第一个逻辑 block 不正确。
Texas State University
将变为:Texas* State* University*
但是
John O'Malley High School
将成为 `John* "O'Malley"High* School*
这不可能,我认为程序员的操作不正确,因为:
a) O'Malley 之后没有空格
b) 他们失去了对一个词的通配符只是因为它有一个看起来很奇怪的单引号。如果他们真的打算外卡,那么应该是这样的,对吧?
John* O'Malley* High* School*
更新 更简洁的问题是,“你如何用单引号表示单词,比如用通配符表示 O'Malley?
这个:
SET @keyword='O\'malley*';
SELECT * FROM all_schools WHERE match (school_name) against (@keyword IN BOOLEAN MODE);
仅使用 Malley
给我结果,这是我不想要的。我想要 O'Malley
和 O'Malleygough
如果它存在
最佳答案
您应该能够使用 ''
或 \'
转义单引号。
foreach( $validSearchWords as $word ) { //this is a cleaned array of the user query phrase
$mycount++;
$word = str_replace('\'', '\'\'', $word);
// if only one search term
if ($vcount == $mycount) {
$wordCriteria['keyword'] .= $word.'*';
// if term is second or higher
} else {
$wordCriteria['keyword'] .= $word.'* ';
}
}
更好的解决方案是使用 mysqli::escape_string()或 PDO::quote()
关于MySQL MATCH AGAINST - 处理单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727078/