使用 PDO::FETCH_COLUMN 與 PDO::FETCH_GROUP 時要小心。預設情況下,結果會按第一欄(索引 0)分組,並返回第二欄(索引 1)。但是,如果您提供 fetch 參數,它不會影響返回的欄位,而是會影響分組欄位。如果明確設定分組欄位,則會返回第一欄而不是第二欄。
<?php
$insert = $dbh->prepare("INSERT INTO people(id, gender) VALUES (?, ?)");
$insert->execute(array('2', 'female'));
$insert->execute(array('3', 'female'));
$insert->execute(array('4', 'female'));
$insert->execute(array('5', 'male'));
$insert->execute(array('6', 'male'));
$sth = $dbh->prepare("SELECT gender, id FROM people");
$sth->execute();
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP));
?>
返回
<?php
array (size=2)
'female' =>
array (size=3)
0 => string '2' (length=1)
1 => string '3' (length=1)
2 => string '4' (length=1)
'male' =>
array (size=2)
0 => string '5' (length=1)
1 => string '6' (length=1)
?>
但是,
<?php
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP, 0));
?>
返回
<?php
array (size=2)
'female' =>
array (size=3)
0 => string 'female' (length=1)
1 => string 'female' (length=1)
2 => string 'female' (length=1)
'male' =>
array (size=2)
0 => string 'male' (length=1)
1 => string 'male' (length=1)
?>
and
<?php
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP, 1));
?>
返回
<?php
array (size=5)
2 =>
array (size=1)
0 => string 'female' (length=1)
3 =>
array (size=1)
0 => string 'female' (length=1)
4 =>
array (size=1)
0 => string 'female' (length=1)
5 =>
array (size=1)
0 => string 'male' (length=1)
6 =>
array (size=1)
0 => string 'male' (length=1)
?>
第一欄會被回傳,並且會根據提供的欄位索引進行分組。