Postman POST请求仅x-www-form-urlencoded可传参?求解析格式差异
问题原因与两种POST格式差异解析
一、两种POST格式的核心差异
x-www-form-urlencoded:
这是HTML表单默认的编码方式,所有表单数据会被拼接成key1=value1&key2=value2的字符串,特殊字符会做URL编码(比如空格转+,中文转%E4%B8%AD%E6%96%87)。PHP会自动将这种格式的请求体解析到$_POST数组,不需要额外处理。multipart/form-data:
专为文件上传设计的编码格式,请求体被分割成多个独立的"数据块",每个块对应一个表单字段(或文件),块之间用自定义的边界字符串分隔,每个块还会附带Content-Disposition头指定字段名。PHP默认会把普通字段解析到$_POST,文件解析到$_FILES,但有个前提:脚本没有提前读取php://input流。
二、form-data无法获取参数的可能原因
从你的代码来看,最可能的问题出在require ("../private/index.php")引入的文件里:
如果这个文件中存在file_get_contents('php://input')这类读取请求体的代码,PHP将无法自动解析multipart/form-data格式的请求到$_POST数组(但x-www-form-urlencoded因为PHP会提前完成解析,所以不受影响)。
另外也可以排查Postman的设置:
- 确认form-data里的字段名和代码中
$_POST引用的完全一致(比如staff_ID的大小写不能错); - 普通字段要选择
Text类型,不要误选成File。
三、重要安全提醒
你的SQL语句存在严重的SQL注入风险,直接把用户输入的变量拼到SQL里会导致攻击者篡改数据库操作。必须改用预处理语句,示例如下:
// 替换原SQL执行逻辑 $stmt = $mysqli->prepare("INSERT INTO `users_nx`(`staff_ID`,`password`,`email`,`Name`,`Surname`,`Role`) VALUES (?,?,?,?,?,?)"); // 绑定参数(s代表字符串类型,可根据字段实际类型调整) $stmt->bind_param("ssssss", $staff, $pass, $email, $name, $surname, $role); // 执行并判断结果 if ($stmt->execute()) { echo resultOperations(true, $mysqli); } else { echo resultOperations(false, $mysqli); } // 关闭语句 $stmt->close();
内容的提问来源于stack exchange,提问作者Damiano Miazzi
相关产品推荐
相关产品推荐

