为什么在解析JSON数据时一开始会得到0?

时间:2018-09-19 10:17:11

标签: php json

我是json的新手,我的目标是维护每次使用php进行mysql更新时特定列(通过php中的$ _POST发布)的历史。我将一个json数组用于“历史记录”列,并将其放入while循环中,之后,我使用array_merge()函数附加了要与上一个合并的变量。我正在获取输出,但从0开始。让我知道如何以正确的json格式附加必填字段,以及如何在div标签中检索json数据。预先感谢。

PHP代码:

<?php
$query = mysqli_query($conn,"SELECT `history` FROM projects WHERE `no` = '$id'");
  $json_data = array();
     while ($js = mysqli_fetch_assoc($query)) 
     {
       $json_data[] = $js['history'];
       $j = $json_data;
     }
?>  

 <?php
 if(isset($_POST['submit'])){
  if(isset($_GET['id'])){
  $id = $_GET['id'];
  $assign = mysqli_real_escape_string($conn,$_POST['assign']);
  $end_date = mysqli_real_escape_string($conn,$_POST['end_date']);
  $comments = mysqli_real_escape_string($conn,$_POST['comments']);

  $end_date = [
      'assigned_to' => $assign,
      'end_date' => $end_date,
      'comments' => $comments
     ];
 $json = array_merge($j,$end_date);
 $js = json_encode($json);
$ins = mysqli_query($conn,"UPDATE `projects` SET `assigned_to`='$assign',`end_date`='$end_date',
 `status`='$status',`comments`='$comments'`history`= '$js'  WHERE 
`episode_no` = '$id'");
}
}
?>  

MYSQL中的JSON数据:

{"0":"{"0":"{"0":"","assigned_to":"AAA","end_date":"2018-09-12","comments":"happy"}",
        "assigned_to":"AAA","end_date":"2018-09-12","comments":"jolly"}",
        "assigned_to":"AAA","end_date":"2018-09-12","comments":"xvbcvbdfghdfg"} 

1 个答案:

答案 0 :(得分:0)

首先,您的问题的答案:您正在$j中加载字符串数组,因此array_merge函数将无法按预期工作:

$j[0] = 'some JSON string from DB';

$json = array_merge($j, $end_date);

array_merge发现第二个参数是一个稀疏数组,因此它将键合并为字符串:

$json = [
  '0' => 'the previous string',
  'assigned_to' => ...
]

为使您的想法可行,您可能需要通过将 append 附加到数组中来存储新的历史记录项:

$j[] = $end_date;
$js = json_encode($j);
...

这可以解决您的问题。

但是这里有一个非常主要的问题,您需要首先解决。这是一个类似OMG的WTF之类的问题。您正在从用户输入(查询参数)获得$id,并将其发送到DB,而无需担心。假设用户发送了

https://your.server/some/path?id=';TRUNCATE TABLE projects --'

(当然是适当的url编码)。现在,您将其发送到数据库:

SELECT `history` FROM projects WHERE `no` = '';TRUNCATE TABLE projects --''

再见项目。用户可以对您的数据库执行任何操作,更改密码,重新分配外键,将自己设置为管理员。

为了您的信任,请使用正确的ORM并从不将用户输入传递给数据库!