【问题标题】:MySQL returns 2 values for every field requested [duplicate]MySQL为请求的每个字段返回2个值[重复]
【发布时间】:2015-04-09 19:31:04
【问题描述】:

使用 select 语句执行 query() 时,结果包含两个字段条目。

$sql = "select first_name, last_name from users";
$rslt = $conn->query($sql);

在上面的示例中,结果将包含数组中的 4 个项目。 2 键为递增整数,一个键设置为“first_name”,一个键设置为“last_name”。

Array ( [first_name] => Bill [0] => Bill [last_name] => Johnson [1] => Johnson )

我确定这是一个愚蠢的问题,但是有没有一种快速的方法可以改变返回结果的方式,以便每个字段只包含一个键=>值,或者有没有一种方法可以快速删除额外的数据?

我想要的最终数组是两件事之一......

要求的结果 1

Array ( [first_name] => Bill [last_name] => Johnson )

要求的结果 2

Array ( [0] => Bill [1] => Johnson )

提前致谢。

【问题讨论】:

  • $result->fetch_assoc().. 我猜你正在使用_array
  • @msfoster,这是 mysqli,不是 pdo
  • 哦,没看到标签。对不起。然而问题是一样的。
  • 对不起,我应该在消息中说明 PDO。 @msfoster 如果是同样的问题,我如何使用 PDO 完成它?

标签: php mysql pdo


【解决方案1】:

如果你使用的是PDO,你可以设置获取模式

$rslt = $conn->query($sql, PDO::FETCH_ASSOC);

它默认返回两种类型。

更多信息请参见http://php.net/manual/en/pdo.query.php

【讨论】:

  • 这正是我所需要的,谢谢!
  • @Doon 手册实际上缺少关于在query() 中使用 fetch_style 的描述。编辑:我现在在笔记中看到了。它使用其他参数并将它们作为 setFetchMode() 传递。
  • @ThrowBackDewd,如果你不想同时使用数字和关联数组,你最好操作 PDOStatement 对象而不是运行 query() 两次。
【解决方案2】:

您可以将第二个参数传递给query() 以更改模式。在你的情况下PDO::FETCH_ASSOCPDO::FETCH_NUM。我假设默认值为PDO::FETCH_BOTH,它会在结果数组中创建索引和列名。

【讨论】:

    【解决方案3】:

    查看fetch_stylefetch的手册:

    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_BOTH 和 PDO::FETCH_OBJ,创建 对象变量名,因为它们被访问

    PDO::FETCH_NAMED:返回一个形式相同的数组 PDO::FETCH_ASSOC,除非有多个列带有 同名,该键引用的值将是一个数组 具有该列名称的行中的值

    PDO::FETCH_NUM:返回一个由列号索引的数组作为返回 在您的结果集中,从第 0 列开始

    PDO::FETCH_OBJ:返回一个匿名对象,其属性名称 对应于结果集中返回的列名

    你想要的是适当的获取样式而不是PDO::FETCH_BOTH(默认)作为fetch()的第一个参数。

    你想要做的是使用query()返回的PDOStatement对象。

    $sql = "select first_name, last_name from users";
    $stmt = $conn->query($sql);
    $num = $stmt->fetchAll(PDO::FETCH_NUM);
    $assoc = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    我相信这会起作用,但我还没有测试 fetchAll 是否可以在同一个语句上运行两次。

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多