【问题标题】:Why json_encode() return keys values twice (index key and string key)?为什么 json_encode() 返回键值两次(索引键和字符串键)?
【发布时间】:2013-10-16 12:57:35
【问题描述】:

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

没有索引键怎么办?

【问题讨论】:

  • 他没有意识到 SQL 查询返回的是关联数组 + 普通索引值。否决这个问题相当OTT。
  • 试试这个:return json_encode($req->fetchAll(PDO::FETCH_ASSOC));

标签: php indexing key json


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 PDO::FETCH_ASSOC 获取模式:

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

    【讨论】:

      【解决方案3】:

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

      }

      【讨论】:

        【解决方案4】:

        使用这个:

        PDO::FETCH_ASSOC:返回一个按列索引的数组 结果集中返回的名称 PDO::FETCH_BOTH(默认):返回一个由索引索引的数组 在您的 结果集 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));
        

        【讨论】:

          猜你喜欢
          • 2019-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 2017-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多