前回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 {
//送信失敗時
}
//ここまで重要
});
#実用例
- インフォメーション
- 更新履歴