You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:16:22