自定义框架下数据库重复数据校验与跳过执行的问题求助
问题解决: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
相关产品推荐
相关产品推荐

