PHP接收AJAX POST请求时,如何高效转换小驼峰字段为MySQL下划线字段?
小驼峰参数名转MySQL下划线字段名的高效方案
问题场景
通过jQuery AJAX向PHP发送POST请求时,AJAX参数采用小驼峰命名(如firstName),但MySQL表字段使用下划线命名(如first_name),当前需逐个手动转换字段名,寻求更高效的批量转换方案。
AJAX请求代码
$("#addUser").on('click', '.btnAddSubmitFormModal', function() { $.post("add.php", { firstName: $("#modalFormAddFirstName").val(), lastName: $("#modalFormAddLastName").val(), middleName: $("#modalFormAddMiddleName").val(), }) .done(function (result, status, xhr) { // 业务处理逻辑 }); });
PHP原插入代码
$keys = array(); $values = array(); foreach ($_POST as $column) { $value = trim($_POST[$column]); $value = mysql_real_escape_string($value); $keys[] = "`{$column}`"; $values[] = "'{$value}'"; } $query = "INSERT INTO 'table' (" . implode(",", $keys) . ") VALUES (" . implode(",", $values) . ");";
当前手动转换方式
$_POST['first_name'] = $_POST['firstName']; unset($_POST['firstName']); // 其他字段重复执行上述操作
高效转换方案
1. 正则批量转换字段名
利用PHP正则匹配大写字母,批量将小驼峰转为下划线命名:
$convertedPost = []; foreach ($_POST as $key => $value) { // 把大写字母替换为"_+小写字母",再转全小写 $newKey = strtolower(preg_replace('/([A-Z])/', '_$1', $key)); $convertedPost[$newKey] = trim($value); } // 后续操作直接使用$convertedPost替代原$_POST
2. 封装可复用的转换函数
如果需要在多处复用转换逻辑,可以封装成独立函数:
function camelToSnake(string $str): string { return strtolower(preg_replace('/([A-Z])/', '_$1', $str)); } // 批量转换整个POST数组 $convertedPost = []; foreach ($_POST as $key => $value) { $convertedPost[camelToSnake($key)] = trim($value); }
3. 优化插入代码(同时规避SQL注入)
注意:mysql_real_escape_string已被PHP废弃,建议改用mysqli或PDO的预处理语句,彻底避免SQL注入风险。以下是基于mysqli的优化实现:
// 先完成字段名转换 $convertedPost = []; foreach ($_POST as $key => $value) { $newKey = strtolower(preg_replace('/([A-Z])/', '_$1', $key)); $convertedPost[$newKey] = trim($value); } // 使用mysqli预处理语句执行插入 $mysqli = new mysqli('localhost', '用户名', '密码', '数据库名'); $columns = implode(', ', array_map(fn($col) => "`{$col}`", array_keys($convertedPost))); $placeholders = implode(', ', array_fill(0, count($convertedPost), '?')); $query = "INSERT INTO `table` ({$columns}) VALUES ({$placeholders})"; $stmt = $mysqli->prepare($query); // 绑定参数(这里假设所有字段都是字符串类型,可根据实际调整类型标识) $types = str_repeat('s', count($convertedPost)); $stmt->bind_param($types, ...array_values($convertedPost)); $stmt->execute();
内容的提问来源于stack exchange,提问作者Aaron Magpantay
相关产品推荐
相关产品推荐

