使用AJAX与Sweet Alert 2的PHP表单无法向MySQL数据库提交数据,排查后发现主键重复约束错误
解决表单数据无法写入MySQL的问题(主键重复错误)
嘿,看你调试出来的错误信息,问题根源很明确啦——这是数据库主键的完整性约束冲突!错误提示里的Duplicate entry '0' for key 'PRIMARY'说明你的users表的主键字段没有设置自动递增(AUTO_INCREMENT),导致每次插入新记录时,主键值默认都是0,重复触发了主键的唯一约束限制,所以数据写不进去。
接下来一步步解决问题:
1. 修复数据库表结构(核心步骤)
你需要给users表的主键字段(通常是id列,如果你的主键列名不同,替换成实际名称)加上AUTO_INCREMENT属性,这样数据库会自动为每条新记录生成唯一的主键值。
方法一:用phpMyAdmin操作
- 登录phpMyAdmin,找到你的数据库和
users表 - 点击「结构」标签,找到主键列(左侧有🔑图标的列)
- 点击该列的「编辑」按钮,勾选「自动递增」选项,然后保存
方法二:执行SQL语句
如果习惯用SQL命令,直接在phpMyAdmin的「SQL」标签里执行:
ALTER TABLE users MODIFY COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
(注意:把id替换成你users表实际的主键列名)
2. 完善PHP处理逻辑的错误捕获
你的config.php已经开启了PDO的异常模式,但process.php没有捕获异常,导致错误直接抛出,不利于调试。可以给process.php加上try-catch块,方便定位问题:
<?php require_once('config.php'); if(isset($_POST)){ try { // 处理防机器人字段,用??避免未定义索引错误 $stickySweet = $_POST['username'] ?? ''; $firstname = $_POST['firstname']; $lastname = $_POST['lastname']; $email = $_POST['email']; $tel = $_POST['tel']; $sql = "INSERT INTO users (`firstname`, `lastname`, `email`, `tel`) VALUES (?,?,?,?)"; $stmtinsert = $db->prepare($sql); $result = $stmtinsert->execute([$firstname, $lastname, $email, $tel]); if($result) { echo 'You have successfully registered. Someone from Zitalk will be in touch with you shortly.'; } elseif(! empty($stickySweet)) { // 防机器人逻辑,这里可以返回提示或者直接终止 echo 'Bot detected'; } else { echo 'Something went wrong'; } } catch(PDOException $e) { // 调试阶段输出错误信息,上线后可以改成写入日志 echo 'Database Error: ' . $e->getMessage(); http_response_code(500); // 发送500状态码,让AJAX触发error回调 } } else { echo 'No data'; }
3. 调整AJAX的重定向逻辑
你现在的重定向是在AJAX调用后立即设置的,不管插入是否成功都会跳转。应该把重定向移到AJAX的success回调里,只有当数据成功写入后才跳转:
$(function() { $('#register').click(function(e){ let valid = this.form.checkValidity(); if(valid) { let firstname = $('#firstname').val(); let lastname = $('#lastname').val(); let email = $('#email').val(); let tel = $('#tel').val(); e.preventDefault(); $.ajax({ type: 'POST', url: 'process.php', data: { firstname: firstname, lastname: lastname, email: email, tel: tel }, success: function(data) { Swal.fire({ 'title': 'THANK YOU!', 'text': data, 'icon': 'success' }); // 成功后才执行跳转 window.setTimeout(function() { window.location.href = 'thank-you-for-enrolling.php'; }, 5000); }, error: function(xhr) { Swal.fire({ 'title': 'Something Went Wrong!', 'text': xhr.responseText || 'Something Went Wrong. Please contact us and we will help you resolve this.', 'icon': 'error' }); } }); } else { console.log("Validation failed"); } }); });
做完这些修改后,再测试表单提交,应该就能正常把数据写入数据库,并且显示正确的提示和跳转了。
内容的提问来源于stack exchange,提问作者Erik James Robles
相关产品推荐
相关产品推荐

