5

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

4 回答 4

11

使用 PDO::FETCH_ASSOC 获取模式:

return json_encode($req->fetchAll(PDO::FETCH_ASSOC));
于 2013-10-09T09:03:47.183 回答
4

不是json_encode,这是因为您的 PDO 实例的 fetch 模式设置为PDO::FETCH_BOTH. 请参阅PDOStatement::fetchAllfetch 样式的文档。

于 2013-10-09T09:03:34.027 回答
2

用这个:

PDO::FETCH_ASSOC:返回一个按列名索引的数组,如结果集中返回的那样

PDO::FETCH_BOTH(默认):返回一个由列名和 0 索引列号索引的数组,如结果集中返回的那样

PDO::FETCH_BOUND:返回TRUE并将结果集中列的值分配给使用 PDOStatement::bindColumn() 方法绑定到的 PHP 变量

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));
于 2013-10-09T09:07:56.990 回答
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));

}

于 2013-10-09T09:05:07.560 回答