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

More than 3 years have passed since last update.

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を実行して、データベースが更新されれば成功です。