簡體   English   中英

使用PHP將數組插入文件的正確方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM