我正在尝试使用通配符构建准备好的语句,但是我遇到了一个问题,其中通配符字符的百分比似乎返回了通配符的散列值,我不确定为什么。有问题的代码是:
$condition = $wpdb->prefix."posts.post_title LIKE %%%s%%";
$query['conditions'][] = $wpdb->prepare($condition, $name);
结果是:
posts.post_title LIKE {d690dd63f5944b9bca120e110c22802f0ec841d8120d813dd4abc08cba4a59c0}BT{d690dd63f5944b9bca120e110c22802f0ec841d8120d813dd4abc08cba4a59c0}
只是想知道是否有人对造成这种情况的原因有任何想法。任何帮助将不胜感激。
谢谢
答案 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));