DB时,JSON从PHP API打印两次

时间:2017-10-21 20:13:44

标签: php json

我的API从MySQL表中获取单行,将其编码为JSON,然后回显它。我使用不同的查询来防止重复,但JSON包括每个值两次。

我的查询提取此类数据

DB Screenshot

这是我得到的JSON:

enter image description here

我的PHP API代码是:

<?php
$servername = "localhost";
$username = "testuser";
$password = "dbpassword";
$dbname = "testDB";

// Create connection

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection

if ($conn->connect_error)
    {
    die("Connection failed: " . $conn->connect_error);
    }

$query = "SELECT DISTINCT BANK FROM BANK_MASTER";


$response = array();
$result = mysqli_query($conn, $query);

while ($row = mysqli_fetch_array($result))
    {
    $response[] = $row;
    }

header('Content-Type: application/json');
echo json_encode($response);
$conn->close();
?>

2 个答案:

答案 0 :(得分:0)

查看mysqli_fetch_array的文档:

  

将结果行提取为关联行,数字数组,或两者

和(注意最后一个参数的默认值!):

mixed mysqli_result::fetch_array ([ int $resulttype = MYSQLI_BOTH ] )

...所以为结果类型提供不同的值:

  

此可选参数是一个常量,指示应从当前行数据生成哪种类型的数组。此参数的可能值是常量MYSQLI_ASSOC,MYSQLI_NUM或MYSQLI_BOTH。

答案 1 :(得分:0)

问题

问题在于你如何致电mysqli_fetch_array()。默认情况下,如果省略第二个参数,mysqli_fetch_array将使用MYSQLI_BOTH类型提取数据(请参阅the docs)。这意味着它返回数字和列名称键。所以,如果您的数据是这样的:

BANK
--------
ABC Bank
DEF Bank

您将获得每行的数组,如下所示:

array(
    0 => "ABC Bank",
    "BANK" => "ABC Bank"
)

这将产生类似

的JSON
[
    {
        "0":"ABC Bank",
        "BANK":"ABC Bank"
    },
    {
        "0":"DEF Bank",
        "BANK":"DEF Bank"
    }
]

解决方案

使用结果类型MYSQLI_ASSOCMYSQLI_NUM代替

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC))

while ($row = mysqli_fetch_array($result, MYSQLI_NUM))

一些额外的建议

你真的应该添加一些错误检查代码来处理数据库错误。此外,您正在将功能代码(如mysqli_fetch_array())与面向对象的代码(如$conn->close())混合使用。如果你小心,这将有效,但这不是一个很好的做法,并导致更多的错误。它也使测试变得更加困难。我强烈建议只使用其中一个,而且我个人会选择面向对象的代码,这是非常好的。