WordPress中使用带条件SELECT COUNT(*)统计表行数报SQL语法错误
问题根因
你在SQL语句中错误使用单引号包裹表名触发了语法错误。在MariaDB/MySQL的语法规则中:
- 单引号
'仅用于包裹字符串类型的字段值 - 表名、字段名这类标识符如果需要转义,应该用反引号
`,如果没有特殊字符也可以不加任何引号
修复方案
有两种可用修复方式,优先推荐第二种WordPress官方推荐写法,可同时避免语法错误和SQL注入风险:
方案1:直接修正表名的引号
将包裹表名的单引号删除,或者替换为反引号即可:
$recipe_counting = $wpdb->get_var( "SELECT COUNT(*) FROM " . $wpdb->prefix . "recipe_ratings WHERE recipe_id ='" . $post_ID . "' AND user_ip='" . $user_IP . "'" );
加反引号的兼容写法如下:
$recipe_counting = $wpdb->get_var( "SELECT COUNT(*) FROM `" . $wpdb->prefix . "recipe_ratings` WHERE recipe_id ='" . $post_ID . "' AND user_ip='" . $user_IP . "'" );
方案2:使用$wpdb预处理查询(推荐)
直接拼接SQL字符串存在SQL注入风险,WordPress官方推荐用prepare方法预处理参数,会自动处理参数转义:
$recipe_counting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM `{$wpdb->prefix}recipe_ratings` WHERE recipe_id = %d AND user_ip = %s", $post_ID, $user_IP ) );
其中%d对应数字类型的$post_ID,%s对应字符串类型的$user_IP。
内容的提问来源于stack exchange,提问作者AminulHub
相关产品推荐
相关产品推荐

