Unity/PHP/MySQLを使って遊んでみる

  • 12
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Unityからデータベースのusersテーブルの更新と参照を行います。


Unity

LitJsonを使ってJSONデータで通信します。
サーバーから受信したusersテーブルのレコードをDBUsersクラスのインスタンスで保持します。

usersテーブルのレコードを表すクラス
public class DBUsers {
    public int id { get; set; }
    public string name { get; set; }
    public int score { get; set; }
}

id = 1 のレコードに name = "superman" と score = 100 を設定します。

PHPを経由してデータベースの更新と参照を行う
using UnityEngine;
using System.Collections;
using LitJson;

public class TestPHP : MonoBehaviour {

    public string url = "http://sample.local/index.php";

    void Start() {
        StartCoroutine (SetUserTest ());
    }

    IEnumerator SetUserTest() {
        DBUsers sendData = new DBUsers ();
        sendData.id = 1;
        sendData.name = "superman";
        sendData.score = 100;
        WWWForm form = new WWWForm ();
        form.AddField ("user", JsonMapper.ToJson(sendData));
        using (WWW www = new WWW(url, form)) {
            yield return www;
            if (! string.IsNullOrEmpty (www.error)) {
                Debug.Log ("error:" + www.error);
                yield break;
            }
            Debug.Log ("text:" + www.text);
            DBUsers user = JsonMapper.ToObject<DBUsers>(www.text);
            Debug.Log("id:"+user.id+", name:"+user.name+", score:"+user.score);
        }
    }
}

PHP

受け取ったPOSTデータでデータベースを更新します。
データベースにはPDOを使ってアクセスします。
PDO::FETCH_CLASSを指定するとデータベースの内容をクラスを使って受け取れます。

index.php
<?php

define('DB_DATABASE', 'test_db');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'dbpasswd');
define('PDO_DSN', 'mysql:dbhost=localhost;dbname='.DB_DATABASE);

/////////////////////////////////////
// POST.
function CheckPostNumeric($key) {
    if (is_numeric($_POST[$key])) {
        return (int)$_POST[$key];
    }
    return 0;
}

function CheckPostString($key) {
    if (is_string($_POST[$key])) {
        return $_POST[$key];
    }
    return "";
}

function CheckPostJson($key) {
    if (is_string($key)) {
        return json_decode($_POST[$key]);
    }
    return null;
}

/////////////////////////////////////
// JSON.
function CheckJsonNumeric($val) {
    if (is_numeric($val)) {
        return (int)$val;
    }
    return 0;
}

function CheckJsonString($str) {
    if (is_string($str)) {
        return $str;
    }
    return "";
}

/////////////////////////////////////
class User {
    public function ToJson() {
        $this->id = CheckJsonNumeric($this->id);
        $this->name = CheckJsonString($this->name);
        $this->score = CheckJsonNumeric($this->score);
        return json_encode($this);
    }
}

$postUser = CheckPostJson('user');

header('Content-type:application/json');

try {
    $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $db->prepare("update users set name = :name, score = :score where id = :id");
    $stmt->bindValue(':id', $postUser->id, PDO::PARAM_INT);
    $stmt->bindValue(':name', $postUser->name, PDO::PARAM_STR);
    $stmt->bindValue(':score', $postUser->score, PDO::PARAM_INT);
    $stmt->execute();

    $stmt = $db->prepare("select * from users where id = :id");
    $stmt->bindValue(':id', $postUser->id, PDO::PARAM_INT);
    $stmt->execute();
    $users = $stmt->fetchAll(PDO::FETCH_CLASS, 'User');
    foreach ($users as $user) {
        echo $user->ToJson();
    }

    $db = null;
} catch (PDOException $e) {
//  $db->rollback();
    echo $e->getMessage();
    exit;
}

MySQL

MySQLの環境を用意するには、ドットインストールさんが分かりやすくてよかったです。
ローカル開発環境の構築 [MacOS X編]
PHPデータベース入門

MySQLコマンド
mysql> create database test_db;
mysql> grant all on test_db.* to dbuser@localhost identified by 'dbpasswd';
mysql> use test_db;
mysql> create table users ( id int not null auto_increment primary key, name varchar(255), score int );
mysql> insert into users ( name, score ) values ( 'testman', 30 );

Unityを実行して、データベースが更新されれば成功です。