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

为什么PHP代码无法过滤MySQL数据库中已存在的重复记录?

代码问题定位
  • 顶层判断逻辑错误:两个参数都存在的情况下直接进入空代码块,后续长度校验、重复校验逻辑全部被跳过,相当于所有校验都没生效
  • 重复校验未实际执行查询:仅定义了SQL查询字符串,未调用mysqli_query执行、也未获取查询结果,直接判断字符串是否为空的逻辑永远不成立
  • 重复判断逻辑写反:查询返回结果不为空才代表数据已存在,原代码写反了判断条件
  • 存在SQL注入风险:直接把用户传入的参数拼接到SQL语句中,极易被攻击
  • 匹配符使用错误:精准匹配条码用=即可,无需用LIKE做模糊匹配
修复后代码
<?php
include 'settings.php';

$msg = '';

if(isset($_POST['rogzit'])) {
    // 先校验参数是否存在
    if(!isset($_POST['vonalkod'], $_POST['garnitura'])) {
        $msg = '<h4 class="col-12 text-center mb-3 text-danger">参数缺失!</h4>';
    } else {
        $vonalkod = trim($_POST['vonalkod']);
        $garnitura = trim($_POST['garnitura']);
        // 合并长度校验逻辑
        if(strlen($vonalkod) != 12) {
            $msg = '<h4 class="col-12 text-center mb-3 text-danger">Nem megfelelő a vonalkód beolvasása!</h4>';
        } else {
            // 用预处理语句做查询,避免注入
            $check_stmt = mysqli_prepare($conn, "SELECT azon FROM G0004 WHERE vonalkod = ? LIMIT 1");
            mysqli_stmt_bind_param($check_stmt, "s", $vonalkod);
            mysqli_stmt_execute($check_stmt);
            mysqli_stmt_store_result($check_stmt);
            // 查询到记录说明数据已存在
            if(mysqli_stmt_num_rows($check_stmt) > 0) {
                $msg = '<h4 class="col-12 text-center mb-3 text-danger">A termék már volt rögzítve!</h4>';
            }
            mysqli_stmt_close($check_stmt);
        }
    }

    // 没有错误则执行插入
    if(empty($msg)){
        // 插入也用预处理语句
        $insert_stmt = mysqli_prepare($conn, "INSERT INTO G0004(vonalkod, garnitura) VALUES (?, ?)");
        mysqli_stmt_bind_param($insert_stmt, "ss", $vonalkod, $garnitura);
        if(mysqli_stmt_execute($insert_stmt)) {
            $msg = '<h4 class="col-12 text-center mb-3 text-success">Sikeres rögzítés!</h4>';
        } else {
            $msg = '<h4 class="col-12 text-center mb-3 text-danger">Sikertelen rögzítés!</h4>';
        }
        mysqli_stmt_close($insert_stmt);
    }
}
?>
额外优化建议
  • 给MySQL表的vonalkod字段添加唯一索引,数据库层面会直接拦截重复插入,就算逻辑层出现漏判也不会出现重复数据
  • 可以对用户传入的参数做trim处理,避免首尾空格导致的匹配失败

内容的提问来源于stack exchange,提问作者Tóth László

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:54:05