PHP模态框提交数据异常:重复提交仅存单条及冗余数据问题
模态框表单MySQL数据存储问题
问题描述
- 多人同时填写提交表单时,仅单条数据能存入MySQL
- 采用「点击模态框插入假数据占位、提交时更新、取消时删除」方案,但删除操作会清除所有假数据,无法按对应id删除
- 已禁用表单刷新,但刷新后假数据会残留于表中
现有实现代码
获取最大Receipt_no的代码
$query = "select MAX(Receipt_no) from payments"; $result = mysqli_query($conn,$query); $row = mysqli_fetch_assoc($result); $receipt_no = $row['MAX(Receipt_no)']+1; $inputterr = $_SESSION['name'];
插入假数据的代码
$query_ru = "insert into payments(id,amount,remarks,receipt_no,full_name,fee_head,payment_mode,timings,inputter,amount_in_words,Month_Of_Payment,cheque_no,ef_no,FEE_TYPE) values(Null,000000,'dummyvalue','$receipt_no','Fee in Process.','dummyvalue','dummyvalue','dummyvalue','$inputterr','dummyvalue','','dummyvalue','dummyvalue','Fee in process.')"; $exec_tu = mysqli_query($conn,$query_ru);
更新数据的代码
$x_id = $_GET['id'] ?? ''; $ef_no = $_POST['ef_no']; $receipt_no1 = $_POST['receipt_no']; $name = $_POST['name']; $remarks = $_POST['remarks']; $date = $_POST['date']; $fee_head = $_POST['fee_head']; $cheque_no = $_POST['cheque_no']; $payment_mode = $_POST['payment_mode']; $timings = $_POST['timings']; $amount = $_POST['amount']; $FEE_TYPE = $_POST['FEE_TYPE']; $inputter = $_POST['inputter']; $amount_in_words = $_POST['amount_in_words']; $receiving_date11 = $_POST['date']; $rec_date = date("d-M-Y",strtotime($receiving_date11)); $month_of_payment = $_POST['month_of_payment']; $mop = date('y-m-d',strtotime($month_of_payment)); $query_t = "update payments set amount='$amount',ef_no='$ef_no',remarks='$remarks',FULL_NAME='$name',FEE_HEAD='$fee_head',PAYMENT_MODE='$payment_mode',AMOUNT_IN_WORDS='$amount_in_words',Month_Of_Payment='$mop',CHEQUE_NO='$cheque_no',TIMINGS='$timings',INPUTTER='$inputter',FEE_TYPE='$FEE_TYPE' where id='$x_id'"; $exec_t = mysqli_query($conn,$query_t);
取消按钮代码
<div class="col-lg-6"> <br> <input type="submit" value="Submit" class="btn btn-primary" name="BtnSave"> <!-- <button class="2 btn btn-danger" name="CancelBtn">Cancel</button> --> <?php // echo "<a href='deleteDummy.php?id=$hidden_id' class='2 btn btn-danger'>Cancel</a>"; echo "<a href='deleteDummy.php?id=$hidden_id'><button type='button' class='btn btn-danger' >Cancel</button></a>"; ?> </div>
解决方案
1. 解决多人提交仅单条数据存储问题
当前通过MAX(Receipt_no)+1生成新单号的方式存在竞态条件,多人同时操作时会获取到相同的最大值,导致后续插入冲突或覆盖。
优化方案:
- 将
Receipt_no字段设置为自增字段(若业务允许),直接依赖MySQL的AUTO_INCREMENT特性生成唯一单号 - 若必须自定义单号格式,使用事务+行锁确保单号生成的原子性:
// 开启事务 mysqli_begin_transaction($conn); // 加锁查询最大单号,防止并发冲突 $query = "select MAX(Receipt_no) from payments FOR UPDATE"; $result = mysqli_query($conn,$query); $row = mysqli_fetch_assoc($result); $receipt_no = ($row['MAX(Receipt_no)'] ?? 0) + 1; // 执行插入操作后提交事务 mysqli_commit($conn);
2. 解决删除假数据无法按对应id删除问题
问题核心是$hidden_id传递或赋值错误,导致无法定位当前用户的假数据。
优化方案:
- 插入假数据后立即获取自增ID,存储到会话或前端隐藏字段:
$exec_tu = mysqli_query($conn,$query_ru); if($exec_tu){ // 获取刚插入的假数据ID $dummy_id = mysqli_insert_id($conn); // 存储到会话 $_SESSION['current_dummy_id'] = $dummy_id; }
- 取消按钮使用会话中存储的ID,确保删除目标唯一:
$hidden_id = $_SESSION['current_dummy_id'] ?? ''; echo "<a href='deleteDummy.php?id=$hidden_id'><button type='button' class='btn btn-danger'>Cancel</button></a>";
- 在
deleteDummy.php中严格按ID删除,同时增加假数据标识判断防止误删:
$dummy_id = $_GET['id'] ?? ''; if($dummy_id){ $query = "DELETE FROM payments WHERE id = '$dummy_id' AND remarks = 'dummyvalue'"; mysqli_query($conn,$query); unset($_SESSION['current_dummy_id']); }
3. 解决刷新后假数据残留问题
- 表单提交成功后,立即清理会话中的假数据ID,并将对应的假数据标记为已完成(或直接删除)
- 增加定时清理机制,通过MySQL事件定期删除过期的假数据:
-- 创建每天清理24小时前假数据的事件 CREATE EVENT clean_dummy_payments ON SCHEDULE EVERY 1 DAY DO DELETE FROM payments WHERE remarks = 'dummyvalue' AND TIMESTAMPDIFF(HOUR, timings, NOW()) > 24;
- 页面加载时检查会话中是否存在未处理的假数据ID,若存在则提示用户或自动清理
内容的提问来源于stack exchange,提问作者Taha maqsood
相关产品推荐
相关产品推荐

