博客后台SQL INSERT语句插入单条记录却新增三条空记录的问题排查
根据你提供的代码和问题描述,我整理了几个最可能导致这个问题的原因,你可以逐一排查:
表单重复提交/误触发
这是最常见的情况。比如管理员提交表单时不小心连续点了三次按钮,或者页面提交后按F5刷新导致浏览器重复发送请求。另外,如果表单的提交按钮被JS重复绑定了submit事件,也会出现一次点击触发多次插入的情况。如果这些请求里的表单字段是空的(比如用户还没填写就误操作),自然会生成空记录。代码逻辑被重复执行
检查下这段插入代码是否被放在了会多次运行的逻辑块里。比如有没有被for/while循环包裹?或者页面里存在多个相同的表单提交入口?甚至可能是后端的处理函数被JS多次调用(比如AJAX请求重复发送),导致插入语句执行了三次。网络或服务器端的重复请求
如果网络不稳定,浏览器可能会判定第一次请求未成功,自动重试两次,累计三次请求。或者服务器端没有返回正确的响应状态码(比如返回5xx错误),让客户端误以为请求失败,进而重复发送。这种情况下,如果请求携带的参数是空值,就会插入三条空记录。数据库触发器的额外插入
检查你的story表是否设置了触发器。比如有没有创建AFTER INSERT类型的触发器,当插入一条记录时,触发器逻辑错误地向同表插入了空记录?如果每次插入正常记录都会伴随三条空记录,那大概率是触发器的问题。表单字段未做非空校验
你的代码里没有对$title、$body这些变量做非空检查,如果管理员在表单里什么都没填就提交(或者表单字段值没正确传递到后端),就会插入空记录。而三次空记录可能是这种无效提交发生了三次。
另外顺便提醒:你当前的代码存在严重的SQL注入风险,直接把用户输入的变量拼进SQL语句非常危险。建议尽快改用预处理语句,示例如下:
$insert_story = "INSERT INTO story(title,date,author,intro,body,category) VALUES(?,?,?,?,?,?)"; $stmt = mysqli_prepare($conn, $insert_story); mysqli_stmt_bind_param($stmt, "ssssss", $title, $date, $author, $intro, $body, $category); mysqli_stmt_execute($stmt);
内容的提问来源于stack exchange,提问作者Vic

