MySQL MATCH AGAINST - 处理单引号

标签 mysql search full-text-search

我正在学习 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'MalleyO'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/

相关文章:

mysql - 获取单个分隔值中的一个值并获取 mySQL 中每一行的计数

mysql - 如果值为空或不为两个新值,则在 SQL 中赋值

php - 使用 PHP 在一个 SQL 查询中执行多个更新

java - 基于线性时间搜索字符串对字符串进行排序

ruby-on-rails - 哈希中的 Ruby on Rails 2 搜索字符串

java - 使用 Java 在二进制文件中搜索字节序列

java - Solr文档中动态键值对的存储和搜索

c# - 当我在 MysqlDB && C# 中编辑用户信息时出现问题

sql-server - SQL Server 全文搜索 : different results of parsing forms of words

sql-server-2008 - 全文搜索条件 'of'中 'control of'附近的语法错误