-1

こんばんは。

まず、質問が非常に長くなってしまったことをお詫びします。私は徹底的に、すべての情報が私の意図に沿って存在していることを確認したかった.

現在、デスクトップ アプリケーションの 1 つから統計情報を収集する簡単な Web ベースの方法を開発しようとしています。これの主な目的は、エンド ユーザーへの更新を通じてトラブルシューティングを行い、より関連性の高い修正と機能の追加を提供することです。

詳細

  • 私は PHP 5.2.12 を使用$_GETし、URL からパラメーターを取得して変数に割り当てるために使用します。
  • これらの変数はjson_encode、ファイル (「統計ファイル」または「統計ファイル」と呼ばれる) に書き込まれます。
  • パラメータ/変数の 1 つは、何らかの GUID になります。この GUID は、ハードウェア ID から作成された一方向ハッシュに基づいてアプリケーションによって生成されます (ただし、コード サンプルでは、​​これはまだ表されていません)。

問題

私が直面している問題は、JSON 統計ファイル内で特定の GUID を見つけることに関連しています。

これが私がやりたいことです。

  • 1) 統​​計ファイル内で送信された GUID を見つけます。
  • 2a) 存在しない場合は、配列に新しいインデックスを追加し、内部にデータを入力します
  • 2b) 存在する場合は、配列内の既存のデータを送信されたデータで上書きします

最後に、有効な JSON 統計ファイルが残っていることが重要です。スクリプトが比較的安全であることも重要です。

レイアウトとコード

私の JSON のレイアウトは次のとおりです。

[
    {
        "guid": "spritchard",
        "api": "apichoice",
        "build": "2200",
        "temp1": "1",
        "temp2": "2",
        "temp3": "3"
    },
    {
        "guid": "helloworld",
        "api": "someapi",
        "build": "3500",
        "temp1": "4",
        "temp2": "5",
        "temp3": "6"
    }
]

私が使用しているPHPコードは次のとおりです。

<?php
$apikey=$_GET["apikey"];
if ($apikey=="apikey8634215")
  {
    $gpuapi=$_GET["api"];
    $buildno=$_GET["build"];
    $temp1=$_GET["temp1"];
    $temp2=$_GET["temp2"];
    $temp3=$_GET["temp3"];
    $guid=$_GET["guid"];

    $statsfile = "./api/application/StatsFile.json"; // Assign the stats file
    $fh = fopen($statsfile, 'a') // 'a' for append, 'w' for write
          or die("Stats File Unavailable");
    $sdata = array('guid' => $guid, 'api' => $gpuapi, 'build' => $buildno, 'temp1' => $temp1, 'temp2' => $temp2, 'temp3' => $temp3);
    fwrite($fh, json_encode($sdata));
    fclose($fh);
    echo json_encode($sdata);

    // reopen stats file to encode data as it should be
//    $cdata = fopen($statsfile, 'r') or die("Stats File Unavailable");
//    $encodedata = fread($cdata, filesize($statsfile));
//    $decodedata = json_decode($encodedata);
//    fclose($cdata);
//    $fh = fopen($statsfile, 'w') or die("Stats File Unavailable");
//    fwrite($fh, json_encode($encodedata));
//    fclose($fh);
  }
else
  {
    die("No Such Usage");
  }
?>

$apikey特定のパラメーターが存在するかどうかを確認するのに慣れていることがわかります。そうでない場合、スクリプト全体が停止します。これは、システムの開発中に基本的なレベルでの悪用を防ぐための現時点での単なるプレースホルダー設計であり、別の質問でより適切な解決策を調査します。

コメントアウトされている領域は、ファイルを新しいデータで書き換えて有効な JSON にするために使用しようとしたコードです。配列内の適切な GUID を見つける方法がわかりませんが、JSON に正しくエンコードされるようにデータを書き換える方法を理解するのにも苦労しています。そのコードのコメントを外すことによる最終的な結果は、JSON に多くのスラッシュがあり、JSON 自体は有効ではありません。さらに、ここで示したコードが安全であるとは確信していません。ぜひ、POSTメソッドを使用できますが、現時点では、GUID に基づいて特定のインデックスを更新する方法を見つけることが問題です。

質問を明確にするために、JSON 統計ファイルから特定の GUID を見つけたり、存在する場合はデータを更新したり、送信されたデータに新しい配列インデックスを追加したりするにはどうすればよいでしょうか?

4

1 に答える 1

1
$apikey=$_GET["apikey"];
if ($apikey=="apikey8634215") {
    $newObject = new stdClass();
    $newObject->guid = $_GET["guid"];
    $newObject->api = $_GET["api"];
    $newObject->build = $_GET["build"];
    $newObject->temp1 = $_GET["temp1"];
    $newObject->temp2 = $_GET["temp2"];
    $newObject->temp3 = $_GET["temp3"];
    $statsFile = "./api/application/StatsFile.json";
    $stats = file_exists($statsFile)
        ? json_decode(file_get_contents($statsFile))
        : array()
    ;
    $found = false;
    foreach ($stats as $key => $statItem) {
        if ($statItem->guid == $newObject->guid) {
            $stats[$key] = $newObject;
            $found = true;
            break;
        }
    }
    if (!found) {
        $stats[] = $newObject;
    }
    if (file_put_contents($statsFile, json_encode($stats)) === false) {
        die("Could not save stats");
    }
} else {
    die("No Such Usage");
}

このコードには get パラメーターの存在チェックが欠けているため、何らかの方法で入力を検証する必要があります。

于 2012-11-30T22:59:21.067 に答える