Php 如何使用带换行符的fopen()和fwrite()创建JSON数组并将其插入到文件中?

Php 如何使用带换行符的fopen()和fwrite()创建JSON数组并将其插入到文件中?,php,arrays,json,Php,Arrays,Json,计划:我想获取用户上次登录的数据,如用户代理、ip、时间、操作系统等。我使用以下命令成功发布了所需的所有数据: $userfolder=$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\; 如果(isset($\u服务器['REQUEST\u URI'])=='?登录=成功'){ $uid=$userRow['user_id'];

计划:我想获取用户上次登录的数据,如用户代理、ip、时间、操作系统等。我使用以下命令成功发布了所需的所有数据:

$userfolder=$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
如果(isset($\u服务器['REQUEST\u URI'])=='?登录=成功'){
$uid=$userRow['user_id'];
$last_login=$date->getTimestamp();
$last_login_ip=$_SERVER['REMOTE_ADDR'];
如果(!file_存在($userfolder.$userRow['username'..'-login.log')){
$filename=$userfolder.$userRow['username'].-login.log';
$data=json_编码(数组(“用户”=>$userRow['username'”,“时间”=>$last_login,“ip_addy”=>$last_login\u ip,“浏览器”=>$obj->showInfo('browser'),“浏览器版本”=>$obj->showInfo('version'),“操作系统”=>$obj->showInfo('os'));
$save=fopen($filename,“w”);
fwrite($save,$data.\r\n”);
fclose(节省);
}    
}
这样可以保存类似这样的内容:

{“用户”:“管理员”,“时间”:1521638903,“ip地址”:“127.0.0.1”,“浏览器”:“谷歌浏览器”,“浏览器版本”:“64.0.3282.”,“操作系统”:“Windows”}

虽然现在我设置了另一个if语句,所以如果用户登录数据发生更改,或者用户使用网络上的另一台计算机登录,它应该执行换行操作并将其插入文件中

$get_data=file_get_contents($userfolder.$userRow['username']。“-login.log”);
$get\u log=json\u decode($get\u data,true);
如果($get_log['ip_addy']!=$userRow['user_last_login\u ip']&&$get_log['time']!=$last_login&&$get_log['browser']!=$obj->showInfo('browser'))
{
$filename=$userfolder.$userRow['username'].-login.log';
$data=json_encode(数组(“用户”=>$userRow['username'],“时间”=>$date->getTimestamp(),“ip_addy”=>$\u服务器['REMOTE_ADDR'],“浏览器”=>$obj->showInfo('browser'),“浏览器版本”=>$obj->showInfo('version'),“操作系统”=>$obj->showInfo('os'));
$save=fopen($filename,“w”);
fwrite($save,$data.\r\n”);
fclose(节省);
}
其输出如下:

if (!file_exists($userfolder.$userRow['username'].'-login.log')) {
    $filename = $userfolder.$userRow['username'].'-login.log';
    $data = json_encode(array("user"=>$userRow['username'],"time" => $last_login,"ip_addy"=>$last_login_ip,"browser"=>$obj->showInfo('browser'),"browser_version"=>$obj->showInfo('version'),"os"=>$obj->showInfo('os')));
    $save = fopen($filename, "w");
    fwrite($save, $data."\r\n");
    fclose($save);        
}    
{“用户”:“管理员”,“时间”:1521639136,“ip地址”:“127.0.0.1”,“浏览器”:“Firefox”,“浏览器版本”:“59.0”,“操作系统”:“Windows”}

请注意,以前的“Chrome”条目不再在文件中,因为它删除了以前的条目并写入了一个新条目

我的预期输出是如下所示显示它:

if (!file_exists($userfolder.$userRow['username'].'-login.log')) {
    $filename = $userfolder.$userRow['username'].'-login.log';
    $data = json_encode(array("user"=>$userRow['username'],"time" => $last_login,"ip_addy"=>$last_login_ip,"browser"=>$obj->showInfo('browser'),"browser_version"=>$obj->showInfo('version'),"os"=>$obj->showInfo('os')));
    $save = fopen($filename, "w");
    fwrite($save, $data."\r\n");
    fclose($save);        
}    
{
“结果”:{
“管理员”:[
{
“时间”:1521639136,
“ip_addy”:“127.0.0.1”,
“浏览器”:“Firefox”,
“浏览器版本”:“59.0”,
“操作系统”:“Windows”
}
]
}
}
它不必使用空格进行格式化,只需在一行中换行即可进行下一次输入

当前问题:当数据保存到文件并需要更新时,文件会被新数据覆盖,旧数据会被丢弃

任何能够帮助我实现这一目标的人都将不胜感激

根据,您可以在JSON_encode()中使用JSON_PRETTY_PRINT选项
$data=json\u encode(数组(…),json\u PRETTY\u PRINT)

如果您使用的是php 5.4.0或更高版本,则此选项应该可用。

如果您希望将内容附加到文件中,而不是覆盖它,请尝试:

$data = json_encode(array(...), JSON_PRETTY_PRINT);

file_put_contents($filename , $data , FILE_APPEND | LOCK_EX);
而不是
fwrite()

如果文件不存在,这将创建该文件,如果存在,则向其添加内容

如果文件名不存在,则创建该文件。否则 除非设置了文件附加标志,否则将覆盖现有文件


完整文档:

最终解决了以下错误:

if (!file_exists($userfolder.$userRow['username'].'-login.log')) {
    $filename = $userfolder.$userRow['username'].'-login.log';
    $data = json_encode(array("user"=>$userRow['username'],"time" => $last_login,"ip_addy"=>$last_login_ip,"browser"=>$obj->showInfo('browser'),"browser_version"=>$obj->showInfo('version'),"os"=>$obj->showInfo('os')));
    $save = fopen($filename, "w");
    fwrite($save, $data."\r\n");
    fclose($save);        
}    
基本上
!file_exists
每次记录数据时都会创建一个新文件,因此我想为什么不尝试使用if语句,只要
file_exists
,并在文件/文件夹不存在时使用
else
语句来处理

if (file_exists($userfolder.$userRow['username'].'-login.log')) {
    //If the file exists do the following
    $filename = $userfolder.$userRow['username'].'-login.log';
    $data = json_encode(array("user"=>$userRow['username'],"time" => $last_login,"ip_addy"=>$last_login_ip,"browser"=>$obj->showInfo('browser'),"browser_version"=>$obj->showInfo('version'),"os"=>$obj->showInfo('os')));
    $save = fopen($filename, "w");
    fwrite($save, $data."\r\n"); //break works without the !file_exists
    fclose($save);        
}   else 
    {    
        //else if the file/folder does not exists do the following
        mkdir($usersfolder, 755);
        $save = fopen($usersfolder."/".$userRow['username']."-login.log", "a+");
        $data = $last_login.",".$last_login_ip.",".$obj->showInfo('os').",".$obj->showInfo('browser').",".$obj->showInfo('version');
        fwrite($save, $data."\r\n");
        fclose($save);
    } 

检查json_encode()参数json_PRETTY_print@Taki的可能重复项刚看了一眼,它不同于我知道如何打印它们,问题是它一直在写一个新文件并删除旧的上次登录数据。所以打印没有问题,问题是文件被覆盖了,对吗?然后,您应该更新
my designed output
部分来放置这两个JSON,到底是什么问题?您正在搜索
fopen($filename,'a')