【问题标题】:How can I return the keys from fetch_assoc as strings so that the array can be valid JSON data? (PHP / mysqli)如何将 fetch_assoc 中的键作为字符串返回,以便数组可以是有效的 JSON 数据? (PHP/mysqli)
【发布时间】:2016-03-13 23:45:42
【问题描述】:

这是我的功能:

<?php   

function getResults($query) {
    $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    $conn->set_charset("utf8");
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $result = $conn->query($query);
    if ($result) {
        $rows = array();
        while ($row = $result->fetch_assoc()) {
          $rows[] = $row;
        }
        return $rows;
    } else {
        return mysqli_error($conn);
    }
}

?>

我在这里使用它:

if ($_POST["action"] == "getCitiesByState") {
    $cities = getResults("SELECT * FROM tbl_cidades WHERE estado_id = ".$_POST["state_id"]);
    echo json_encode($cities, JSON_UNESCAPED_UNICODE);
    die();
}

它输出:

{id: "8853", estado_id: "26", nome: "Adamantina", cep: "17800000", loc_no_abrev: "Adamantina"},…]

id、estado_id、nome 等均未加引号,构成无效的 JSON 数据。如何将它们作为字符串返回,以便它们成为有效的 JSON?

这是var_dump($cities)的输出示例

array(1) { [0]=> array(5) { ["id"]=> string(4) "1778" ["estado_id"]=> string(1) "7" ["nome"]=> string(9) "Brasília" ["cep"]=> string(0) "" ["loc_no_abrev"]=> string(9) "Brasília" } }

【问题讨论】:

  • 您使用的是什么版本的 PHP?我无法复制这种行为。您是否尝试过使用普通数组手动执行此操作?
  • 我无法将其复制到。尝试打印类似 json_encode(['id'=>15, 'name'=>'john snow'], JSON_PRETTY_PRINT);
  • 您的示例有效,而且奇怪的是,在我使用您的示例之后,其他 echo 打印也带有引号。这没有道理。版本为:PHP/5.6.14
  • 它必须与unicode相关一如既往,因为整个数据都是UTF8,JSON不喜欢它(葡萄牙字符)。
  • 数据库列名不太可能有问题...您可以对$cities 数组进行var_dump() 并将其添加到问题中吗?

标签: php json mysqli


【解决方案1】:

Unicode 文本可能会出现问题;尝试如下修改你的数据库代码:

function getResults($query) {
    $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    $conn->set_charset("utf8");
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $result = $conn->query($query);
    if ($result) {
        $rows = array();
        while ($row = $result->fetch_assoc()) {
            $rows[] = array_map("utf8_encode", $row);
        }
        return $rows;
    } else {
        return mysqli_error($conn);
    }
}

(顺便说一下,每次查询都重新连接到数据库会带来很多开销。)

【讨论】:

    【解决方案2】:

    您可以通过循环获取的数组来简单地获取密钥

        while($row = $result->fetch_assoc()) { //each row
          foreach($row as $key => $value){ // each key in each row
            echo $key;
          }
        }
    

    【讨论】:

      【解决方案3】:

      像这样?

      while($row = $result->fetch_array(MYSQL_ASSOC)) {
        $rows [] = $row;
      }
      echo json_encode($rows);
      

      【讨论】:

      • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及这样做的原因,不仅适用于 OP,也适用于 SO 的未来访问者。
      • 我已经在这样做了,因为 $cities 正是从 getResults 返回的。
      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2022-06-10
      • 2019-01-19
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多