using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class testServer : MonoBehaviour {
public enum eSuccessed { FAIL, SUCCESS } //DB와의 연결이 잘 되었는지
public enum eDBQuery { INSERT_UPDATE, DELETE, SELECT } //입력한 데이터를 어떤 용도로 DB에 전달할 것인지
[System.Serializable]
public class Ranking
{
public int no; //고유번호
public string name; //이름
public int score; //점수
}
public eDBQuery dbQuery;
public Ranking rank;
eSuccessed successed;
string phpUrl = "http://--------------------.php"; //php 주소
// Use this for initialization
void Awake () {
StartCoroutine(LoadFromPhp()); //바로 코루틴을 시작
}
IEnumerator LoadFromPhp()
{
string load;
Ranking[] infos;
WWWForm urlForm = new WWWForm();
urlForm.AddField("db_host", "localhost"); //php로 전송할 데이터를 같이 포함시킨다. php에선 $_POST["db_host"]; 의 형태로 받는다.
urlForm.AddField("db_user", "아이디");
urlForm.AddField("db_passwd", "비밀번호");
urlForm.AddField("db_name", "데이터베이스 ");
urlForm.AddField("DBQuery", (int)dbQuery);
switch (dbQuery) //입력한 데이터를 어떤 용도로 DB에 전달할 것인지에 따라 추가 데이터를 포함시킨다.
{
case eDBQuery.INSERT_UPDATE:
urlForm.AddField("insertRank", JsonUtility.ToJson(rank)); //삽입, 갱신에는 데이터 전부가 필요하므로 데이터 클래스를 JSON 화 시켜서 포함시킨다.
break;
case eDBQuery.DELETE:
urlForm.AddField("deleteNo", rank.no); //삭제에는 고유번호만 있으면 된다.
break;
case eDBQuery.SELECT: //DB 데이터 보기
break;
default:
Debug.Log("DB접근오류1");
break;
}
WWW www = new WWW(phpUrl, urlForm); //php를 호출한다.
yield return www; //응답이 돌아올때까지 대기한다. 이 대기시간 때문에 코루틴으로 진행한다.
if (www.error != null) //php 접근 자체에 문제가 있으면 www.error가 발생한다.
{
Debug.Log("www에러" + www.error);
}
else
{
//에러가 없다면 php로부터 출력된게 모두 www.text에 포함되어 돌아온다. php에서 이 구분을 ;으로 하였으므로
string[] successSplit = www.text.Split(';'); //Split함수로 나눠준다.
//이 코드에선 정상적으로 이루어졌을 때 successSplit 안에는 2개가 들어간다. 성공 여부와 DB로부터 받은 데이터
foreach (string s in successSplit)
Debug.Log(s); //두 개가 들어있는지 확인해본다.
successed = (eSuccessed)Enum.Parse(typeof(eSuccessed), successSplit[0]);
//분리된 앞쪽엔 성공 여부가 담겨있다. 보기 편하도록 enum형으로 만들어준다.
switch(successed)
{
case eSuccessed.FAIL: //실패했다면 에러문구를 띄운다.
Debug.Log("데이터베이스 에러: " + successSplit[1]);
break;
case eSuccessed.SUCCESS: //성공했다면 애초에 여기서부터 작업 종류를 정했으므로 작업 종류까지 되돌려받을 필요는 없으므로 위에서 정해둔 값을 이용해 처리하면 된다.
switch (dbQuery)
{
//삽입 및 갱신, 삭제는 돌려받는것이 없지만 잘 들어갔는지 확인을 위해 삽입 후 모든 데이터를 되돌리도록 하였다.
//자세한 설명은 SELECT 문에서 작성
case eDBQuery.INSERT_UPDATE:
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"), successSplit[1]);
load = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"));
infos = JsonHelper.FromJson<Ranking>(load);
Debug.Log("랭킹 추가");
foreach (Ranking info in infos)
{
Debug.Log("no: " + info.no + " name: " + info.name + " score: " + info.score);
}
break;
case eDBQuery.DELETE:
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"), successSplit[1]);
load = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"));
infos = JsonHelper.FromJson<Ranking>(load);
Debug.Log("삭제");
foreach (Ranking info in infos)
{
Debug.Log("no: " + info.no + " name: " + info.name + " score: " + info.score);
}
break;
case eDBQuery.SELECT:
//JsonHelper를 활용하여 배열을 인식하는 방식은 successSplit[1] 상태로는 인식하지 못한다.
//그러므로 한 번 파일로 저장한 후에 다시 불러온다. 그러면 정상적으로 인식한다.
File.WriteAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"), successSplit[1]);
load = File.ReadAllText(Path.Combine(Application.streamingAssetsPath, "jsonServer.json"));
infos = JsonHelper.FromJson<Ranking>(load);
foreach (Ranking info in infos)
{
Debug.Log("no: " + info.no + " name: " + info.name + " score: " + info.score);
}
break;
default:
Debug.Log("DB접근오류2");
break;
}
break;
default:
Debug.Log("성공여부 에러");
break;
}
}
}
}