Unity中PHP Session处理方法及MySQL玩家分数存储失败求助
解决方案:Unity与PHP/MySQL交互问题
让我来帮你解决这两个Unity和PHP/MySQL交互的问题,一步步拆解分析:
一、Unity中处理PHP Session的正确方式
PHP的Session是基于Cookie实现的,Unity的网络请求默认会自动维护Cookie容器,所以只要你完成了首次用户验证(比如登录接口),后续请求会自动带上Session ID,无需手动传递:
- 第一步:先通过Unity调用登录接口,PHP在验证用户合法性后设置
$_SESSION['userGameId'],此时Unity的请求会自动保存服务器返回的Session Cookie - 第二步:后续的分数更新等请求,直接发起即可,Unity会自动把Session Cookie附加到请求头中,PHP就能正常读取
$_SESSION变量 - 注意:如果是跨域场景需要配置PHP的CORS规则;使用
UnityWebRequest时,若需要严格的Session传递,可以设置www.withCredentials = true
二、分数存储失败的代码错误修复
你的代码存在几个关键错误,我会逐一指出并给出修正方案:
PHP代码的问题与修正
原PHP代码有未执行SQL、变量定义错误、SQL注入风险等问题,修正后的代码(使用mysqli预处理语句,更安全):
<?php session_start(); // 先校验必要参数和Session是否存在 if (!isset($_SESSION['userGameId']) || !isset($_GET['playerscore'])) { echo "Error: Missing parameters or user not logged in"; exit; } $userId = $_SESSION['userGameId']; $playerScore = $_GET['playerscore']; // 建立数据库连接(替换为你的数据库账号密码) $conn = new mysqli('localhost', 'db_username', 'db_password', 'your_database_name'); if ($conn->connect_error) { die("Database connection failed: " . $conn->connect_error); } // 使用预处理语句防止SQL注入 $stmt = $conn->prepare("UPDATE users SET Score = ? WHERE userid = ?"); // 绑定参数:s代表字符串,i代表整数(根据你的数据库字段类型调整) $stmt->bind_param("si", $playerScore, $userId); // 执行语句并返回结果 if ($stmt->execute()) { echo "Score updated successfully"; } else { echo "Update failed: " . $stmt->error; } // 关闭资源 $stmt->close(); $conn->close(); ?>
C#脚本的问题与修正
原C#脚本存在拼写错误、变量误用、使用过时API的问题,修正后的代码(使用Unity官方推荐的UnityWebRequest):
using UnityEngine; using UnityEngine.Networking; public class ScoreUploader : MonoBehaviour { public void InsertScore(int scoreVar) { string requestUrl = $"http://localhost/unity/stage/objectif.php?playerscore={scoreVar}"; // 用协程发起异步请求,避免阻塞主线程 StartCoroutine(SendScoreRequest(requestUrl)); } IEnumerator SendScoreRequest(string url) { using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { // 本地测试可绕过证书验证,正式环境请删除这一行 webRequest.certificateHandler = new BypassLocalCertificate(); yield return webRequest.SendWebRequest(); // 处理请求结果 if (webRequest.result != UnityWebRequest.Result.Success) { Debug.LogError($"Score upload failed: {webRequest.error}"); } else { Debug.Log($"Score sent! Server response: {webRequest.downloadHandler.text}"); } } } // 本地测试用的证书绕过类,正式环境移除 private class BypassLocalCertificate : CertificateHandler { protected override bool ValidateCertificate(byte[] certificateData) { return true; } } }
额外注意事项
- 确保数据库中
users表的userid和Score字段类型与代码匹配(比如userid是整数类型,Score是整数或浮点数) - 测试时可以直接在浏览器中访问请求URL,带上参数和有效Session,查看PHP返回的错误信息,快速定位问题
- 正式环境一定要关闭PHP的错误显示,避免泄露敏感信息
内容的提问来源于stack exchange,提问作者yuzef
相关产品推荐
相关产品推荐

