在db query中将“ curl ”引号与标准引号匹配

fzwojiic  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(326)

我有文本存储在 post_title 列:

you’re

使用此查询:

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;
}

如果 $search_termyou’re ,它工作并找到列。但当它是 you're ,它不起作用(因为它是不同的单引号)。
如何改进查询以使两者都 you’re 以及 you're 与匹配 you’re ?

我已经试过了

使用 str_replace()$search_term 替换 ' . 例子: str_replace('\'','’',$wpdb->esc_like( $search_term )) ... 这种方法的问题是,如果存储的列是 you're .
AND REPLACE'.$wpdb->posts.'.post_title 替换 ' ... 但似乎不起作用。
我知道理想的解决方案是将单个引用的所有数据库示例调整为标准引用,但这在我的情况下是不可能的。
解决这个问题的正确方法是什么?

7gyucuyw

7gyucuyw1#

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

<?php
function ma_post_title_filter($where, &$wp_query) {
    global $wpdb;
    $punct = ["’", "‘", "”", "“"];
    if ( $search_term = $wp_query->get( 'ma_search_post_title' ) ) {
        // escape any % or _ characters
        $search_term = $wpdb->esc_like($search_term);
        // replace desired punctuation characters with _
        $search_term = str_replace($punct, "_", $search_term);
        // do final escaping for safe queries
        $search_term = $wpdb->_real_escape($search_term);
        // this looks much neater with string interpolation vs concatenation
        $where .= " AND $wpdb->posts.post_title LIKE '%$search_term%'";
    }
    return $where;
}

在将值传递给 LIKE 子句,使用 wpdb::esc_like() 以确保用户提供的百分号或下划线不会妨碍工作。 sanitize_text_field() 是在输出到html之前使用的,对数据库查询的文本安全性没有任何作用。那是什么 wpdb::_real_escape() 是给你的。

jutyujz0

jutyujz02#

你可以像这样使用mysql:

$where .= ' AND '. $wpdb->posts .'.post_title RLIKE \'.\*'. $wpdb->esc_like(str_replace(["’","'"],"['’]", $search_term) ) .'.\*\' ';
h4cxqtbf

h4cxqtbf3#

我一天要用两次 LIKE 语句,一个用原来的搜索词,第二个用替换词 ' 可以使用参数化查询。在本例中,使用wpdb::prepare():

$searchTerm = "You're"; //Don't sanitize using a function, this will by done with parameters.
// query
$where .= ' AND ('. $wpdb->posts .'.post_title LIKE %s OR '. $wpdb->posts .'.post_title LIKE %s)'; //Notice the double %s
//I suppose $where contains your whole query
$sth = $wpdb->prepare($where, '%' . $searchTerm . '%', '%' . str_replace('’', '\'', $search_term) . '%'); //This will associate the %s (a string) in the query by the value indicated in the function
$wpdb->query($sth);

这个 %s 是查询中要指示的占位符 $wpdb->prepare() 在这个地方会有一根绳子。

相关问题