为什么php json数组返回null值,即使它有第一行的值

时间:2018-01-14 15:52:24

标签: php mysql json

我正在获取json数据

$sql=mysqli_query($con,"select * FROM mohamiusermeta  where meta_key='websiteurl' or meta_key='profile_photo' or meta_key = 'Office' or meta_key='address_user' or meta_key='agentarea' or meta_key='offertext' or meta_key='officename' or meta_key='cover_photo' or meta_key='membertype' order by user_id desc");
$newarray = array();
$subArray = array();
while($row=mysqli_fetch_assoc($sql))
{
    $output[$row['meta_key']] = $row['meta_value'];
    $subArray[user_id]=$row['user_id'];
    $subArray[Office]=$output['Office']; 

    $subArray[officename]=$output['officename']; 
    $subArray[address_user]=$output['address_user']; 
    $subArray[profile_photo]=$output['profile_photo']; 
    $subArray[cover_photo]=$output['cover_photo']; 
    $subArray[agentarea]=$output['agentarea']; 
    $subArray[offertext]=$output['offertext']; 
    $subArray[websiteurl]=$output['websiteurl']; 
    $subArray[membertype]=$output['membertype']; 
    $newarray[] = $subArray;
}

json_encode($newarray);

echo(json_encode($newarray,JSON_UNESCAPED_UNICODE));

mysqli_close();
?>

但浏览器中的结果为数据库

中具有值的第一行的null和重复值

获取数组有什么问题? 在浏览器中查看结果访问http://lifecareclub.net/api/test.php

2 个答案:

答案 0 :(得分:0)

当您修改 $newarray的成员时,您正在修改下一次迭代中已添加到$subArray的内容。

要解决此问题,请在第一次分配到其中一个键之前,在循环内移动$subArray = array();。这样你就可以在每次迭代中创建一个 new 数组,这样就可以减少它的数量。"从您在上一次迭代中分配给其成员的数据。

注意:您需要在$subArray['user_id'] = ...和其他作业中使用引号,但我认为这是您提问中的拼写错误。

答案 1 :(得分:0)

我可以看到一些问题,包括从数据库中提取查询结果并转换为数组的方式。一般来说,为了调试这样的问题,你应该看看你的变量值,看看它们是否符合预期。

例如,如果你把

var_dump($output);
在您开始使用$output设置$subArray中的值之前,在循环中

,您会看到它没有您认为的所有信息。

附注:如果您使用Ajax来调用该函数,则需要学习使用浏览器的调试工具来查看从服务器返回的确切数据。这样您就可以返回非JSON结果并查看实际情况。在这种情况下,您将看到返回的数据实际上是一条错误消息,可帮助您确定下一步。

我不想为您编写代码,但您可以采取以下措施来改进代码。我假设officename之类的东西是数据库表中由SELECT语句返回的列。

$sql=mysqli_query($con,"select * FROM mohamiusermeta  where meta_key IN ('websiteurl', 'profile_photo', 'Office', 'address_user', 'agentarea', 'offertext' , 'officename', 'cover_photo', 'membertype') order by user_id desc");

$newarray = array();

while($row = mysqli_fetch_assoc($sql))
{
    $subArray = array();

    $subArray[$row['meta_key']] = $row['meta_value'];
    $subArray['user_id'] = $row['user_id'];
    $subArray['Office'] = $row['Office']; 
    $subArray['officename'] = $row['officename']; 
    $subArray['address_user'] = $row['address_user']; 
    $subArray['profile_photo'] = $row['profile_photo']; 
    $subArray['cover_photo'] = $row['cover_photo']; 
    $subArray['agentarea'] = $row['agentarea']; 
    $subArray['offertext'] = $row['offertext']; 
    $subArray['websiteurl'] = $row['websiteurl']; 
    $subArray['membertype'] = $row['membertype']; 
    $newarray[] = $subArray;
}

echo(json_encode($newarray,JSON_UNESCAPED_UNICODE));

mysqli_close();

我改变的事情:

  • 在查询中,我使用IN来缩短列表并使其更清晰。
  • 淘汰$output
  • $subArray
  • 的索引周围加上引号

样式说明:

  • 选择变量命名样式并坚持使用。
  • 整洁有很多帮助

最后一点说明:看起来所有代码所做的只不过是制作$row的新副本。考虑将所有内容替换为$newarray[] = $row;并将meta_key和meta_value交给javascript端。