向SQL插入数据时重复插入两行,请求排查原因
插入SQL时重复两行的问题排查与解决
问题原因
你代码里的重复插入确实是注释为// id_no update的if语句导致的:你先执行了一次$result=mysqli_query($con,$sql);完成插入,紧接着又在if条件里调用mysqli_query($con,$sql)再次执行了同一个INSERT语句,等于连续执行两次插入操作,自然会产生重复行。
修正代码
把重复执行的INSERT语句去掉,改成判断第一次插入操作的结果即可,修正后的核心代码如下:
<?PHP if(isset($_POST['add_id'])) { $id_no = mysqli_real_escape_string($con,$_POST['id_no']); $sql="INSERT INTO `db_name`(`id_no`) VALUES ('$id_no')"; $result=mysqli_query($con,$sql); // id_no update if($result) // 改为判断第一次插入的结果,不再重复执行INSERT { $query = "SELECT id_no FROM db_name ORDER BY id_no DESC"; $result_select = mysqli_query($con,$query); // 重命名变量,避免覆盖之前的$result $row = mysqli_fetch_array($result_select); $lastid = $row['id_no']; if(empty($lastid)) { $number = "SX000001"; } else { $idd = str_replace("SX", "", $lastid); $id = str_pad($idd + 1, 6, 0, STR_PAD_LEFT); $number = 'SX'.$id; } } else { echo "Record Faileddd"; } if($result) { $success="Post has been added successfully"; } else { $error="Something went wrong!"; } $id_no = ''; } ?>
额外优化建议
- 你当前手动生成类自增ID的方式存在并发风险:如果有多个请求同时执行,可能会取到相同的最后ID,生成重复的编号。建议改用数据库自增字段配合字符串拼接的方式:
- 在表中新增一个INT类型的自增主键字段
id - 插入数据时无需手动生成编号,数据库自动维护
id的自增 - 需要获取带前缀的编号时,用SQL函数拼接:
CONCAT('SX', LPAD(id, 6, '0'))
- 在表中新增一个INT类型的自增主键字段
- 代码中尽量区分不同操作的变量名(比如把查询结果的变量改为
result_select),避免因变量覆盖导致逻辑混乱
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

