【问题标题】:MySQL MATCH AGAINST - dealing with a single quoteMySQL MATCH AGAINST - 处理单引号
【发布时间】:2015-11-16 01:06:26
【问题描述】:

我只是在 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.'* ';
    }
}

我了解这里的尝试,但我怀疑第一个逻辑块不正确。

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'MalleyO'Malleygough(如果存在)

【问题讨论】:

  • 我在您的问题或代码 sn-p 的任何地方都没有看到 SQL 查询。
  • 同意,我添加了一个来澄清。真正的问题是,“你如何对O'Malley* 进行布尔模式搜索,它不仅匹配 Malley,而且匹配 O'Malley 和 O'Malleygough?

标签: mysql search full-text-search


【解决方案1】:

您应该能够使用''\' 转义单引号。

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()

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2012-03-15
    • 2011-11-10
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2019-07-25
    • 2013-01-24
    相关资源
    最近更新 更多