You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:55:16