我有文本存储在 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_term
是 you’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
替换 '
与 ’
... 但似乎不起作用。
我知道理想的解决方案是将单个引用的所有数据库示例调整为标准引用,但这在我的情况下是不可能的。
解决这个问题的正确方法是什么?
3条答案
按热度按时间7gyucuyw1#
我想指出
%
不是唯一可以在中使用的占位符LIKE
查询。可以使用下划线_
也表示单个字符。一种方法是用下划线替换某个类中的每个标点字符。这将允许“you're”匹配“you're”,反之亦然(当然,它也允许“youvre”匹配!)在将值传递给
LIKE
子句,使用wpdb::esc_like()
以确保用户提供的百分号或下划线不会妨碍工作。sanitize_text_field()
是在输出到html之前使用的,对数据库查询的文本安全性没有任何作用。那是什么wpdb::_real_escape()
是给你的。jutyujz02#
你可以像这样使用mysql:
h4cxqtbf3#
我一天要用两次
LIKE
语句,一个用原来的搜索词,第二个用替换词'
由’
可以使用参数化查询。在本例中,使用wpdb::prepare():这个
%s
是查询中要指示的占位符$wpdb->prepare()
在这个地方会有一根绳子。