PHP PDO 按列名对查询结果进行分组

2024-04-24

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

这是一个有趣的问题,因为它不仅涉及常规 PDO 功能分组结果 https://phpdelusions.net/pdo#group,但是更棘手的参数组合可以使整个代码更加流畅:

  • 首先,你必须使用fetchAll()一次获取查询的所有结果,而不是手动获取它们。
  • 然后你必须使用 PDO 魔术常量命名PDO::FETCH_GROUP对结果进行分组并将所有实际结果嵌套在子数组中。
  • 最后,你可以将它与另一个常数结合起来,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>"; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP PDO 按列名对查询结果进行分组 的相关文章

随机推荐

  • 与 Post 进行交叉呼叫,但在飞行前失败

    我必须从我的网站向第三方域 服务器进行网络服务调用 当我使用 jQuery Ajax by Post 方法和 content type text plain 进行此调用时 它工作正常 但是 当我将其更改为 content type text
  • 如何隐藏 WPF ListView 的标头?

    我希望能够隐藏 WPF ListView 中每个网格列顶部的标题 这是我的 ListView 的 XAML
  • 在同一 URL 上运行 SOAP 和 RESTful

    假设我们有一个响应主机标头 kebab shop intra net 的网站 此 URL 中是否可以同时包含 SOAP 和 RESTful 也就是说 这两者都是在已部署的代码中处理的 kebab shop intra net takeawa
  • 在我的绘画程序中绘制矩形时出现错误

    public partial class Form1 Form Point downPoint upPoint List
  • iPhone HTML5 音频标签不起作用

    我遇到了音频标签无法在 iPonhe 上工作的问题 在 W3Schools 网站上测试时它可以播放 HTML5 音频标签 但不适用于我下面的网站
  • 使用 awk 添加列。这个 awk 命令有什么问题?

    我想将两列添加到大约 10 000 列的文件中 我想在每行插入 nr 22 作为第一列 然后我想要将原始第一列作为第二列 然后作为第三列我想要插入第 nr NR 行 之后我想要打印其余的原始列 我想我可以用下面的 awk 行来做到这一点 a
  • Google 地图 API - 添加多个目的地不起作用(谷歌方向)

    我在创建 复制谷歌地图方向功能时遇到问题 当我有 从 到 字段时 我可以让它正常工作 但一旦我尝试添加多个目的地 它就不起作用 我看过我们 但我没有得到任何很好的示例教程来展示这是如何完成的 以下是我到目前为止所做的事情 但我很确定这件事做
  • Mac 上 Docker 内的 Xdebug 无法工作

    我将本地开发设置从 Linux 移植到新的 Mac 机器 但在让 Xdebug 在 Mac M1 Pro 机器中与 PhpStorm 配合使用时遇到问题 我有一个包含 PHP 的容器 其中 Xdebug 安装并配置如下 zend exten
  • 安装APK时缺少lib文件夹

    我想知道如何构建我的 APK 以便我的库安装 复制到 data data
  • Rails 开发服务器、PDFKit 和多线程

    我有一个 Rails 应用程序 它使用 PDFKit 来呈现网页的 pdf 版本 我使用 Thin 作为开发服务器 问题是当我处于开发模式时 当我使用 bundle execrails s 启动服务器并尝试渲染任何 PDF 时 整个过程陷入
  • “实例显示状态”无法编译

    这是我试图弄清楚的 State Monad 代码 data State a State Int gt a Int instance Monad State where return x State c gt x c State m gt g
  • 如何忽略 Eclipse 中特定类型的未捕获异常?

    我在我的 Java 应用程序中使用第三方库 这个第三方库在每次应用程序启动时都会引发自定义的未捕获异常 该异常是无害的 仅用于第三方库内部记录的目的 由于未捕获此异常 它会导致我的 Eclipse IDE 切换到调试视角 并在每次启动应用程
  • D3:打字机风格的文本过渡

    In this jsfiddle http jsfiddle net VividD QbysN 标签通过减小旧文本的字体 然后增加新文本的字体 从一个文本过渡到另一个文本 但是 我希望新文本以 打字机 方式出现 就像这样jsfiddle h
  • Angular 应用程序仅在 IE11 上抛出语法错误

    我有 Angular 应用程序 该应用程序仅适用于 IE11 我已经设置了polyfills import core js es6 symbol import core js es6 object import core js es6 fu
  • 复制构造函数创建依赖副本

    我按照描述实现了复制构造函数here https stackoverflow com questions 15020850 copy constructors and defensive copying 但问题仍然是当我更新时route c
  • 带图像背景的 Outlook 2013 HTML 签名

    我找到了另一个线程 Outlook 2013 背景图像损坏 https stackoverflow com questions 22613230 outlook 2013 background image broken 但是我无法发表评论
  • Pod 清单写入 Deployment Manifest

    在 Kubernetes 中 将正在运行的 pod 清单转换为具有 x 个副本的部署的简单方法是什么 我尝试获取清单 k get po xyz o yaml gt po1 yaml 然后编辑 yaml 并与部署清单匹配 但这似乎并不容易 我
  • 如何替换 randomForest r 包中的引导步骤

    首先是一些背景信息 这在 stats stackexchange 上可能更有趣 在我的数据分析中 我尝试比较不同机器学习方法在时间序列数据上的性能 回归 而不是分类 例如 我训练了一个 Boosting 训练模型 并将其与随机森林训练模型
  • MVC3 将多个字段验证为单个属性

    我正在尝试验证包含两个字段的电话号码 第一个字段显示区号 另一个字段显示剩余的电话号码数字 要求是 它们都是必需的 它们必须是数字 区号字段最多为 6 位数字 电话号码字段最多为 10 位数字 两个字段都需要显示一条消息 例如 如果缺少区号
  • PHP PDO 按列名对查询结果进行分组

    以下 PDO 查询返回以下结果 db new PDO sth db gt prepare SELECT 结果如下 name curso ABC stack CDE stack FGH stack IJK stack LMN overflow