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

自定义框架下数据库重复数据校验与跳过执行的问题求助

问题解决:CheckSOP逻辑失效导致重复执行注册操作

核心问题

你的CheckSOP函数返回的是数据库查询语句对象(而非实际的查询结果数值),导致empty()判断完全失效——不管数据库里有没有符合条件的记录,这个对象始终存在,所以if(empty($checkSOP))永远为真,每次都会执行注册和生成操作。

修复方案

1. 修改CheckSOP函数,返回实际计数结果

修改函数,获取COUNT(*)的查询结果并返回具体数值:

public static function CheckSOP($user_id, $unique_id, $season_id, $farm_id, $startDate){ 
    $db = DB::getInstance();
    $query = "SELECT COUNT(*) AS count FROM sop_records
              WHERE start_date = '$startDate' AND rec_sop_unique_id = '$unique_id' 
              AND season_id = '$season_id'";
    
    $getSOP = $db->prepare($query);
    $getSOP->execute();
    // 获取查询结果数组
    $result = $getSOP->fetch(PDO::FETCH_ASSOC);
    // 返回转换为整数的计数结果
    return (int)$result['count'];        
}

2. 修正调用处的判断逻辑

现在函数返回的是符合条件的记录数,直接判断是否为0即可,逻辑更清晰:

$checkSOPCount = sopActivity::CheckSOP($user_id, $unique_id['unique_id'], $season_id, $farm_id, $startDate);

if($checkSOPCount === 0){   
    $register_sop = sopActivity::RegisterSOP($user_id, $unique_id['unique_id'], $season_id, $farm_id, $startDate);
    $acts_generate = sopActivity::GenerateSOP($user_id, $unique_id['unique_id'], $season_id, $farm_id, $startDate);
}

3. 重要优化:修复SQL注入漏洞

当前代码直接拼接变量到SQL语句中,存在严重的SQL注入风险,建议改用参数绑定:

public static function CheckSOP($user_id, $unique_id, $season_id, $farm_id, $startDate){ 
    $db = DB::getInstance();
    $query = "SELECT COUNT(*) AS count FROM sop_records
              WHERE start_date = ? AND rec_sop_unique_id = ? 
              AND season_id = ?";
    
    $getSOP = $db->prepare($query);
    // 通过参数绑定传递变量,避免SQL注入
    $getSOP->execute([$startDate, $unique_id, $season_id]);
    $result = $getSOP->fetch(PDO::FETCH_ASSOC);
    return (int)$result['count'];        
}

内容的提问来源于stack exchange,提问作者Muhammad Faiz Abdullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:35:22