查询触发重复请求致book_total被扣减两次的技术问题咨询
解决页面操作时book_total被扣减两次的问题
这种重复扣减的情况我碰到过好几次,大概率是提交逻辑或者请求触发的问题,咱们一步步来排查:
先查最常见的「重复提交」问题
- 前端按钮/事件重复绑定:你先看看页面里的提交按钮,是不是同时用了表单默认提交(比如
<button type="submit">)又加了AJAX提交的onclick事件?这会导致一次点击触发两次请求。另外也检查下有没有给提交事件绑定了两次监听代码,比如写了两次$('form').submit(function(){...})。 - 页面里有重复表单/按钮:有时候模板渲染错误会导致同一个表单或提交按钮被渲染两次,肉眼可能没注意到,点击一次其实触发了两个表单的提交。
再看请求是否被发送了两次
打开浏览器的开发者工具(按F12),切换到「网络」标签,然后在页面上完成借阅操作,盯着请求记录看——如果出现两个一模一样的扣减接口请求,那问题肯定在前端的提交逻辑上;如果只有一次请求,那就要去后端找原因了。
后端逻辑排查(虽然数据库直接操作正常,但也要确认)
你说直接操作数据库没问题,但页面调用的接口脚本里,会不会不小心写了两次扣减book_total的代码?比如:
// 会不会写了两次UPDATE? $sql = "UPDATE books SET book_total = book_total - 1 WHERE id = ?"; // 执行了一次之后,又不小心执行了一次?
或者有没有在事务里重复执行了更新操作?可以在后端的扣减代码前加个简单的日志,比如把当前时间、请求参数写入一个日志文件,看看这段代码是不是被执行了两次。
结合你给的表单代码的小检查
你贴的表单片段:
<div class="fInput"> <input type="number" name="bookCount" value="1" min="1" max="<?php echo($row[0][2]); ?>"> </div> <div class="fInput"> <input type="date" min="<?php echo($today); ?>" name="dateBorrowed" value="<?php echo($today); ?>"> </div>
先确认bookCount的默认值是1,后端接收这个参数的时候有没有被错误解析成2?不过你说数据库直接操作是对的,这个可能性不大,但可以顺便排查下后端拿到的bookCount参数值是不是正确的。
快速验证小技巧
- 操作页面时,立刻看网络请求数,区分是前端多提交还是后端多执行;
- 在后端扣减代码里加日志,直接看执行次数,比瞎猜高效多了。
内容的提问来源于stack exchange,提问作者MaakuD
相关产品推荐
相关产品推荐

