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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:18:10