16

我有一个名为“brands”的 SQL 表,其中包含 id、name、url 列。在那个表中,我有这个数据集:

1, Solidfloor, solidfloor;
2, Quickstep, quickstep;
4, Cleanfloor, cleanfloor;
5, Blue Dolphin, blue-dolphin;
6, Krono, krono;
8, Meister, meister;

我现在正在获取它们,并得到一个不错的数组作为回报,但是,我需要数组的索引不是递增的数字,而是该特定行的 id。我当然可以遍历结果集,但是有没有更简洁的方法呢?

4

2 回答 2

19

虽然PDO::FETCH_UNIQUEPHP 手册中的描述很不清楚,但实际上它是您实际需要的确切参数

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);

正在为您提供一个由 SELECT 子句中列出的字段索引的数组(当使用 * 时,然后是表定义中的第一个字段,在您的情况下应该是 id )。

请注意,默认情况下,使用 justPDO::FETCH_UNIQUE将为您提供具有双倍值的结果行。您可以为此调用添加首选行模式,或者 - 更好的是,为构造函数中的所有 PDO 调用设置一次或通过setAttribute(). 下面的输出显示为PDO::FETCH_ASSOC设置为默认获取模式。

  1 => array (
    'name' => 'Solidfloor',
    'url' => 'solidfloor',
  ),
  2 => array (
    'name' => 'Quickstep',
    'url' => 'quickstep',
  ),
  4 => array (
    'name' => 'Cleanfloor',
    'url' => 'cleanfloor',
  ),
)
于 2016-04-14T10:58:14.897 回答
13

获取 assoc

对于手册: http: //php.net/manual/en/pdostatement.fetchall.php

fetch_style

控制返回数组的内容,如 PDOStatement::fetch() 中所述。默认为 PDO::ATTR_DEFAULT_FETCH_MODE 的值(默认为 PDO::FETCH_BOTH)

要返回由结果集中单个列的所有值组成的数组,请指定 PDO::FETCH_COLUMN。您可以使用 column-index 参数指定所需的列。

要从结果集中仅获取单个列的唯一值,请按位或 PDO::FETCH_COLUMN 与 PDO::FETCH_UNIQUE。

要返回按指定列的值分组的关联数组,请按位或 PDO::FETCH_COLUMN 与 PDO::FETCH_GROUP。

最后一点是关键。它似乎没有完全记录(我可以找到),但是您可以将 PDO::FETCH_ASSOC 与 PDO::FETCH_GROUP 结合起来,而不是 PDO::FETCH_COLUMN,以实现所需的结果:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)

因此,鉴于上述数据:

$stmt = $PDO_obj->prepare('select * from brands');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
d($result);

结果是:

array (6) [
    '1' => array (1) [
        array (2) [
            'name' => string (10) "Solidfloor"
            'url' => string (10) "solidfloor"
        ]
    ]
    '2' => array (1) [
        array (2) [
            'name' => string (9) "Quickstep"
            'url' => string (9) "quickstep"
        ]
    ]
    '4' => array (1) [
        array (2) [
            'name' => string (10) "Cleanfloor"
            'url' => string (10) "cleanfloor"
        ]
    ]
    '5' => array (1) [
        array (2) [
            'name' => string (12) "Blue Dolphin"
            'url' => string (12) "blue-dolphin"
        ]
    ]
    '6' => array (1) [
        array (2) [
            'name' => string (5) "Krono"
            'url' => string (5) "krono"
        ]
    ]
    '8' => array (1) [
        array (2) [
            'name' => string (7) "Meister"
            'url' => string (7) "meister"
        ]
    ]
]

( d() 只是 kint 库中一个方便的调试函数,如 var_dump() 或 print_r() )

请注意,用于索引数组的列将始终是结果中的第一列,因此您可以修改您的 select 语句以选择您想要的列。还要注意,索引列将从每一行的数组中删除;为了解决这个问题,您可以将该列两次添加到您的选择语句中(即select id, brands.* from brands,等)。

此处记录了更多参数:http ://php.net/manual/en/pdostatement.fetch.php,例如 PDO::FETCH_UNIQUE 以确保每个索引仅使用一次。

于 2012-10-11T07:32:26.033 回答