无法从 PHP 中的 JSON 中删除特定键和值



当用户点击页面上的删除按钮时,我正试图从PHP中的外部JSON文件中删除特定的键值对。

我不熟悉PHP,所以我不知道自己做错了什么。我看了20多个关于stackoverflow的问题,但没有一个能解决我的问题。

我试图实现的是写一个简单的脚本,用户可以在文本框中写一些东西并提交,在页面上显示,当用户想要删除它时

我的第一个JSON文件:

{
"departman1":
[
{"departman1stage":"John"},
{"departman1stage":"Test"},
{"departman1stage":"Test2"}
]
}

我的index.php文件的一部分:

...
include ('yazdir.php');
include ('sil.php');
<div class='icerik'>


<?php

foreach ($json['departman1'] AS $d){
echo '<p class="' . $d['departman1stage'] .'">';
echo "--> ";
echo $d['departman1stage'];
echo '<form action="sil.php" method="POST"><button type="submit" class="dugme" name="' . $d['departman1stage'] .'"><i class="fa fa-trash"></i></button></form>';
echo "<br>";
echo "</p>";
}
?>
</div>
<br>
<form action="yazdir.php" method="POST">
<div class="icerik"><p><input type="text" name="departman1stage"></p></div>
<br>
<input type="submit" value="Gonder">
</form>
...

这与问题无关,但我仍然将我的yazdir.php代码:

$json_sifreli = file_get_contents ("data.json");
$json = json_decode($json_sifreli, true);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$data = array(
'departman1stage'          => $_POST["departman1stage"]
);
array_push ( $json['departman1'], $data );
$json_sifreleme = json_encode($json, true);
file_put_contents('data.json', $json_sifreleme);
}

sil.php目前是空白的,正如我所说,我尝试了不同的方法。他们中的一些人删除了整个JSON文件并将"null"放入其中。他们中的某些人删除了不相关的键值对。万不得已,我决定在这里写作。

提前谢谢,很抱歉耽误你的时间。

您可以使用PHP内置的unset函数删除键。它适用于单个数组键:

<?php
$foo = [
'a' => 23,
'b' => 42,
];
unset($foo['a']);
var_dump($foo);

结果:

array(1) {
["b"]=>
int(42)
}

PHP数组是散列映射,不管键是字符串还是数字。在您的示例JSON中,departman1是一个带有数字键的数组。您也可以使用unset删除数字键:

$bar = [
23,
42,
];
unset($bar[0]);
var_dump($bar);

结果:

array(1) {
[1]=>
int(42)
}

请注意,转储显示1为密钥。取消设置数字键不会导致数组重新编号。你最终会有洞,这将显示在json_encode输出中:

echo json_encode($bar);
// Results in: {"1":42}

因此,可以使用JSON文件作为数据存储,但请注意,这是一个充满困难的Pandoras盒子。它也不会扩展到一个并发用户之外,因为json_encodejson_decode不提供数据库管理系统提供的ACID属性。我的建议是:放弃JSON文件,选择一个合适的数据库,比如PostgreSQL或MySQL(它们通过PDO在PHP中有很好的支持(。

在操场中查看示例代码

(顺便说一句:您直接使用$_POST变量,这是不安全的用户输入。可以使用PHP内置的filter_var函数对输入进行消毒。(

最新更新