PHP PDO组按列名查询结果

时间:2016-02-13 23:39:41

标签: php pdo

以下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/>

2 个答案:

答案 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 />';
}