我有一个名为'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。我当然可以遍历结果集,但是有更简洁的方法吗?
答案 0 :(得分:16)
尽管PHP手册中的PDO::FETCH_UNIQUE
描述尚不清楚,但实际上它是exact parameter you actually need。
$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);
首先给你一个由SELECT子句中列出的字段索引的数组(当使用*时,然后在表定义中使用第一个字段,在你的情况下应该是id)。
请注意,默认情况下,只使用PDO::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',
),
)
答案 1 :(得分:14)
获取为关联
手册: 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_UNIQUE按位OR OR PDO :: FETCH_COLUMN。
返回按指定列的值分组的关联数组,按位ORO 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语句(即select id, brands.* from brands
等)。
此处记录了更多参数:http://php.net/manual/en/pdostatement.fetch.php,与PDO :: FETCH_UNIQUE类似,以确保每个索引仅使用一次。