Unity C#向PHP发送POST请求,PHP端$_POST为空问题求助
我来帮你搞定这个头疼的Unity→PHP POST数据丢失问题!这种情况我碰到过好多次,多半是请求格式或者PHP接收逻辑的问题,咱们一步步排查:
PHP的$_POST只默认解析application/x-www-form-urlencoded或multipart/form-data格式的请求,很多时候Unity端的代码没设置对Content-Type或者数据编码,导致PHP拿不到数据。
推荐用Unity自带的WWWForm来构建请求,它会自动帮你处理格式和编码,示例代码如下:
IEnumerator SendDataToPHP(string targetVariable) { WWWForm form = new WWWForm(); // 这里的"custom_key"要和PHP里$_POST["custom_key"]的键名完全对应 form.AddField("custom_key", targetVariable); using (UnityWebRequest www = UnityWebRequest.Post("你的PHP接口地址", form)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("请求失败:" + www.error); } else { // 打印PHP的返回结果,方便调试 Debug.Log("请求成功,PHP返回:" + www.downloadHandler.text); } } }
如果是手动拼接请求体,一定要记得设置正确的请求头,并对数据做URL编码:
string postData = "custom_key=" + UnityWebRequest.EscapeURL(targetVariable); UnityWebRequest www = UnityWebRequest.Post("你的PHP接口地址", postData); www.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
有时候不是数据没传过来,而是接收方式不对。你可以在PHP代码里加入以下调试代码,直接查看原始请求内容:
// 先获取原始请求体,排查数据是否真的到达服务器 $rawRequest = file_get_contents('php://input'); echo "原始请求内容:" . $rawRequest . "\n"; // 再打印$_POST的完整内容 echo "POST数组内容:"; var_dump($_POST);
如果$rawRequest有内容但$_POST为空,说明Unity发送的是JSON或其他非表单格式的数据,这时候需要用json_decode($rawRequest, true)来解析数据,而不是依赖$_POST。
偶尔服务器配置也会导致POST数据丢失,比如:
post_max_size设置过小,导致数据被截断enable_post_data_reading被禁用,无法解析POST数据
你可以在PHP里输出phpinfo()查看这些配置:
phpinfo();
找到post_max_size确保它大于你发送的数据量,同时确认enable_post_data_reading处于On状态。
你可以用Postman或者curl直接模拟POST请求,测试PHP接口本身是否正常:
curl -X POST -d "custom_key=测试值" 你的PHP接口地址
如果这个测试能让PHP正确输出$_POST内容,那问题肯定出在Unity的请求代码上;如果测试也失败,那就是PHP或服务器的配置问题。
最后提醒下:一定要在Unity里打印PHP的返回结果,这样你能直接看到服务器端的调试信息,比盲目排查高效多了!
内容的提问来源于stack exchange,提问作者Nor Alexanian

