为什么 json_encode() 返回键值两次(索引键和字符串键)


Why json_encode() return keys values twice (index key and string key)?

当我使用 json_encode(( 函数时,该方法返回一个 Json,其两次值相同:一个带有字符串键,一个带有索引。我以前没有这个问题。

$req = $bdd->prepare("SELECT mail,description FROM identifiant WHERE mail = :mail AND pass=:pass");
        if ($req->execute(array(
                    'mail' => $_COOKIE['mail'],
                    'pass' => $_COOKIE['pass']))) {
            header('Content-type: application/json');
            return json_encode($req->fetchAll());

回应:

[
   {
      "mail": "root@root.com",
      "0": "root@root.com",
      "description": "a description",
      "1": "a description"
   }
]

我该怎么做没有索引键?

使用 PDO::FETCH_ASSOC 获取模式:

return json_encode($req->fetchAll(PDO::FETCH_ASSOC));

这不是json_encode,这是因为您的 PDO 实例的获取模式设置为 PDO::FETCH_BOTH 。有关PDOStatement::fetchAll 的获取样式,请参阅文档。

使用这个:

PDO::FETCH_ASSOC:返回按列索引的数组 结果集中返回的名称 PDO::FETCH_BOTH(默认值(:返回索引为 列名和 0 索引列号(如 结果集 PDO::FETCH_BOUND:返回TRUE并分配 结果中的列的值设置为 PHP 变量 它们与 PDOStatement::bindColumn(( 绑定 方法 PDO::FETCH_CLASS:返回 请求的类,将结果集的列映射到 类中的属性。如果fetch_style 包括 PDO::FETCH_CLASSTYPE(例如 PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE( 则类的名称为 根据第一列的值确定。 PDO::FETCH_INTO:更新现有实例 请求的类,将结果集的列映射到 类中的命名属性 PDO::FETCH_LAZY:组合 PDO::FETCH_BOTHPDO::FETCH_OBJ, 在访问对象变量名称时创建对象变量名称 PDO::FETCH_NUM:返回按列索引的数组 结果集中返回的编号,从第 0 列开始 PDO::FETCH_OBJ:返回一个匿名对象 与 结果集

PDOStatement::fetch

return json_encode($req->fetchAll(PDO::FETCH_ASSOC));

你必须使用 PDO::FETCH__ASSOC 作为参数

$req = $bdd->prepare("SELECT mail,description FROM identifiant WHERE mail = :mail AND pass=:pass");
        if ($req->execute(array(
                    'mail' => $_COOKIE['mail'],
                    'pass' => $_COOKIE['pass']))) {
            header('Content-type: application/json');
  return  json_encode($req->fetchAll(PDO::FETCH_ASSOC));

}