unity+php+mariaDBでhiscoreの管理.その2

まあ、以下のソース見ればわかると思います。僕のサーバにアクセスするようにしてますが、適時読み違えてください。

githubはここ
zipbはここ

ファイル:sql_choconnect.php

<?php
$chkpdo = new PDO('mysql:host=127.0.0.1;dbname=test905;charset=utf8',getenv(DBUSER),getenv(DBPASS));
if($chkpdo == null){
	echo "0";
} else {
	echo "1";
}
?>

ファイル:sql_connect.php

<?php

function connectDB(){

	try {
		$pdo = new PDO('mysql:host=127.0.0.1;dbname=test905;charset=utf8',getenv(DBUSER),getenv(DBPASS));
	} catch (PDOException $e) {
		exit('' . $e->getMessage());
	}

	 return $pdo;
}

?>

ファイル:sql_getcount.php

<?php

require_once('sql_connect.php');
$pdo = connectDB();
$stmt = $pdo->query("SELECT COUNT(*) FROM hiscore");
echo $stmt->fetchColumn();

?>

ファイル:sql_gethiscore.php

<?php
require_once('sql_connect.php');
$pdo = connectDB();
$stmt = $pdo->query("SELECT * FROM hiscore where score=(select max(score) from hiscore)");
foreach ($stmt as $row) {
	echo $row['name'];
	echo ',';
	echo $row['score'];
	echo ',';
}

?>

ファイル:sql_insert.php

<?php

require_once('sql_connect.php');
$pdo = connectDB();
$n = $_POST['name'];
$s = $_POST['score'];
$stmt = $pdo->query("INSERT INTO hiscore (name,score) VALUES('$n',$s)");
$stmt = $pdo->query("COMMIT");

ファイル:GameManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class GameManager : MonoBehaviour
{
    public string urlChkConnect = "https://www.edge-bp.com/test/test905/sql_chkconnect.php";
    public string urlGetCount = "https://www.edge-bp.com/test/test905/sql_getcount.php";
    public string urlInsert = "https://www.edge-bp.com/test/test905/sql_insert.php";
    public  string urlGetHiscore = "https://www.edge-bp.com/test/test905/sql_gethiscore.php";

    public GameObject goConnect;
    public GameObject goName;
    public GameObject goScore;
    public GameObject goInputName;
    public GameObject goInputScore;

    string[] strConnect = { "接続中","接続成功", "接続失敗"};
    private const string connectNG = "接続失敗";
    private string coStr;

    void Start()
    {
        goConnect.GetComponent().text = strConnect[0];
        StartCoroutine(getCount(urlChkConnect));
    }


    IEnumerator getCount(string url )
    {
        IEnumerator coroutine;
        int num = 0;

        //
        // mariaDBに接続できるか。
        //
        coroutine = getWeb(urlChkConnect,num);
        yield return coroutine;
        // コルーチンからの戻り値をintに変換する
        num = (int)coroutine.Current;
        if (num == -1)
        {
                goConnect.GetComponent().text = strConnect[2];
        }
        else
        {
                if (num != 1)
                {
                    goConnect.GetComponent().text = strConnect[2];
                }
                else
                {
                    goConnect.GetComponent().text = strConnect[1];
                }
        }

        if (goConnect.GetComponent().text != strConnect[1]) yield break;

        //
        // 何人登録されているか
        //
        coroutine = getWeb(urlGetCount,num);
        yield return coroutine;
        // コルーチンからの戻り値をintに変換する
        num = (int)coroutine.Current;
        if (num == 0)
        {
            // 誰も登録されていない場合は、とりあえず一人登録する
            coroutine = setWeb(urlInsert, "kenji", 1);
            yield return coroutine;
        }

        //
        // hiscoreを得る
        //
        coroutine = getWeb(urlGetHiscore);
        yield return coroutine;
        // coStrから、一番最初に見つけたハイスコア(同一得点もあり得るので)をフィールドにセットする
        setFirsthiscore(coStr);
    }

    IEnumerator getWeb(string url,int num)
    {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();
        if (www.isNetworkError)
        {
            num = -1;
            yield return num;
        }
        yield return int.Parse(www.downloadHandler.text);
    }


    IEnumerator getWeb(string url)
    {
        UnityWebRequest www = UnityWebRequest.Get(url);
        yield return www.SendWebRequest();
        if (www.isNetworkError)
        {
            yield break;
        }
        // コルーチンの中は ref が使えないので、クラス内の coStr に結果を納めます。
        coStr = www.downloadHandler.text;
    }


    IEnumerator setWeb(string url,string name,int score)
    {
        WWWForm form = new WWWForm();
        form.AddField("name", name);
        form.AddField("score", score);
        UnityWebRequest www = UnityWebRequest.Post(url, form);
        www.chunkedTransfer = false;
        yield return www.SendWebRequest();
/*
        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log("error:"+www.error);
        }
        else
        {
            Debug.Log("Form upload complete!");
            Debug.Log("MULTIPART: " + www.downloadHandler.text);
        }
*/
    }

    // coStrから、一番最初に見つけたハイスコア(同一得点もあり得るので)をフィールドにセットする
    void setFirsthiscore(string str)
    {
        int n = 0;
        string wStr = "";

        // 最初の名前を読み込み書き込む。
        while (str[n] != ',')
        {
            wStr += str[n++];
        }
        goName.GetComponent().text = wStr;
        n++;

        // 最初の数字を読み込む。
        wStr = "HISCORE:";
        while (str[n] != ',')
        {
            wStr += str[n++];
        }
        goScore.GetComponent().text = wStr;
    }

    // ボタンが押されたらユーザーと得点をmariaDBに登録する
    public void OnClick()
    {
        if (goInputName.GetComponent().text == "" || goInputScore.GetComponent().text == "" ) return;
        // coStrから、一番最初に見つけたハイスコア(同一得点もあり得るので)をフィールドにセットする
        StartCoroutine("setInputData");

    }

    IEnumerator setInputData()
    {
        IEnumerator coroutine;
        coroutine = setWeb(urlInsert, goInputName.GetComponent().text, int.Parse(goInputScore.GetComponent().text));
        yield return coroutine;
        coroutine = getWeb(urlGetHiscore);
        yield return coroutine;
        setFirsthiscore(coStr);
    }

}



戻る