以下PDO查询返回以下结果:
$db = new PDO('....');
$sth = $db->prepare('SELECT ...');
结果如下:
name curso
ABC stack
CDE stack
FGH stack
IJK stack
LMN overflow
OPQ overflow
RST overflow
我需要像以下一样构建HTML:
<p>stack</p>
ABC<br/>
CDE<br/>
...<br/>
<p>overflow</p>
LMN<br/>
OPQ<br/>
这就是我正在尝试的:
$sth->execute();
//$curso = $sth->fetch();
$id = $sth->fetchColumn(1);
echo "<p>".mb_convert_encoding($id,'utf-8', 'iso-8859-1').'</p>';
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
echo (mb_convert_encoding($row['name'],'utf-8', 'iso-8859-1')).'<br/>';
}
但这是删除每个组的名字,如:
<p>stack</p>
CDE<br/>
...<br/>
答案 0 :(得分:4)
这是一个有趣的问题,因为它确实不仅涉及regular PDO feature of grouping results,而且更加棘手的参数组合可以使整个代码更加平滑:
fetchAll()
一次性从查询中获取所有结果,而不是手动获取它们。PDO::FETCH_GROUP
的PDO魔术常量对结果进行分组,并将所有实际结果嵌套在子数组中。PDO::FETCH_COLUMN
结合使用,以获得嵌套数组中的列!请注意,要使用PDO::FETCH_GROUP
,您必须在第一个位置放置一个列。所以,像这样改变你的代码
$sth = $db->prepare('SELECT curso, ...');
$sth->execute(...);
$data = $sth->fetchAll(PDO::FETCH_GROUP);
现在你有一个你正在寻找的分组数组!好吧,几乎,因为它将是一个嵌套数组,必须像这样处理
foreach ($data as $curso => $section) {
echo "<p>$curso</p>";
foreach ($section as $row) {
echo $row['name']."<br>";
}
然而,如果您只需要群组中的一列,我们可以使用PDO::FETCH_COLUMN
来获取它,使代码真正流畅:
$data = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN);
foreach ($data as $curso => $names) {
echo "<p>$curso</p>";
foreach ($names as $name) {
echo $name."<br>";
}
答案 1 :(得分:0)
也许你可以尝试这种代码来打印结果:
$sth->execute();
$curso = '';
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
if ($row['curso'] !== $curso) {
$curso = $row['curso'];
echo '<p>' . mb_convert_encoding($curso, 'utf-8', 'iso-8859-1') . '</p>';
}
echo mb_convert_encoding($row['name'], 'utf-8', 'iso-8859-1') . '<br />';
}