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

前回[Part3](https://qiita.com/708QBT/items/6c0f572184d1762c1a6d)の続き

#今回の内容
PHP処理とデータの受信処理

#準備
[Part2 ~準備する事~ 参照](https://qiita.com/708QBT/items/abac05038901cd1d418d)

データを取得するにはテーブルが存在していなくてはならない
テーブル名[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ファイル作成

```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)に送信~ 参照](https://qiita.com/708QBT/items/6c0f572184d1762c1a6d)
送信成功時に受信データを展開する

```cpp: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 {
        //送信失敗時

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

#おまけ
受信データが複数ある場合

```cpp: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ダウンロードと解凍](https://qiita.com/708QBT/items/55f80800ef47f6a4b8d9)