1

シナリオ: オンライン ゲームをプレイしていて、POST/json を使用してサーバー上の PHP にデータを移植できる JavaScript ファイルがあります。これを機能させるには、サーバーのパスをクライアント PC に入力する必要があります。正常に接続されていることを確認しています。

PHP は、私がプレイしている Web サイトのソースのみを認識し、開発者コンソールでサイトへのデータ転送を確認できます。POST されるデータの形式は次のとおりです。コンソールを見ると、データが配列に入っていることがわかります。

Request URL: //xxxxxx.xxxx/aix/server_api.php Request Method:POST Status Code:200 OK Request Headersview source Accept:application/json, text/javascript, */*; q=0.01 Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 Connection:keep-alive Content-Length:65236 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Host:sd.fast-page.org Origin:http://xx.yyy.com Referer:http://xxx.yyy.com/232/index.aspx User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22 Form Dataview sourceview URL encoded alliance[id]:118 alliance[name]:DS alliance[members]:12 alliance[score]:982078 data_type:city data[0][id]:12517457 data[0][owner_id]:1538 data[0][owner]:MM1 data[0][coords]:'081:191 data[0][name]:C31 4Chief data[0][score]:11020 data[0][city_type]:castle data[0][location]:land data[1][id]:12517458 data[1][owner_id]:1538 data[1][owner]:MM1 data[1][coords]:'082:191 data[1][name]:C31 5Redrum data[1][score]:10596 data[1][city_type]:castle data[1][location]:water data[2][id]:12386381 data[2][owner_id]:1538 data[2][owner]:MM1 data[2][coords]:'077:189 data[2][name]:C31 1Home data[2][score]:10460 data[2][city_type]:castle data[2][location]:land data[3][id]:12320847 data[3][owner_id]:1538 data[3][owner]:MM1 data[3][coords]:'079:188 data[3][name]:C31 6North data[3][score]:10182 data[3][city_type]:castle data[3][location]:land data[4][id]:12386382 data[4][owner_id]:1538 data[4][owner]:MM1 data[4][coords]:'078:189 data[4][name]:C31 3Back data[4][score]:10108 data[4][city_type]:castle data[4][location]:land data[5][id]:12517453 data[5][owner_id]:1538 data[5][owner]:MM1 data[5][coords]:'077:191 data[5][name]:C31 2Second data[5][score]:9968 data[5][city_type]:castle data[5][location]:land data[6][id]:12714060 data[6][owner_id]:1538 data[6][owner]:MM1 data[6][coords]:'076:194 data[6][name]:C31 MacoHub data[6][score]:9692 data[6][city_type]:castle data[6][location]:land data[7][id]:12517460 data[7][owner_id]:1538 data[7][owner]:MM1 data[7][coords]:'084:191 data[7][name]:C31 Tango data[7][score]:9163 data[7][city_type]:castle data[7][location]:land data[8][id]:12582993 data[8][owner_id]:1538 data[8][owner]:MM1 data[8][coords]:'081:192 data[8][name]:C31 Spring data[8][score]:8864 data[8][city_type]:castle data[8][location]:land data[9][id]:12517454 data[9][owner_id]:1538 data[9][owner]:MM1 data[9][coords]:'078:191 data[9][name]:C31 Pally data[9][score]:8816 data[9][city_type]:castle data[9][location]:land data[10][id]:12779603 data[10][owner_id]:1538
[and so on and so forth.....have masked the rest but this is the format
Response Headersview source Access-Control-Allow-Headers:Content-Type Access-Control-Allow-Methods:POST, GET, OPTIONS Access-Control-Allow-Origin: //xxx.yyy Access-Control-Max-Age:1000 Cache-Control:no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform Connection:keep-alive Content-Encoding:gzip Content-Length:70 Content-Type:application/json Date:Fri, 29 Mar 2013 18:08:14 GMT Expires:Fri, 29 Mar 2013 18:08:14 GMT Pragma:no-cache Server:Apache Vary:Accept-Encoding X-Powered-By:PHP/5.5.0alpha5

上に表示されているのは、クライアント アプリをトリガーしたときの PC のコンソールへの出力です。

PHPは次のとおりです。

$m = false;
if(preg_match('/http\:\/\/game url/',$_SERVER['HTTP_ORIGIN'],$m))
    { $m = $m[1]; }

if(empty($m)) { die('Invalid Origin.'); }

if(!empty($_POST['data_type']))
{
    $sender     = $_POST['sender'];
    $alliance   = $_POST['alliance'];
    $request    = $_POST['data_type'];
    $data       = $_POST['data'];

    // Response to Alliance Info Exporter
    $json       = array(
        'message'   => 'recieved.',
        'data'      => array(),
        'error'     => false
    );

    // handle data types
    switch($request)
    {
        case 'connection_test': $json['message'] = 'Welcome to our server. Your are connected!'; break;
        case 'member'   : /* Code for member request */         break;
        case 'city'     : /* Code for city request */           break;
        case 'support'  : /* Code for support request */        break;
        default         :  $json['message'] = 'Nothing Done.';  break;
    }

    // set headers for API
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Content-Type');
    header('Content-type: application/json');

    // Respond
    die(json_encode($json));
}
die('No Access.');

ここで2つまたは3つの問題があります

  1. PHPが取得しているデータをまったく操作できないようです
  2. 何らかの方法でデータを解析できるかどうかを確認するためだけに、case ステートメントに引数を追加しようとすると、API がクライアントへの応答を停止します。

たとえば、都市のスイッチで、ブラウザ コンソールに POST 成功コード (http 200) が表示されるため、データが送信されていることを確認するためだけに、データをファイルに出力しようとしました。

これは私が使用したコードです:

$f = fopen("city.txt", "w");
fwrite($f, $_POST);
fclose($f);

PHP の主要部分で試し、市区町村スイッチ (最初に実行するクエリのタイプ) で試し、$data などの他の定義済みタイプで試しました。何も書き込みません。

私は何を間違っていますか?

第二に、これを SQL サーバーに投稿することです。どうすればよいでしょうか?

4

0 に答える 0