当数据库关闭时,JSON从PHP API打印两次

当数据库关闭时,JSON从PHP API打印两次,php,json,Php,Json,我的API从MySQL表中获取一行,将其编码为JSON,并对其进行响应。我使用distinct查询来防止重复,但是JSON将每个值包含两次 我的查询获取如下数据 下面是我得到的JSON: 我的PHP API代码是: <?php $servername = "localhost"; $username = "testuser"; $password = "dbpassword"; $dbname = "testDB"; // Create connection $conn = new

我的API从MySQL表中获取一行,将其编码为JSON,并对其进行响应。我使用distinct查询来防止重复,但是JSON将每个值包含两次

我的查询获取如下数据

下面是我得到的JSON:

我的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();
?>

查看以下文档:

将结果行提取为关联数组、数值数组或两者

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

…因此,请为结果类型提供不同的值:

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

问题 问题在于你怎么打电话。默认情况下,如果省略第二个参数,
mysqli\u fetch\u数组
使用
mysqli\u两者
类型获取数据(请参阅)。这意味着它同时返回数字键和列名键。因此,如果您的数据如下所示:

BANK
--------
ABC Bank
DEF Bank
array(
    0 => "ABC Bank",
    "BANK" => "ABC Bank"
)
您将获得每行的数组,如下所示:

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_ASSOC
MYSQLI_NUM
,如中所示

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

一些额外的建议
您确实应该添加一些错误检查代码来处理数据库错误。此外,您还将诸如
mysqli\u fetch\u array()
之类的函数代码与诸如
$conn->close()之类的面向对象代码混合使用。如果你很小心的话,这会起作用,但这不是一个很好的实践,会导致更多的错误。这也使得测试变得越来越困难。我强烈建议只使用一个或另一个,就我个人而言,我会使用面向对象的代码,可以直接使用。

mysqli\u fetch\u array-将结果行作为关联数组、数字数组或两者都使用-不要同时使用这两个数组,您只会得到一个