[英]What is the correct way to insert array into a file using 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和其他方法之類的東西,但是我不確定哪種用例是最好的。 非常感謝您對如何最好地達到預期效果的任何想法/建議,謝謝!
$arr_data[$_SESSION['username']]['favourite'][] = $formdata;
區別在於我將[]
移至$arr_data
。
在將其添加到數組之前,您需要檢查鍵是否存在,然后繼續操作而不是僅添加代碼。
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)。 首先,如果您將所有用戶存儲在一個文件中,或者每個用戶有一個文件,我將無法解決。 示例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做到這一點。
問題出在此代碼中,您每次都在創建一個新的子數組時:對此進行更改:
$arr_data[][$_SESSION['username']]['favourite'] = $formdata;
對此
if(isset($arr_data[$_SESSION['username']])) {
$arr_data[$_SESSION['username']]['favourite'] = $formdata;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.