You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:04:09