在数据库查询中匹配标准引号的"卷曲"引号

Hen*_*son 5 php mysql sql wordpress

我的文字存储在post_title列中:

you’re
Run Code Online (Sandbox Code Playgroud)

使用此查询:

function ma_post_title_filter($where, &$wp_query) {
    global $wpdb;
    if ( $search_term = $wp_query->get( 'ma_search_post_title' ) ) {
        $search_term = sanitize_text_field($search_term);
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\'';
    }
    return $where;
}
Run Code Online (Sandbox Code Playgroud)

如果$search_term是you’re,它可以工作并找到列.但是当它出现时you're,它不起作用(因为它是一个不同的单引号).

如何改进查询以便you’re与... you're匹配you’re?

到目前为止我尝试过的

  1. 使用str_replace()上$search_term,以取代'用’.示例:str_replace('\'','’',$wpdb->esc_like( $search_term ))...这种方法的问题是,如果存储的列是,我们永远不会匹配you're.
  2. 不要AND REPLACE在'.$wpdb->posts.'.post_title更换'与’......但似乎并没有工作.

我知道理想的解决方案是将单引号的所有数据库实例调整为标准实例,但在我的情况下这是不可能的.

什么是适当的解决方案?

mik*_*n32 2

我想指出这%并不是唯一可以在LIKE查询中使用的占位符。您也可以使用下划线_来表示单个字符。一种方法可能是将某个类中的每个标点字符替换为下划线。这将允许“you\re”匹配“you\xe2\x80\x99re”,反之亦然。(当然,它也允许“youvre”匹配!)

\n\n
<?php\nfunction ma_post_title_filter($where, &$wp_query) {\n    global $wpdb;\n    $punct = ["\xe2\x80\x99", "\xe2\x80\x98", "\xe2\x80\x9d", "\xe2\x80\x9c"];\n    if ( $search_term = $wp_query->get( \'ma_search_post_title\' ) ) {\n        // escape any % or _ characters\n        $search_term = $wpdb->esc_like($search_term);\n        // replace desired punctuation characters with _\n        $search_term = str_replace($punct, "_", $search_term);\n        // do final escaping for safe queries\n        $search_term = $wpdb->_real_escape($search_term);\n        // this looks much neater with string interpolation vs concatenation\n        $where .= " AND $wpdb->posts.post_title LIKE \'%$search_term%\'";\n    }\n    return $where;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

LIKE在将值传递给子句时,您应该使用wpdb::esc_like()以确保任何用户提供的百分号或下划线不会妨碍操作。sanitize_text_field()旨在在输出到 HTML 之前使用,并且不会使文本对于数据库查询来说是安全的。这就是目的wpdb::_real_escape()。

\n