为什么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ó
相关产品推荐
相关产品推荐

