将Unity App连接到mySQL数据库

时间:2017-04-13 02:04:21

标签: c# php mysql database unity3d

所以我在Unity中有这个应用程序,我正在尝试将它连接到我制作并连接到网站的mySQL数据库。我可以通过网站上的表单将内容插入到数据库中。那很有效。

我接下来要做的是连接Unity应用程序,以便它也可以访问数据库中的内容。我在C#和php编码。我希望统一应用程序向网站询问数据库中的某些信息。然后,网站应查看数据库并将一些信息返回到统一应用程序。

这不是一个重复的问题。我已经看过这里的问题,但仍然无法让它发挥作用。现在我的团结应用程序能够向我的网页发送一条消息,我的网页然后正确地回应。 (我知道这不是我谈到的功能,但我现在正在测试)。然而,当我尝试从我的网页上的Unity应用程序中获取响应时,我调试的所有内容都是<html>

您可以访问我的网站:http://historicstructures.org/forms.html

这是我的php代码:

<html> 

<style type="text/css">
    body {background-color:#666666; color: white;}
</style> 
<body>
<h1 align = "center">
<img src="housebackground.jpg" alt="Mountain View" style="width:97%;height:228px;" ></h1>
<h1 align = "center">Submission Status</h1>
<p align = "center">
<?php


//this is the variable that is being recieved from the unity script
$AuthorName = $_POST["Author"];

//here i am printing it out so that it will be sent back to the unity script 
    // i am also echoing it onto the webpage so that i know it is getting the variable 
    //correctly from the unity script
echo $AuthorName;
header("Access-Control-Allow-Origin: *");
print($AuthorName);

//gets all the variables the user inputted to form
$StructureName = $_POST["StructureName"];
$Author = $_POST["Author"];
$YearBuilt = $_POST["YearBuilt"];
$EraBuilt = $_POST["EraBuilt"];
$YearDestroyed = $_POST["YearDestroyed"];
$EraDestroyed = $_POST["EraDestroyed"];
$Latitude = $_POST["Latitude"];
$Longitude = $_POST["Longitude"];
$Structurelink = "no exist yet";

//checks to make sure the information is in the right format
$isValid = true; 
$errCode = 0; 

if ($Latitude<-90 || $Latitude>90){
    $isValid = false;
    $errCode = 1; 

}

if ($Longitude<-180 || $Longitude>180){
    $isValid = false;
    $errCode = 2; 

}

if ($YearBuilt<-400 || $YearBuilt>400){
    $isValid = false;
    $errCode = 3; 

}

 if ($YearDestroyed<-400 || $YearDestroyed>400){
    $isValid = false;
     $errCode = 4; 

}



//if the informationt the user gave was correct, then insert into database
if ($isValid ==true){

    $servername = "localhost";
    $username = "...";
    $password = "...";
    $dbname = "StructureInfo";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 


    $sql = "INSERT INTO info (ID, StructureName, Author, YearBuilt, EraBuilt, YearDestroyed, EraDestroyed, Latitude, Longitude, StructureLink)
    VALUES ('null','$StructureName','$Author','$YearBuilt','$EraBuilt','$YearDestroyed','$EraDestroyed','$Latitude','$Longitude','$Structurelink')";

    if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }


    $conn->close(); 

}


//the user has an error in the information they inputted 
else{
    echo "Your submission was invalid and so it was not submitted. ";

    switch ($errCode) {
    case 1:
        echo "Your latitude is out of bounds.";
        break;
    case 2:
        echo "Your longitude is out of bounds. ";
        break;
    case 3:
        echo "Your year built is out of bounds. ";
        break;
    case 4:
        echo "Your year destroyed is out of bounds. ";
        break;
    default:
        echo "Go back and review your data to make sure it is correct.";
    }
}

?>
</p>

<br><br>
</body>
</html>

这是我的统一代码附加到一个按钮,我不知道在哪里放它所以我的onclick为按钮是这个js的主要:

#pragma strict

function Start () {

}

function Update () {

}

function GetFromDB(){
     var url = "http://historicstructures.org/action_page_post.php";
     var form = new WWWForm();
     form.AddField( "Author", "Jess" );

     var www = new WWW( url, form );

     // wait for request to complete
     yield www;

     // and check for errors
     if (www.error == null)
     {
         Debug.Log(www.text);
     } else {
     // something wrong!
         Debug.Log("WWW Error: "+ www.error);
     }
}

GetFromDB();

1 个答案:

答案 0 :(得分:0)

首先,您的代码是Javascript / Unityscript,但您标记了C#。我认为您应该使用C#,因为它具有比Javascript / Unityscript更多的功能和支持。

  

这是我的统一代码,它附在一个按钮上,我不确定   放在哪里所以我的onclick按钮是这个js的主要

创建一个C#脚本,然后订阅Button的onClick事件。按下按钮时,启动将连接到数据库的协同程序。

public Button button;

void OnEnable()
{
    button.onClick.AddListener(() => { StartCoroutine(GetFromDB()); });
}

void OnDisable()
{
    button.onClick.RemoveAllListeners();
}

IEnumerator GetFromDB()
{
    var url = "http://historicstructures.org/action_page_post.php";
    var form = new WWWForm();
    form.AddField("Author", "Jess");

    WWW www = new WWW(url, form);

    // wait for request to complete
    yield return www;

    // and check for errors
    if (String.IsNullOrEmpty(www.error))
    {
        UnityEngine.Debug.Log(www.text);
    }
    else
    {
        // something wrong!
        UnityEngine.Debug.Log("WWW Error: " + www.error);
    }
}

如果您是C#的新手,this Unity教程应该可以帮助您入门。您可以找到其他 Unity UI 事件样本here

修改

  

然而,当我接着尝试在Unity应用程序中获取响应时   在我的网页上,我调试的所有内容都是<html>

我在原始问题中没有看到<html>。这是因为<html>可以在stackoverflow上用来排列文本。我将您的问题和formatted <html>编辑成了一个代码,以便显示出来。

您的代码没有任何问题。 Unity根本没有显示从服务器收到的所有其他数据,因为代码中有一个新行。只需单击您在编辑器中看到的<html>日志,它就会显示服务器上的所有其他数据。您必须在编辑器中单击该错误才能查看其余数据。

请注意,您当前的脚本会向Unity输出错误:

  

您提交的内容无效,因此未提交。

那是因为你没有填写所需的所有表格。

这应该这样做:

form.AddField("Author", "Jess");
form.AddField("YearDestroyed", "300");
form.AddField("YearBuilt", "300");
form.AddField("Longitude", "170");
form.AddField("Latitude", "60");
form.AddField("StructureName", "IDK");

少数事情

1 。从服务器中删除html代码。如果你想使用POST / GET,那应该不存在。如果你有html代码那么很难提取你的数据。因此,您的代码应仅从<?php开始,以?>

结尾

2 。如果您要从服务器接收多于1个数据,请使用json。

在PHP方面,使用json_encode将您的数据转换为json,使用printecho发送给Unity。 Google json_encode了解更多信息。

在Unity C#端,使用this post中的JsonUtilityJsonHelper来反序列化服务器中的数据。

3 。最后,不是从服务器构建错误消息并从Unity输出到Unity,只需从服务器发送错误代码即可。

在Unity C#端,创建一个将错误代码转换为完整错误消息的类。