【问题标题】:Updating JSON file using PHP causes duplicate entries使用 PHP 更新 JSON 文件会导致重复条目
【发布时间】:2018-04-05 14:00:54
【问题描述】:

我正在尝试使用 PHP 表单来更新 JSON 文件,但是当我编辑文件的字段时,它会创建条目的副本,但包含更新的信息。例如:

[
    {"toolName":"tool1", "url":"https://google.com/", "phase":"None"},
    {"toolName":"tool2", "url":"http://yahoo.com/", "phase":"None"},
    {"toolName":"tool3", "url":"http://bing.com/", "phase":"None"}
]

如果 PHP 表单在提交时想要更改“tool1”的“阶段”,它会添加一个带有更新的新条目。喜欢:

[
    {"toolName":"tool1", "url":"https://google.com/", "phase":"None"},
    {"toolName":"tool2", "url":"http://yahoo.com/", "phase":"None"},
    {"toolName":"tool3", "url":"http://bing.com/", "phase":"None"},
    {"toolName":"tool1", "url":"https://google.com/", "phase":"NewPhase"}
]

如何避免这种情况?我在更新时使用数组中工具的索引作为标识符,所以我目前的解决方案是这样的:

$toolId = $_POST['tool-id'];
$toolName = $_POST['tool-name'];
$toolUrl = $_POST['tool-url'];
$toolPhase = $_POST['tool-phase'];

$data = file_get_contents("../assets/js/tools.json");
$json_data = json_decode($data, true);

$json_data[$toolId]->toolName = $toolName;
$json_data[$toolId]->url = $toolUrl;
$json_data[$toolId]->phase = $toolPhase;

$json_data = array_values($json_data);

file_put_contents("../assets/js/tools.json", stripslashes(json_encode($json_data))); 

**注意:提交表单时,我使用的是Bootstrap modal,所以我只发送当前可见工具(即索引“toolId”处的工具)的数据,所以我不会遍历整个JSON 文件。

【问题讨论】:

  • 您需要将其存储为关联数组,并以$toolId 为键。当您执行array_values($json_data) 时,您会丢失密钥。
  • $_POST['tool-id'] 应该包含0 这是tool1 的索引确保没有额外的噪音添加到该值
  • 也不要在 json 编码值上stripslashesjson_encode 知道如何生成有效的 json 并且剥离斜线可能会破坏它
  • 感谢您的帮助!

标签: php arrays json forms duplicates


【解决方案1】:

此行中的 true 语句指示 PHP 返回一个数组

$json_data = json_decode($data, true);

但是,这些行创建了一个对象

$json_data[$toolId]->toolName = $toolName;
$json_data[$toolId]->url = $toolUrl;
$json_data[$toolId]->phase = $toolPhase;

如果你把它们改成这个,它应该可以工作

$json_data[$toolId]['toolName'] = $toolName;
$json_data[$toolId]['url'] = $toolUrl;
$json_data[$toolId]['phase'] = $toolPhase;

【讨论】:

  • 谢谢!这很有帮助,似乎已经解决了问题!
猜你喜欢
  • 2016-10-17
  • 2019-04-17
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多