c# - 如何通过 Unity 访问服务器上的 PHP 文件以进行 MySQL 数据库操作?

标签 c# php mysql unity3d ssl

我目前正在为在线 Unity 游戏开发登录系统。我的目标是在我的服务器上建立一个数据库并检查用户是否已注册。 我跟着这个tutorial ,如果您需要比所提供的更多的背景信息。

我的服务器上有一个 PHP 脚本和一个数据库。 PHP 脚本位于我的 Web 服务器的默认文件夹下 (purplepandagames.com/httpdocs/auth.php)。

$hostname = "<localhost:3306>";
$username = "<username>";
$dbname = "<dbName>";
$password = "<password>";

mysql_connect($hostname, $username, $password) OR DIE ("Unable to connect to database! Please try again later.");
mysql_select_db($dbname);

为了连接到服务器,我在我的 PHP 脚本中使用了这些值。本地主机是否正确?或者主机名是 purplepandagames.com?该数据库附加到 purplepandagams.com。

在 Unity 中,我有一个名为 AuthManager 的脚本,用于处理连接。以下是 C# 脚本的某些部分可能是错误的:

string authphpurl = "https://purplepandagames.com/auth.php";    //enter the complete URL for auth.php

    IEnumerator PostDataForLogin()
    {     
        WWWForm form = new WWWForm();
        form.AddField("email", emailText.text);
        form.AddField("pwd", passwordText.text);

        var url = authphpurl + "?action=login";

        UnityWebRequest www = UnityWebRequest.Post(url, form);

        yield return www.SendWebRequest();

        Debug.Log("Response:" + www.downloadHandler.text);

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
            responseText.text = www.error;
        }
        else
        {

            Debug.Log("Form upload complete!");

            JSONNode jsonNode = SimpleJSON.JSON.Parse(www.downloadHandler.text);
            Debug.Log("success : " + jsonNode["success"]);
            Debug.Log("message : " + jsonNode["msg"]);


            responseText.text = jsonNode["msg"];
        }
     }

对于 simpleJSON,我使用 this .

如果我像这样运行代码,就会出现错误消息 HTTP/1.1 500 Internal Server Error。如果我将 authphpurl 更改为仅 https://purplepandagames.com ,没有反馈,Debug.Log("Response:"+ www.downloadHandler.text); 语句只输出 index.html 文件。

该网站有 SSL 认证,这可能是个问题。

一般来说,这样解决这个问题是不是一个好主意?我会在上传到数据库之前加密密码。但目前我不明白是什么阻止了其他人也能够操纵这个数据库。

最佳答案

正如您在评论中指出的那样,您使用的是 PHP 版本 7.2.19,并且使用的代码有点旧。该代码使用 mysql_ 函数,这些函数在 PHP 5.5.0 版中已弃用并在 PHP 7 中删除。

我尝试更改该代码,它在我的电脑(PHP 7.3、MySQL)上运行,因此它也应该在您的服务器上运行。

请使用此代码重新创建您的表(如果可能),因为出于某种原因,您发送的教程不使用自动递增,而且数据插入的位置非常小(密码为 varchar(20)?)

我还添加了 mysqli_real_escape_string 以防止 SQL 注入(inject)。 我已将 sha256 添加到您的密码中,因为您不想将它们保存为纯文本。

SQL 表创建:

CREATE TABLE `users` (
    id bigint auto_increment primary key,
    email varchar(256) not null,
    pwd   varchar(256) not null,
    constraint users_so_email_uindex
    unique (email)
);

和 PHP 代码

<?php

//These variable values need to be changed by you before deploying
//Variables for connecting to your database.
//These variable values come from your hosting account.
$hostname = "your_server";
$username = "username";
$password = "password";
$dbname = "database_name";


//Connect to your database
$db = mysqli_connect($hostname, $username, $password, $dbname) OR DIE ("Unable to connect to database! Please try again later.");

function login($db){
    // Escape string and prevent possible SQL injection
    $email = $_POST['email'];
    $pwd = $_POST['pwd'];

    // Prepare SQL statement
    $statement = $db->prepare("SELECT * FROM `users` WHERE `email`=?);
    $statement->bind_param("s", $email);
    $statement->execute();
    $row = mysqli_fetch_assoc($result);

    if($result->num_rows > 0){
       $hashed_pwd = $row['pwd'];
     }

    if(password_verify($pwd, $hashed_pwd)){
        echo 'User verified successfully!';
    }

    // Close SQL Statement
    $statement->close();

    echo '{"success":false,"msg":"Email and/or Password Invalid"}';
}

function register($db){

    // Escape string and prevent possible SQL injection
    $email = $_POST['email'];
    $pwd =  password_hash($_POST['pwd'], PASSWORD_DEFAULT);

    // Prepare SQL statement for check existing user
    $statement = $db->prepare("SELECT * FROM `users` WHERE `email`=?");
    $statement->bind_param("s", $email);
    $statement->execute();

    // Get result
    $results = $statement->get_result();

    // User already exists
    if($results && $results->num_rows > 0) {
        echo '{"success":false,"msg":"Users Exists"}';
        $statement->close();
        return;
    }

    // Close statement for check existing user
    $statement->close();

    // Prepare SQL statement for insertion
    $statement = $db->prepare("INSERT INTO `users` (email, pwd) VALUES (?, ?)");
    $statement->bind_param("ss", $email, $pwd);

    // Execute insert statement
    if($statement->execute()) {
        echo '{"success":true,"msg":"User registered successfully"}';

        $statement->close();
        return;
    }

    // Something went wrong and user was not registered
    echo '{"success":false,"msg":"Unable to register user"}';
}

function forgot($db){
    echo '{"success":false,"msg":"Feature not yet implemented"}';
}

$action = null;

if (isset($_GET['action'])) {
    $action = $_GET['action'];
}

if ($action == "login") {
    login($db);
} elseif ($action == "register") {
    register($db);
} elseif ($action == "forgot") {
    forgot($db);
}

$db->close();

exit();

**编辑:**正如评论中所建议的那样,我已经编辑了代码以与 SQL 语句一起使用 - 感谢不道德

var url = authphpurl + "?action=login";

List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("email=" + emailText.text + "&pwd=" + passwordText.text));

UnityWebRequest www = UnityWebRequest.Post(url, formData);
yield return www.SendWebRequest();

相同的片段可用于注册

编辑: PHP 工作,现在是 UNITY。我没有一次统一工作,但是当我在寻找解决方案时(表单数据未发送到 PHP),我看到了这个解决方案。它可能会有所帮助。来源:https://docs.unity3d.com/Manual//UnityWebRequest-SendingForm.html

关于c# - 如何通过 Unity 访问服务器上的 PHP 文件以进行 MySQL 数据库操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636603/

相关文章:

c# - 从 MySQL Select 向 C# 列表添加多列

c# - 使用 GetSaveFileName 创建 SaveFileDialog 时如何停止覆盖提示

php - mysql中过滤字段后缀

php - jQuery.post 回调数据为空

PHP/MySQL : Replace multiple queries

php - symfony 2 验证超过 10 个长度值的表格 bigint?

c# - CopyToAsync 与 ReadAsStreamAsync 的巨大请求负载

c# - AddRedirectToHttps() 不会重定向到 Https

php - preg_replace() 找不到结束分隔符?

mysql - 使用 Scala 解析 AWS Glue 中的 MySQL 0000-00-00 日期格式