如何从Unity连接到数据库

如何从Unity连接到数据库,第1张

如何从Unity连接到数据库

请忽略此方法的任何安全风险

不要这样做安全性是在安全保护之前还是之后都没有关系。您将结束重新编写整个代码的过程,因为 密码 在您的应用程序中进行了硬编码,可以
很容易地 反编译和检索。现在以正确的方式进行连接,这样您就不必重新编写整个应用程序。

使用php,perl或您喜欢的任何语言在服务器上运行数据库命令,但这应该在服务器上完成。

在Unity中,使用

WWW
UnityWebRequest
类与该脚本进行通信,然后就可以从Unity向服务器发送和接收信息。有很多例子了那里。即使这样,您仍然需要实现自己的安全性,但这比您现在拥有的要好得多。

您还可以使用json接收多个数据。

下面是一个完整的例子这个统一维基。它显示了如何使用服务器端的php和客户端的Unity
+ C#与Unity中的数据库进行交互。

服务器端

用PDO添加分数

<?php        // Configuration        $hostname = 'localhot';        $username = 'yourusername';        $password = 'yourpassword';        $database = 'yourdatabase';        $secretKey = "mySecretKey"; // Change this value to match the value stored in the client javascript below        try { $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);        } catch(PDOException $e) { echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';        }        $realHash = md5($_GET['name'] . $_GET['score'] . $secretKey);         if($realHash == $hash) {  $sth = $dbh->prepare('INSERT INTO scores VALUES (null, :name, :score)'); try {     $sth->execute($_GET); } catch(Exception $e) {     echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>'; }        } ?>

使用PDO检索得分

<?php    // Configuration    $hostname = 'localhost';    $username = 'yourusername';    $password = 'yourpassword';    $database = 'yourdatabase';    try {        $dbh = new PDO('mysql:host='. $hostname .';dbname='. $database, $username, $password);    } catch(PDOException $e) {        echo '<h1>An error has occurred.</h1><pre>', $e->getMessage() ,'</pre>';    }    $sth = $dbh->query('SELECt * FROM scores ORDER BY score DESC LIMIT 5');    $sth->setFetchMode(PDO::FETCH_ASSOC);    $result = $sth->fetchAll();    if(count($result) > 0) {        foreach($result as $r) { echo $r['name'], "t", $r['score'], "n";        }    }?>

在服务器上启用跨域策略

该文件应命名为“ crossdomain.xml”,并放置在Web服务器的根目录中。Unity要求您要通过WWW请求访问的网站具有跨域策略。

<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*"/></cross-domain-policy>

客户/统一端

来自Unity的客户端代码连接到服务器,与PDO交互,并根据调用的函数添加或检索分数。对该客户端代码进行了少许修改,以使用最新的Unity版本进行编译。

private string secretKey = "mySecretKey"; // Edit this value and make sure it's the same as the one stored on the serverpublic string addScoreURL = "http://localhost/unity_test/addscore.php?"; //be sure to add a ? to your urlpublic string highscoreURL = "http://localhost/unity_test/display.php";//Text to display the result onpublic Text statusText;void Start(){    StartCoroutine(GetScores());}// remember to use StartCoroutine when calling this function!IEnumerator PostScores(string name, int score){    //This connects to a server side php script that will add the name and score to a MySQL DB.    // Supply it with a string representing the players name and the players score.    string hash = Md5Sum(name + score + secretKey);    string post_url = addScoreURL + "name=" + WWW.EscapeURL(name) + "&score=" + score + "&hash=" + hash;    // Post the URL to the site and create a download object to get the result.    WWW hs_post = new WWW(post_url);    yield return hs_post; // Wait until the download is done    if (hs_post.error != null)    {        print("There was an error posting the high score: " + hs_post.error);    }}// Get the scores from the MySQL DB to display in a GUIText.// remember to use StartCoroutine when calling this function!IEnumerator GetScores(){    statusText.text = "Loading Scores";    WWW hs_get = new WWW(highscoreURL);    yield return hs_get;    if (hs_get.error != null)    {        print("There was an error getting the high score: " + hs_get.error);    }    else    {        statusText.text = hs_get.text; // this is a GUIText that will display the scores in game.    }}public string Md5Sum(string strToEncrypt){    System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();    byte[] bytes = ue.GetBytes(strToEncrypt);    // encrypt bytes    System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();    byte[] hashBytes = md5.ComputeHash(bytes);    // Convert the encrypted bytes back to a string (base 16)    string hashString = "";    for (int i = 0; i < hashBytes.Length; i++)    {        hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');    }    return hashString.PadLeft(32, '0');}

这只是有关如何正确执行此 *** 作的示例。如果您需要实现会话功能并关心安全性,请查看 OAuth 2.0 协议。应该有现有的库可以帮助您开始使用
OAuth 协议。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5559829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存