LoginSignup
2
3

More than 5 years have passed since last update.

Cocos2d-xのサーバー通信方法(JSON+PHP+MySQL) Part4

Last updated at Posted at 2017-11-17

前回Part3の続き

今回の内容

PHP処理とデータの受信処理

準備

Part2 ~準備する事~ 参照

データを取得するにはテーブルが存在していなくてはならない
テーブル名[player_data]で以下のようなテーブルとする

playerNo name coin last
1 708QBT 20 2017/11/15
2 SIDE 500 2017/10/20
3 RENDER 10000 2017/08/03

PHPファイル作成

sample.php
<?php
$postData = file_get_contents("php://input");
$inputData = json_decode($postData, true);

if ($inputData == NULL) { exit; }

try {
    $pdo = new PDO('mysql:host=localhost;dbname=[データベース名];charset=utf8','ユーザー名','パスワード');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $Exception) { exit; }

$playerNo = $inputData["playerNo"];

//SQL文を作りデータをSELECTする
$select = "SELECT * FROM player_data WHERE playerNo = ?";
$selectData = $pdo->prepare($select);
$selectData->bindValue(1, $playerNo);
$selectData->execute();

//取り出したデータをJSON形式にして送信する
header('Content-type:application/json');
echo json_encode ($selectData->fetchAll(PDO::FETCH_ASSOC));
$pdo->null;

この記述で全てのデータをJSON形式にして送信しCocos2d-x側で受信する

echo json_encode ($selectData->fetchAll(PDO::FETCH_ASSOC));

データを受信、必要な形式に展開

Part3 ~JSONをリクエストURL(PHP)に送信~ 参照
送信成功時に受信データを展開する

sample.cpp
request->setResponseCallback([=](cocos2d::network::HttpClient* client, cocos2d::network::HttpResponse* response){
//データ受信、必要な形式展開に重要なところ
    if (response->isSucceed()) {
        //送信成功時
         std::vector<char> *buffer = response->getResponseData();
        /*
        printf("Http Test, dump data: ");
        for (unsigned int i = 0; i < buffer->size(); i++) { printf("%c", (*buffer)[i]); }
        printf("\n");
        */
        if (buffer->size() == 4) return;
        //必要なデータを受信しJSON形式に変換
        const char *data = reinterpret_cast<char *>(&(buffer->front()));
        picojson::value v;
        std::string error;
        picojson::parse(v, data, data + strlen(data), &error);
        CCASSERT(error.empty(), error.c_str());

        //変換したJSONデータは連想配列なのでテーブルのフィールド名で値を取得可能
        picojson::object &obj = v.get<picojson::object>();
        long playerNo = (long)obj["playerNo"].get<double>();
        std::string &name = obj["name"].get<std::string>();
        long coin = (long)obj["coin"].get<double>();
        std::string &last = obj["last"].get<std::string>();
        //変換したデータを好きなように使う

    }else {
        //送信失敗時

    }
//ここまで重要
});

おまけ

受信データが複数ある場合

sample.cpp
request->setResponseCallback([=](cocos2d::network::HttpClient* client, cocos2d::network::HttpResponse* response){
//データ受信、必要な形式展開に重要なところ
    if (response->isSucceed()) {
        //送信成功時
         std::vector<char> *buffer = response->getResponseData();
        /*
        printf("Http Test, dump data: ");
        for (unsigned int i = 0; i < buffer->size(); i++) { printf("%c", (*buffer)[i]); }
        printf("\n");
        */
        if (buffer->size() == 4) return;
        //必要なデータを受信しJSON形式に変換
        const char *data = reinterpret_cast<char *>(&(buffer->front()));
        picojson::value v;
        std::string error;
        picojson::parse(v, data, data + strlen(data), &error);
        CCASSERT(error.empty(), error.c_str());

        //変換したJSONデータは連想配列なのでテーブルのフィールド名で値を取得可能
        picojson::array &array = v.get<picojson::array>();

        //受信した複数データをforで展開
        for (picojson::array::iterator it = array.begin(); it != array.end(); it++){
            picojson::object& obj = it->get<picojson::object>();

            long playerNo = (long)obj["playerNo"].get<double>();
            std::string &name = obj["name"].get<std::string>();
            long coin = (long)obj["coin"].get<double>();
            std::string &last = obj["last"].get<std::string>();
            //変換したデータを好きなように使う

        }
    }else {
        //送信失敗時
    }
//ここまで重要
});

実用例

  • インフォメーション
  • 更新履歴

次回

Cocos2d-xでのzipダウンロードと解凍

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3