问题描述
我想使用 LIKE%text%语句,同时仍然使用 WordPress $ wpdb 类来清理和准备输入。
SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';
我已经尝试过这样的事情没有效果:
$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));
如何使用 WordPress 数据库类正确准备一个%LIKE%SQL 语句?
最佳解决方案
$wpdb->esc_like
功能存在于 WordPress 中,因为常规数据库转义不会转义%
和_
字符。这意味着您可以将它们添加到 wpdb::prepare()
的参数中,没有任何问题。这也是 what I see in the core WordPress code:
$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');
所以你的代码看起来像:
$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", '%' . $wpdb->esc_like($number_to_put_in_like) . '%');
您还可以在查询中添加%%
,以获得文字%
(wpdb::prepare()
在后台使用 vsprintf()
,which has this syntax),但请记住,您的字符串不会被引用,您必须自己添加引号 (这不是您通常必须做的在 wpdb::prepare()
。
次佳解决方案
您需要百分之二,所以它们不被 wpdb->prepare()
的片段标记处理:
$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));
PS 不知道这是最好的/唯一的方法。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。