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

提交表单数据至数据库后保持表单不关闭的实现方法

解决方案:异步提交表单以保持当前表单状态

核心问题在于你当前用了页面跳转的方式提交数据,刷新后原来打开的表单会因为页面重置而关闭。要解决这个问题,我们可以改用AJAX异步提交,让数据在后台发送,页面不刷新,从而保持当前表单的显示状态。

下面是具体的实现步骤:

1. 修改前端表单,移除跳转相关属性

首先,给所有表单添加一个统一的类(比如dynamic-form),方便我们用JS统一监听提交事件;同时移除表单的action属性和onsubmit的跳转逻辑(如果需要保留表单验证,可以把验证逻辑移到JS里):

<!-- 卫生产品新增表单 -->
<section class="hide-section" id="produto_1">
  <form id="form3" class="dynamic-form" method="POST">
    <!-- 表单原有内容不变 -->
    <button type="submit" name="submit" class="botao submit">Registo</button>
  </form>
</section>

<!-- 卫生产品入库表单 -->
<section class="hide-section" id="produto_2">
  <form name="form4" class="dynamic-form" method="POST">
    <!-- 表单原有内容不变 -->
    <button type="submit" name="submit1" class="botao submit">Registo</button>
  </form>
</section>

<!-- 营养产品新增表单 -->
<section class="hide-section" id="produto_3">
  <form id="form3" name="form3" class="dynamic-form" method="POST">
    <!-- 表单原有内容不变 -->
    <button type="submit" name="submit2" class="botao submit">Registo</button>
  </form>
</section>

2. 编写AJAX提交的JavaScript代码

添加一段JS,监听所有表单的提交事件,用Fetch API异步发送数据,同时阻止默认的页面跳转:

// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
  // 监听所有带dynamic-form类的表单
  document.querySelectorAll('.dynamic-form').forEach(form => {
    form.addEventListener('submit', async function(e) {
      e.preventDefault(); // 阻止默认表单提交跳转

      // 可选:保留原有的表单验证逻辑
      if (!form_validation()) {
        alert('Por favor, preencha todos os campos obrigatórios!');
        return;
      }

      // 收集表单数据
      const formData = new FormData(this);

      try {
        // 发送POST请求到teste2
        const response = await fetch('./teste2', {
          method: 'POST',
          body: formData
        });

        // 解析后台返回的JSON响应
        const result = await response.json();

        if (result.success) {
          alert('Dados registados com sucesso!');
          this.reset(); // 可选:提交成功后重置表单内容
          // 页面没有刷新,当前打开的表单会自动保持显示状态
        } else {
          alert('Erro ao registar: ' + result.message);
        }
      } catch (error) {
        alert('Erro na conexão: ' + error.message);
      }
    });
  });
});

3. 修改teste2页面,返回JSON响应而非跳转

原来的teste2页面用JS跳转回test1,现在我们需要改成返回JSON格式的结果,告诉前端提交是否成功:

<?php
// 假设你的数据库连接是$conn,确保已正确初始化

// 初始化响应数据
$response = [
  'success' => false,
  'message' => 'Ação não reconhecida'
];

// 处理卫生产品新增
if (isset($_POST['submit'])) {
  // 用预处理语句防止SQL注入!非常重要
  $sql = "INSERT INTO ProdHigieneteste (DescricaoProd, DescricaoUnid) VALUES (?, ?)";
  $stmt = $conn->prepare($sql);
  $stmt->bind_param("ss", $_POST['DescricaoProd'], $_POST['DescricaoUnid']);

  if ($stmt->execute()) {
    $response['success'] = true;
    $response['message'] = 'Produto de higiene adicionado com sucesso';
  } else {
    $response['message'] = 'Erro na base de dados: ' . $conn->error;
  }
}

// 处理卫生产品入库
elseif (isset($_POST['submit1'])) {
  $sql = "INSERT INTO 你的入库表名 (DataEntrada, IDProd, DescricaoUnid, Quantidade, Preco) VALUES (?, ?, ?, ?, ?)";
  $stmt = $conn->prepare($sql);
  // 根据你的数据库字段类型调整参数类型(s=字符串, i=整数, d=小数)
  $stmt->bind_param("sisi d", $_POST['DataEntrada'], $_POST['Produto'], $_POST['Unid'], $_POST['Quantidade'], $_POST['Preco']);

  if ($stmt->execute()) {
    $response['success'] = true;
    $response['message'] = 'Entrada de produto registada com sucesso';
  } else {
    $response['message'] = 'Erro na base de dados: ' . $conn->error;
  }
}

// 处理营养产品新增
elseif (isset($_POST['submit2'])) {
  $sql = "INSERT INTO 你的营养产品表名 (ProdNutricia) VALUES (?)";
  $stmt = $conn->prepare($sql);
  $stmt->bind_param("s", $_POST['ProdNutricia']);

  if ($stmt->execute()) {
    $response['success'] = true;
    $response['message'] = 'Produto nutricional adicionado com sucesso';
  } else {
    $response['message'] = 'Erro na base de dados: ' . $conn->error;
  }
}

// 设置响应头为JSON
header('Content-Type: application/json');
// 返回JSON数据
echo json_encode($response);
?>

关键注意事项

  • 防止SQL注入:一定要用预处理语句(prepare + bind_param),不要直接把用户输入拼到SQL语句里,避免安全风险。
  • 表单验证:如果你原来的form_validation()函数有验证逻辑,要确保它在AJAX提交前执行,避免无效数据提交到后台。
  • 错误处理:代码里加入了基本的错误提示,你可以根据需求改成更友好的提示(比如用页面内的提示框代替alert)。

这样修改后,表单提交时页面不会刷新,当前打开的表单会保持显示状态,同时数据也能成功插入数据库。

内容的提问来源于stack exchange,提问作者Bruno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:45:26