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

使用JustValidate、PHPMailer时如何实现表单数据同步写入数据库

实现表单数据入库的调整方案

第一步:提前创建数据库表

先在你的artemdaniluk库中创建存储报名数据的表,执行以下SQL:

CREATE TABLE `applications` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(100) NOT NULL COMMENT '姓名',
  `email` varchar(100) NOT NULL COMMENT '邮箱',
  `phone` varchar(20) NOT NULL COMMENT '手机号',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第二步:调整PHP业务代码

主要优化数据库连接后的插入逻辑,新增参数校验、SQL注入防护,同时调整响应格式方便JS判断状态:

<?php 
// 开启JSON响应格式
header('Content-Type: application/json');
$res = ['code' => 0, 'msg' => '操作成功'];

$connect = mysqli_connect('localhost', 'root', 'root', 'artemdaniluk');
if(!$connect) {
    $res['code'] = 1;
    $res['msg'] = '数据库连接失败:' . mysqli_connect_error();
    echo json_encode($res);
    exit;
}

// 接收并校验参数
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$phone = trim($_POST['phone'] ?? '');
if(empty($name) || empty($email) || empty($phone)) {
    $res['code'] = 2;
    $res['msg'] = '参数不完整';
    echo json_encode($res);
    exit;
}

// 预处理写入数据库,防止SQL注入
$insert_sql = "INSERT INTO applications (name, email, phone) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($connect, $insert_sql);
mysqli_stmt_bind_param($stmt, 'sss', $name, $email, $phone);
$insert_result = mysqli_stmt_execute($stmt);
if(!$insert_result) {
    $res['code'] = 3;
    $res['msg'] = '数据写入失败:' . mysqli_error($connect);
    echo json_encode($res);
    exit;
}
mysqli_stmt_close($stmt);
mysqli_close($connect);

// 原有发邮件逻辑
require_once('phpmailer/PHPMailerAutoload.php');
$mail = new PHPMailer;
$mail->CharSet = 'utf-8';

$mail->isSMTP();
$mail->Host = 'smtp.mail.ru';
$mail->SMTPAuth = true;
$mail->Username = 'artemdaniluk.pme@mail.ru'; 
$mail->Password = 'lrPMMJupiVsDWLdJ8ksj'; 
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
$mail->SMTPKeepAlive = true;

// 给用户发邮件
$mail->setFrom('artemdaniluk.pme@mail.ru'); 
$mail->addAddress($email);
$mail->Subject = 'Заявка на участие в интенсиве Wildberries';
$body = 'large html code here';
$mail->msgHTML($body);
if (!$mail->send()) {
    $res['code'] = 4;
    $res['msg'] = '发送用户邮件失败:' . $mail->ErrorInfo;
    echo json_encode($res);
    exit;
}

// 给管理员发邮件
$mail->clearAddresses();
$mail->addAddress("sparkereddd@gmail.com");
$bodyAdmin = "Пользователь: " . $name . " оставил заявку. Его почта: " . $email . ". Номер телефона: " . $phone;
$mail->msgHTML($bodyAdmin);
if (!$mail->send()) {
    $res['code'] = 5;
    $res['msg'] = '发送管理员邮件失败:' . $mail->ErrorInfo;
    echo json_encode($res);
    exit;
}

echo json_encode($res);
?>

第三步:调整JS提交逻辑

修复原有提交后立即重置表单、关闭弹窗的问题,改为等接口返回成功后再操作:

const validateForms = function (selector, rules, successModal) {
  new window.JustValidate(selector, {
    rules: rules,
    submitHandler: function (form) {
      const formData = new FormData(form);
      const xhr = new XMLHttpRequest();

      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          let resp = {}
          try {
            resp = JSON.parse(xhr.responseText)
          } catch (e) {}
          if (xhr.status === 200 && resp.code === 0) {
            window.open('https://www.artemdaniluk.ru/thank-you.html');
            form.reset();
            closePopup();
            openThanksModal();
          } else {
            thanksText.innerText = resp.msg || `Что-то пошло не так!`;
            openThanksModal();
          }
        }
      }

      xhr.open('POST', 'mail.php', true);
      xhr.send(formData);
    }
  });
}

validateForms('.popup__form', {
  email: {
    required: true,
    email: true
  },
  name: {
    required: true
  },
  tel: {
    required: true
  }
}, '.thanks-popup');

注意事项

  • 生产环境请勿将数据库密码、SMTP授权码直接硬编码在业务代码中,建议单独存到配置文件中并做好权限限制
  • 可根据业务需求增加手机号、邮箱格式的二次后端校验,避免前端校验被绕过
  • 如果需要存储更多表单字段,只需同步在数据库表新增字段,PHP插入逻辑中新增对应参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:15:04