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

WordPress中AJAX向PHP传数据时出现500内部服务器错误

解决WordPress中AJAX表单提交500内部服务器错误的问题

我来帮你一步步排查这个500错误的问题,结合WordPress的特性和你的代码情况,主要有几个关键问题需要修正:

1. 必须遵循WordPress的AJAX规范

WordPress有一套自己的AJAX处理机制,不能直接指向自定义的inserir页面,这大概率是导致500错误的核心原因。你需要改用WordPress官方提供的admin-ajax.php来处理请求:

修改后的AJAX代码

<script type="text/javascript">
$(".btn_contact").click(function () {
    $.ajax({
        type: "POST",
        // 指向WordPress的AJAX处理入口
        url: "<?php echo admin_url('admin-ajax.php'); ?>",
        // 新增action参数,用来标识要触发的PHP处理函数
        data: $("#feedback_form").serialize() + "&action=submit_product_form",
        success: function (data) {
            if ($.trim(data) == 'true') {
                $("#feedback_form").find('input').val('');
                $(".success_messages").removeClass('hide');
            } else {
                $(".error_message").removeClass('hide');
            }
        },
        // 新增错误回调,方便在控制台查看服务器返回的具体错误信息
        error: function(xhr, status, error) {
            console.log("服务器错误详情:", xhr.responseText);
        }
    });
});
</script>

2. 修复PHP代码中的多处致命问题

你的PHP处理代码存在语法错误、未定义变量和逻辑问题,即使路径正确也会触发500错误,下面是修正后的版本(要把这段代码放到你的主题functions.php文件里,或者自定义插件中,不要单独放在外部PHP文件):

修正后的PHP处理逻辑

// 注册AJAX处理函数,分别处理登录/未登录用户的请求
add_action('wp_ajax_submit_product_form', 'submit_product_form_handler');
add_action('wp_ajax_nopriv_submit_product_form', 'submit_product_form_handler');

function submit_product_form_handler() {
    $servername = "xxx.xxx.x.xx";
    $username = "xxxxxx";
    $password = "xxxxxxxxx";
    $dbname = "xxxxxxxx";

    // 先检查数据库连接是否成功
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("数据库连接失败: " . $conn->connect_error);
    }
    $conn->set_charset('utf8');

    $name = isset($_POST["DescricaoProd"]) ? trim($_POST["DescricaoProd"]) : '';
    $unid = isset($_POST["DescricaoUnid"]) ? trim($_POST["DescricaoUnid"]) : '';

    $response = 'false';
    if (!empty($name) && !empty($unid)) {
        // 使用预处理语句,彻底避免SQL注入风险
        $sql = "INSERT INTO ProdHigieneteste (DescricaoProd, DescricaoUnid) VALUES (?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("ss", $name, $unid);
        
        if ($stmt->execute()) {
            // 插入第二个表
            $sql1 = "INSERT INTO StockHigieneteste (DescricaoProd, DescricaoUnid) VALUES (?, ?)";
            $stmt1 = $conn->prepare($sql1);
            $stmt1->bind_param("ss", $name, $unid);
            if ($stmt1->execute()) {
                $response = 'true';
            }
            $stmt1->close();
        }
        $stmt->close();
    }

    echo $response;
    $conn->close();
    // 必须调用wp_die()终止WordPress的后续输出,否则会返回多余内容导致AJAX解析错误
    wp_die();
}

我修复的几个关键问题:

  • 去掉了if ($conn->query($sql) === TRUE);后面的多余分号,这个分号会导致if语句没有执行体,逻辑完全混乱
  • 删除了未定义的$query->num_rows代码,这行代码会直接触发致命错误
  • 添加了数据库连接错误检查,避免连接失败后继续执行后续代码
  • 使用预处理语句替代直接拼接SQL,既安全又避免了特殊字符导致的SQL语法错误
  • 遵循WordPress AJAX的钩子机制,注册了正确的处理函数
  • 添加了wp_die(),确保AJAX响应只返回我们需要的内容

3. 额外排查步骤

如果还是有问题,可以通过以下方式定位具体错误:

  • 开启WordPress调试模式:在wp-config.php中添加以下代码,错误会记录到wp-content/debug.log文件中
    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);
    
  • 检查数据库表名和字段名是否完全正确,比如ProdHigieneteste、StockHigieneteste是否存在,字段拼写是否和数据库一致
  • 确认服务器对主题functions.php文件有读写权限

按照上面的步骤修改后,应该就能解决500错误,成功实现无刷新表单提交并插入数据了。

内容的提问来源于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 10:04:25