我正在尝试在发布后将用户“最喜欢”的游戏放入其用户的相应文件中。
if(isset($_POST['favourite'])){
$filetxt = 'data/users.json';
$formdata = $_POST['favourite']; //this contains the value "game"
$arr_data = array();
if(file_exists($filetxt)) {
$jsondata = file_get_contents($filetxt);
$arr_data = json_decode($jsondata, true);
}
$arr_data[][$_SESSION['username']]['favourite'] = $formdata;
$jsondata = json_encode($arr_data, JSON_PRETTY_PRINT);
file_put_contents('data/users.json', $jsondata);
}
文件的结构为:
[
{
"CNR": {
"first-name": "test",
"last-name": "test",
"email": "test",
"country": "test",
"password": "test",
"favourite": []
}
},
{
"usertest": {
"first-name": "test",
"last-name": "test",
"email": "test",
"country": "United States",
"password": "password",
"favourite": []
}
}
]
当前,它将将正确的数据添加到数组中,而不是添加到数组中。
[
{
"CNR": {
"first-name": "test",
"last-name": "test",
"email": "test",
"country": "test",
"password": "test",
"favourite": []
}
},
{
"usertest": {
"first-name": "test",
"last-name": "test",
"email": "test",
"country": "United States",
"password": "password",
"favourite": []
}
},
{
"CNR": {
"favourite": "game"
}
}
]
我已经尝试过诸如arraypush,splice和其他方法之类的东西,但是我不确定哪种用例是最好的。 非常感谢我对如何最好地达到预期效果的任何想法/建议,谢谢!
答案 0 :(得分:1)
$arr_data[$_SESSION['username']]['favourite'][] = $formdata;
区别在于我将[]
移到了$arr_data
的末尾。
答案 1 :(得分:1)
在将其添加到数组之前,您需要检查键是否存在,然后继续操作而不是仅添加代码。
if(isset($_POST['favourite'])){
$filetxt = 'data/users.json';
$formdata = $_POST['favourite']; //this contains the value "game"
$arr_data = array();
if(file_exists($filetxt)) {
$jsondata = file_get_contents($filetxt);
$arr_data = json_decode($jsondata, true);
}
// changes over here
if(isset($arr_data[$_SESSION['username']])){
if(isset($arr_data[$_SESSION['username']]['favourite'])){
$arr_data[$_SESSION['username']]['favourite'][] = $formdata;
} else {
$arr_data[$_SESSION['username']]['favourite'] = $formdata;
}
} else {
$arr_data[][$_SESSION['username']]['favourite'] = $formdata;
}
$jsondata = json_encode($arr_data, JSON_PRETTY_PRINT);
file_put_contents('data/users.json', $jsondata);
}
答案 2 :(得分:0)
我可以看到大多数人都回答了这个问题,但是我是否也可以就您的过程提供一些建议(值得深思)?
1)。首先,如果您将所有用户存储在一个文件中,或者每个用户有一个文件,我将无法解决。示例 username.json 我将假设每个用户名都有一个文件,因为应该更快地写入文件,并且仅由于一个用户正在写入该文件,这要求其他人将主文件锁定。
2)。我注意到,喜欢的部分似乎也存储在_SESSION中。如果_SESSION在其中存储相同的小型数组(文件中存储内容的副本),则打开文件写入单个值然后再次保存就没有意义。您也可以直接覆盖现有文件。这样...
$writeToFile = json_encode($_SESSION[mydata]);
$fh = fopen("/path/to/username.json","w+");
fwrite($fh,$writeToFile);
fclose($fh);
// You could also use file_put_contents but most prefer
// to use fopen()
3)。我将假设您存储的密码是加密的,没有人可以键入[yourdomain] /users/username.json来查看json文件的原始输出。您可能要确保无法从浏览器访问 .json 文件。您可以使用.htaccess来做到这一点。
答案 3 :(得分:-1)
此代码中的问题是,您每次创建一个新的子数组时都在创建: 更改此:
$arr_data[][$_SESSION['username']]['favourite'] = $formdata;
对此
if(isset($arr_data[$_SESSION['username']])) {
$arr_data[$_SESSION['username']]['favourite'] = $formdata;
}