PHP PDO 按列名分组查询结果

2 php pdo

以下 PDO 查询返回以下结果:

$db = new PDO('....');
$sth = $db->prepare('SELECT ...'); 
Run Code Online (Sandbox Code Playgroud)

这些是结果:

 name   curso   
ABC stack
CDE stack
FGH stack
IJK stack
LMN overflow
OPQ overflow
RST overflow
Run Code Online (Sandbox Code Playgroud)

我需要像这样构建 HTML:

<p>stack</p>
ABC<br/>
CDE<br/>
...<br/>
<p>overflow</p>
LMN<br/>
OPQ<br/>
Run Code Online (Sandbox Code Playgroud)

这就是我正在尝试的:

$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/>';
  }
Run Code Online (Sandbox Code Playgroud)

但这是删除每个组的名字,例如:

 <p>stack</p>
    CDE<br/>
    ...<br/>
Run Code Online (Sandbox Code Playgroud)

You*_*nse 5

这是一个有趣的问题,因为它不仅涉及到分组结果的常规 PDO 功能还涉及更棘手的参数组合,可以使整个代码更加流畅:

  • 首先,您必须使用fetchAll()一次从查询中获取所有结果,而不是手动获取它们。
  • 然后你必须使用 PDO 魔法常量命名PDO::FETCH_GROUP来对结果进行分组,并将所有实际结果嵌套在子数组中。
  • 最后,您可以将它与另一个常量 , 结合起来PDO::FETCH_COLUMN,以在嵌套数组中获得一列!

请注意,为了使用PDO::FETCH_GROUP,您必须在第一个位置放置一个要分组的列。所以,像这样改变你的代码

$sth = $db->prepare('SELECT curso, ...'); 
$sth->execute(...);
$data = $sth->fetchAll(PDO::FETCH_GROUP);
Run Code Online (Sandbox Code Playgroud)

现在你有一个你正在寻找的分组数组!好吧,几乎,因为它将是一个嵌套数组,必须像这样处理

foreach ($data as $curso => $section) {
    echo "<p>$curso</p>"; 
    foreach ($section as $row) {
        echo $row['name']."<br>"; 
}
Run Code Online (Sandbox Code Playgroud)

然而,如果您只需要组中的一列,我们可以使用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>"; 
}
Run Code Online (Sandbox Code Playgroud)