#php
#php
Вопрос:
Я пытаюсь поместить «любимую» игру пользователей в соответствующий файл для их пользователя при публикации.
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 и другие методы, однако я не уверен, что лучше всего подходит для этого варианта использования.
Любые мысли / рекомендации о том, как я могу наилучшим образом достичь этого с желаемым результатом, высоко ценятся, спасибо!
Ответ №1:
$arr_data[$_SESSION['username']]['favourite'][] = $formdata;
Разница в том, что я переместился []
в конец $arr_data
.
Комментарии:
1. Никогда не думал об этом, таким образом. действительно экономит много строк кода. 😛
2. Это было очень полезно и дало желаемый результат, спасибо!
Ответ №2:
Прежде чем добавлять его в array, вам нужно проверить, существует ли ключ, а затем продолжить, а не просто добавлять код.
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);
}
Комментарии:
1. Спасибо за вашу помощь!
Ответ №3:
Я вижу, что большинство ответили на вопрос, но могу ли я также предоставить некоторые предложения (пищу для размышлений) по вашему процессу?
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.
Комментарии:
1. Спасибо за советы! Это часть курсовой работы, над которой я работаю, и это не будет живой сайт или что-то еще, исключительно для задания. Они хранятся в обычном формате . однако json нам было поручено использовать это, и нам не разрешено использовать защищенную базу данных или что-либо в этом роде.
Ответ №4:
Проблема в этом коде, вы создаете каждый раз новый подмассив: измените это:
$arr_data[][$_SESSION['username']]['favourite'] = $formdata;
К этому
if(isset($arr_data[$_SESSION['username']])) {
$arr_data[$_SESSION['username']]['favourite'] = $formdata;
}