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

使用PHP+MariaDB RANK()函数实现表单提交后表数据排名更新

问题根因与修复方案

核心错误1:SQL执行结果判断逻辑错误

mysqli的query()方法返回值有明确规则:

  • 执行INSERT/UPDATE/DELETE等写操作时,成功返回布尔值TRUE,失败返回FALSE
  • 执行SELECT等读操作时,成功返回mysqli_result结果集对象,失败才返回FALSE
    你当前用$conn->query($sql2) === TRUE判断SELECT语句的执行结果,即使SQL正常执行,返回的对象也不等于布尔TRUE,必然会走到错误分支,属于判断逻辑完全错误。

核心错误2:错误信息输出变量错误

你在$sql2的错误分支里输出的是$sql(也就是之前的INSERT语句)而非$sql2,所以你根本看不到排名SQL的真实报错,反而把正常执行的INSERT语句打印出来,误导你以为是插入逻辑出了问题。

核心错误3:排名逻辑没有落地

你现在写的RANK()查询只是临时计算了排名结果,既没有存储到数据库里,也没有读取结果做后续处理,完全没达到你说的「完成排名计算」的业务需求。


修复后的代码

首先如果你需要把排名结果持久化存到Table1表,先给Table1新增一个myrank字段,类型选INT即可,后续用以下代码即可实现需求:

add_action( 'gform_after_submission_13', 'myfunction', 10 , 1);
function myfunction($entry){
    // 优先用WordPress自带的数据库操作类,避免重复建连接和SQL注入风险
    global $wpdb;
    $table_name = 'Table1';

    $nome = rgar( $entry, '1' );
    $categoria = rgar( $entry, '4' );
    $score = rgar( $entry, '2' );
    $ig = rgar( $entry, '3' );

    // 插入数据用wpdb的insert方法,自动做参数绑定防注入
    $insert_result = $wpdb->insert(
        $table_name,
        [
            'nome' => $nome,
            'categoria' => $categoria,
            'score' => $score,
            'ig' => $ig
        ],
        [
            '%s', '%s', '%d', '%s'
        ]
    );

    if($insert_result){
        echo "New record created successfully";
    }else{
        echo "Insert Error: " . $wpdb->last_error;
        return;
    }

    //---RANKING PART-------------
    // 方案1:需要把全表排名更新回表中使用这个
    $update_rank_sql = "
        UPDATE Table1 t1
        JOIN (
            SELECT 
                id, -- 替换成你Table1实际的主键字段名
                RANK() OVER (PARTITION BY categoria ORDER BY score DESC) AS myrank
            FROM Table1
        ) t2 ON t1.id = t2.id
        SET t1.myrank = t2.myrank
    ";
    $update_result = $wpdb->query($update_rank_sql);
    if($update_result !== false){
        echo "Ranking update completed";
    }else{
        echo "Ranking Update Error: " . $wpdb->last_error;
    }

    /* 方案2:如果只需要获取当前提交用户的排名,不需要存表用这个
    $get_rank_sql = $wpdb->prepare("
        SELECT myrank FROM (
            SELECT 
                RANK() OVER (PARTITION BY categoria ORDER BY score DESC) AS myrank,
                id
            FROM Table1
            WHERE categoria = %s
        ) t WHERE id = %d
    ", $categoria, $wpdb->insert_id);
    $current_rank = $wpdb->get_var($get_rank_sql);
    // 后续可直接用$current_rank做业务逻辑,比如返回前端展示
    */
}

额外注意事项
  • 原有代码直接拼接用户输入到SQL语句中,存在严重的SQL注入风险,用WordPress自带的$wpdb类的参数绑定方法可完全规避该问题
  • MariaDB 10.3版本已经完整支持窗口函数,RANK()语法本身不存在兼容问题
  • 确认Table1存在主键字段,UPDATE排名逻辑需要用主键做关联匹配

内容的提问来源于stack exchange,提问作者Bruno Spoti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:06:02