通过JavaScript和PHP在WordPress数据库存整数高分遇500错误
问题排查与解决方案
核心问题1:PHP文件未加载WordPress环境
你的update-score.php直接被AJAX请求时,没有初始化WordPress核心环境,导致$wpdb全局变量根本不存在,这是触发500错误的主要原因。
核心问题2:SQL语法错误
你写的SQL语句里用单引号'包裹表名和字段名,MySQL中应该用反引号`(或无需包裹),单引号仅用于包裹字符串值,这会直接导致SQL执行失败。
修正后的完整代码
1. JavaScript代码(优化URL与请求标识)
function submitScore() { jQuery.ajax({ url: '/wp-content/plugins/dinosaur-game/update-score.php', type: "POST", data: { score: this.highestScore, action: 'update_game_score' // 用于验证请求合法性 }, success: function(res) { console.log('分数更新结果:', res); }, error: function(xhr) { console.log('更新失败,状态码:', xhr.status); } }); }
2. PHP代码(加载WordPress环境+安全更新)
<?php // 加载WordPress核心,确保$wpdb可用,路径根据文件位置调整 require_once('../../../../wp-load.php'); // 验证请求合法性,防止非法调用 if (!isset($_POST['action']) || $_POST['action'] !== 'update_game_score') { wp_send_json_error('非法请求'); exit; } global $wpdb; // 过滤并验证分数,确保为有效正整数 $new_score = isset($_POST['score']) ? (int)$_POST['score'] : 0; if ($new_score <= 0) { wp_send_json_error('无效分数'); exit; } // 使用WordPress内置表名常量,适配不同数据库前缀 $table_name = $wpdb->users; $data = array('game_score' => $new_score); $where = array('ID' => 5); // 指定字段类型,保证数据安全 $format = array('%d'); $where_format = array('%d'); // 用wpdb内置update方法,自动处理SQL转义 $result = $wpdb->update($table_name, $data, $where, $format, $where_format); if ($result !== false) { wp_send_json_success('分数更新成功'); } else { wp_send_json_error('数据库更新失败'); } ?>
额外说明
- 引入
wp-load.php是为了初始化WordPress所有核心组件,包括数据库连接,这样$wpdb才能正常工作,路径需根据你的PHP文件实际位置调整。 - 用
$wpdb->users代替硬编码wp_users,适配不同站点的数据库前缀,避免兼容性问题。 - 加入请求验证和数据过滤,既防止非法请求,也避免恶意数据注入数据库。
- 用
wp_send_json_success/error返回标准化JSON响应,方便JS端处理结果。
内容的提问来源于stack exchange,提问作者AgataUrsula
相关产品推荐
相关产品推荐

