查询参数必须包含占位符,咨询这段WPDB查询的问题所在
问题分析与修正方案
你的这段SQL查询的核心问题是没有正确利用wpdb->prepare的占位符功能,反而直接将变量$post_id硬拼接进SQL语句中,完全失去了prepare方法提供的SQL注入防护作用,这也是WordPress官方明确不推荐的写法。
错误原因
wpdb->prepare的设计目的就是通过占位符来自动转义变量,避免恶意SQL注入。你当前的写法和直接拼接SQL字符串没有本质区别,相当于白调用了prepare方法。
正确写法
根据post_id是整数类型的特性,应该使用%d作为数字占位符,将变量作为参数传入prepare:
$sql = $wpdb->prepare( "SELECT * FROM `wp_postmeta` WHERE `meta_key`='_favorites' AND `post_id` = %d", $post_id );
如果meta_key后续也需要动态传入,同样要用字符串占位符%s:
$sql = $wpdb->prepare( "SELECT * FROM `wp_postmeta` WHERE `meta_key`=%s AND `post_id` = %d", '_favorites', $post_id );
内容的提问来源于stack exchange,提问作者Kreawich C
相关产品推荐
相关产品推荐

