按值查找索引

时间:2012-11-30 22:24:59

标签: php json getjson

晚上好。

首先,我为这个问题的长度道歉。我想彻底确保所有信息都与我的意图一致。

我目前正在寻求开发一种基于网络的简单方法,从我的桌面应用程序之一收集统计数据。其主要目的是通过更新最终用户进行故障排除并提供更多相关修复和功能添加。

详情

  • 我将使用PHP 5.2.12,并使用$_GET从URL中获取参数并将它们分配给变量。
  • 这些变量将为json_encode并写入文件(称为“statsfile”或“stats file”)。
  • 其中一个参数/变量将是某种GUID。我的应用程序将根据从硬件ID创建的单向哈希生成此GUID(尽管在代码示例中,尚未表示)。

问题

我面临的问题与在我的JSON统计文件中找到特定的GUID有关。

这就是我想要做的事情;

  • 1)在statsfile
  • 中找到提交的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 statsfile中查找特定的GUID,更新数据(如果存在),或者使用提交的数据添加新的数组索引? < / p>

1 个答案:

答案 0 :(得分: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参数存在检查,您应该以某种方式验证输入。