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
相关产品推荐
相关产品推荐

