Formidable Pro中PHP/MySQL COUNT功能失效求助
问题排查与修复方案
先帮你拆解下代码里的几个核心问题,这就是为什么它始终返回0且逻辑失效的原因:
1. 钩子与短码的函数复用冲突
你把同一个een_maal函数同时挂到了frm_validate_field_entry钩子和test短码上,但这两个场景的参数、返回值要求完全不同:
frm_validate_field_entry钩子需要返回错误数组,而不是数字- 短码调用时不会传入
$errors、$posted_field这些钩子参数,会导致变量未定义,逻辑直接混乱
2. SQL查询的致命问题
- 你用
$wpdb->get_col()却写了SELECT *,get_col()是用来获取单列数据的,SELECT *会导致它只取第一列的值,而且如果查询本身有语法错误,会直接返回空数组 - 没有正确使用
$wpdb->prepare()的占位符,$paginatitel是字符串类型,直接拼进SQL会导致语法错误,还存在SQL注入风险 - 逻辑判断完全搞反了:现在是当条目数<=0时提示错误,这和你“判断用户已有条目就提示”的需求正好相反
3. 函数返回与输出顺序错误
你在return count($entries);之后写了echo count($entries);,但return之后的代码永远不会执行,这也是你看不到正确输出的原因之一
修复后的代码
我把钩子和短码拆成两个独立函数,同时修正所有SQL和逻辑问题:
1. 表单验证钩子(实现已有条目时提示错误)
add_filter('frm_validate_field_entry', 'een_maal_validate_entry', 10, 3); function een_maal_validate_entry($errors, $posted_field, $posted_value){ // 只在前台处理,且确保用户已登录 if(!is_admin() && is_user_logged_in()){ global $wpdb, $user_ID; // 用WordPress原生函数获取页面slug,比短码更可靠 $paginatitel = get_post_field('post_name', get_the_ID()); // 正确使用prepare占位符,直接查询符合条件的条目数 $entry_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(e.id) FROM {$wpdb->prefix}frm_item_metas em LEFT JOIN {$wpdb->prefix}frm_items e ON em.item_id = e.id WHERE e.form_id = %d AND em.field_id = %d AND em.meta_value = %s AND e.user_id = %d", 23, 591, $paginatitel, $user_ID )); // 当已有条目时,添加错误提示到对应字段 if($entry_count > 0){ $errors['field'. $posted_field->id] = 'You have already selected that option'; } } // 钩子必须返回错误数组,不能返回数字 return $errors; }
2. 可复用的短码(返回条目数字)
如果你需要在其他地方复用条目数量,可以单独写一个短码函数:
add_shortcode('entry_count_check', 'een_maal_get_entry_count'); function een_maal_get_entry_count(){ if(!is_user_logged_in()){ return 0; // 未登录用户直接返回0 } global $wpdb, $user_ID; $paginatitel = get_post_field('post_name', get_the_ID()); $entry_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(e.id) FROM {$wpdb->prefix}frm_item_metas em LEFT JOIN {$wpdb->prefix}frm_items e ON em.item_id = e.id WHERE e.form_id = %d AND em.field_id = %d AND em.meta_value = %s AND e.user_id = %d", 23, 591, $paginatitel, $user_ID )); // 返回整数类型的条目数,方便在其他地方复用 return (int)$entry_count; }
关键优化点说明
- 用
get_var()直接查询计数,比get_col()再count()更高效,也避免了空数组计数错误 - 所有变量都通过
prepare()的占位符传入,彻底避免SQL注入和语法错误 - 拆分钩子和短码函数,各自专注自己的职责,避免参数冲突
- 用WordPress原生函数替代短码获取页面slug,稳定性和性能更好
- 增加了
is_user_logged_in()判断,避免未登录时$user_ID为空导致的查询错误
内容的提问来源于stack exchange,提问作者albertmullaart
相关产品推荐
相关产品推荐

