在$ wpdb->中使用like语句,准备在通配符所在的位置显示哈希值

时间:2018-12-18 11:02:11

标签: php mysql wordpress prepared-statement sql-like

我正在尝试使用通配符构建准备好的语句,但是我遇到了一个问题,其中通配符字符的百分比似乎返回了通配符的散列值,我不确定为什么。有问题的代码是:

$condition = $wpdb->prefix."posts.post_title LIKE %%%s%%";
$query['conditions'][] = $wpdb->prepare($condition, $name);

结果是:

posts.post_title LIKE {d690dd63f5944b9bca120e110c22802f0ec841d8120d813dd4abc08cba4a59c0}BT{d690dd63f5944b9bca120e110c22802f0ec841d8120d813dd4abc08cba4a59c0}

只是想知道是否有人对造成这种情况的原因有任何想法。任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:0)

LIKE的通配符必须在 in 之内,而不用%s表示的变量。否则,它会将参数的令牌与SQL通配符混合在一起。即使这不是问题,也还是需要这样做,因为否则%不会在字符串中转义,并且最终会导致SQL语法错误。

换句话说,您需要将通配符添加到$name值本身中。我认为这应该可以完成工作:

$condition = $wpdb->prefix."posts.post_title LIKE %s";
$name = '%'.$name.'%';
$query['conditions'][] = $wpdb->prepare($condition, $name);

答案 1 :(得分:0)

不用担心哈希,当您执行查询时,它们会在$ wpdb中替换为%。

这些散列是WP v4.8.3引入的,用于解决SQL注入攻击。

它们是%字符的占位符。它可以防止他人使用%s,%d和%f以外的其他内容。如果除已批准的用途之外还有其他百分比,它将用哈希替换该百分比。 $ wpdb执行查询时,该哈希将替换为%。

如果您想自己删除哈希,可以使用remove_placeholder_escape(),如下所示:

$query['conditions'][] = $wpdb->remove_placeholder_escape($wpdb->prepare($condition, $name));