2013-12-08 64 views
0

所以我有一个JSON文件包含以下格式的篮球运动员信息的JSON文件时:奇怪行为追加使用PHP

[{"name":"Lamar Patterson","team":1,"yearsLeft":0,"position":"PG","PPG":17},{"name":"Talib Zanna", "team":1,"yearsLeft":0,"position":"SF","PPG":13.1},....] 

我希望用户是一个能够给自己的自定义播放器添加到该文件。要做到这一点,我尝试以下操作:

<?php 
     $json = file_get_contents('json/players.json'); 
     $info = json_decode($json, true); 
     $info[] = array('name'=>$name, 'team'=>$team, 'yearsLeft'=>4, 'position'=>$position, 'PPG'=>$ppg); 
     file_put_contents('json/players.json', json_encode($info)); 
    ?> 

这种“排序”的作品。但是,当我检查JSON文件,我发现有3个新项目,而不是1:

{"name":"","team":null,"yearsLeft":4,"position":"","PPG":""},{"name":"","team":"3","yearsLeft":4,"position":"","PPG":""},{"name":"Jeff","team":null,"yearsLeft":4,"position":"C","PPG":"23"} 

假设$ NAME = “杰夫” $团队= 3,$分= 23(通过POST提交填写)。

怎么回事,我该如何解决?

+0

确定源文件无误?不会丢失逗号等等? –

+0

是的,它看起来不错 – Haskell

+0

你在使用ajax进行POST吗?一些双击的点击可能会触发额外的条目。只是为了确保 – apoq

回答

0

试试这个:

<?php 
//get the posted values 
$name = $_POST['name']; 
$team = $_POST['team']; 
$position = $_POST['position']; 
$ppg = $_POST['ppg']; 

//verify they're not empty 
if(!empty($name) && !empty($team) && !empty($position) && !empty($ppg)) { 
     //Open the file 
     $fh = fopen('json/players.json', 'r+') or die("can't open file"); 

     //get file info/stats 
     $stat = fstat($fh); 

     //final desired size after trimming the trailing ']' 
     $size = $stat['size']-1; 

     //file has contents? then remove the trailing ']' 
     if($size>0) ftruncate($fh, $size); 

     //close the current handle 
     fclose($fh); 

     // reopen the file for append 
     $fh = fopen('json/players.json', 'a'); 

     //build your data array 
     $info = array('name'=>$name, 'team'=>$team, 'yearsLeft'=>4, 'position'=>$position, 'PPG'=>$ppg); 
     //if this is not the first item on file 
     if($size>0) fwrite($fh, ','.json_encode($info).']'); //append with comma 
     else fwrite($fh, '['.json_encode($info).']'); //first item on file 
     fclose($fh); 
} 
?> 

也许你的PHP的配置没有设置到后/ GET变量转换为全局变量。这发生在我身上好几次,所以我宁愿创建我期望的post/get请求的变量。同时注意页面编码,从个人经验来看,你可能会在那里得到空的字符串。

+0

请使用'$ _POST'而不是'$ _REQUEST'。 –

+0

完成。你是对的,我挖掘$ _REQUEST以防万一我试图在GET或POST上获取任何东西,并且不关心它们在哪里发布。但这可能会导致其他问题。 –

0

你可以尝试做如下:

未经测试的代码

<?php 
if(!empty($name) && !empty($team) && !empty($position) && !empty($ppg)) { 
    $fh = fopen('json/players.json', 'r+') or die("can't open file"); 
    $stat = fstat($fh); 
    ftruncate($fh, $stat['size']-1);//removes last ] char 
    fclose($fh); 
    $fh = fopen('json/players.json', 'a'); 
    $info = array('name'=>$name, 'team'=>$team, 'yearsLeft'=>4, 'position'=>$position, 'PPG'=>$ppg); 
    fwrite($fh, ','.json_encode($info).']'); 
    fclose($fh); 
} 
?> 

这将追加只有新JSON的文件,而不是打开该文件,使PHP解析所有的JSON和然后再将它写入文件。除此之外,如果变量实际包含数据,它将仅存储数据。

+0

这段代码首先更高效,它可以解决这个问题,因为php的json_decode没有正确解释你的json数据。 – NoCode

+0

有趣的是,这导致了相同的问题。这个问题是否存在于我的代码中不同地方定义这些变量的事实上? – Haskell

+0

看来,这个脚本正在对多个帖子提出请求。也许尝试添加一个检查,以查看在存储数据之前$ name,$ team,$ position和$ ppg是否为空。 – NoCode