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

时间:2013-10-09 09:00:49

标签: php indexing key json

当我使用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"
   }
]

我怎么办没有索引键?

4 个答案:

答案 0 :(得分:8)

使用PDO :: FETCH_ASSOC获取模式:

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

答案 1 :(得分:4)

不是json_encode,而是因为您的PDO实例的获取模式设置为PDO::FETCH_BOTH。请参阅PDOStatement::fetchAll's fetch style的文档。

答案 2 :(得分:2)

使用它:

                   PDO :: FETCH_ASSOC :返回按列索引的数组          在结果集中返回的名称         

                   PDO :: FETCH_BOTH (默认值):返回索引的数组          在您的帐户中返回的列名和0索引列号          结果集         

                   PDO :: FETCH_BOUND :返回 TRUE 并指定          结果集中的列值为PHP变量          它们与PDOStatement :: bindColumn()绑定          方法         

                   PDO :: FETCH_CLASS :返回一个新的实例          请求的类,将结果集的列映射到named          班上的属性。如果 fetch_style          包括PDO :: FETCH_CLASSTYPE(例如 PDO :: FETCH_CLASS |          PDO :: FETCH_CLASSTYPE )然后是类的名称          根据第一列的值确定。         

                   PDO :: FETCH_INTO :更新现有实例          请求的类的映射,将结果集的列映射到          类中的命名属性         

                   PDO :: FETCH_LAZY :结合           PDO :: FETCH_BOTH PDO :: FETCH_OBJ ,          在访问对象变量名时创建它们         

                   PDO :: FETCH_NUM :返回按列索引的数组          结果集中返回的数字,从第0列开始         

                   PDO :: FETCH_OBJ :返回一个匿名对象          与您在中返回的列名对应的属性名称          结果集         

       

PDOStatement::fetch

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

答案 3 :(得分:0)

你必须使用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));

}