问题描述

我想使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。