Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP与MySQL:高效展示单表分类及其父分类的实践指南_创想鸟

PHP与MySQL:高效展示单表分类及其父分类的实践指南

php与mysql:高效展示单表分类及其父分类的实践指南

本教程详细介绍了如何利用PHP和MySQL,将存储在单一数据库表中的层级分类数据(如主分类和子分类)以扁平化的表格形式进行展示。核心方法是运用SQL的自连接(LEFT JOIN)查询,有效地关联子分类与其父分类,并通过PHP代码将查询结果格式化输出为清晰的HTML表格,确保所有分类及其对应的父分类信息一目了然。

在Web应用开发中,处理具有层级关系的数据是常见需求,例如产品分类、文章标签等。有时,为了简化数据模型,所有层级的数据都存储在同一个数据库表中,并通过一个 parent_id 字段来指示其父级关系。本文将指导您如何使用PHP和MySQL,从这种单表中高效地提取并展示所有分类及其对应的父分类名称。

1. 数据模型概述

我们假设有一个名为 category_table 的MySQL表,用于存储所有分类信息。其结构如下:

字段名 类型 描述

idINT分类唯一标识符(主键)categoryVARCHAR分类名称parent_idINT父分类的 id。如果为顶级分类,则此字段为 NULL。

示例数据:

立即学习“PHP免费学习笔记(深入)”;

id category parent_id

1category1NULL2category2NULL3category3NULL4subcategory425subcategory516subcategory637subcategory71

我们的目标是生成一个表格,包含所有分类的名称,以及它们对应的父分类名称(如果存在)。

2. 核心思路:SQL自连接(Self-Join)

要在一个查询中同时获取分类及其父分类的信息,我们需要将 category_table 与其自身进行连接。这种操作被称为“自连接”。

2.1 为什么选择 LEFT JOIN?

在自连接中,有两种常见的连接类型:INNER JOIN 和 LEFT JOIN。

INNER JOIN:只返回在两个表中都存在匹配项的行。如果使用 INNER JOIN,则只会返回有父分类的子分类,而那些 parent_id 为 NULL 的顶级分类将不会出现在结果中。LEFT JOIN:返回左表(category_table)中的所有行,即使右表(作为父分类的 category_table)中没有匹配项。对于没有匹配项的行,右表对应的列将显示 NULL。这正是我们需要的,因为我们希望列出所有分类,包括顶级分类(它们的父分类字段为空)。

因此,LEFT JOIN 是实现我们目标的最佳选择。

2.2 SQL查询语句

以下是用于获取分类及其父分类信息的SQL查询:

SELECT    c.id AS category_id,    c.category AS category_name,    p.category AS parent_category_nameFROM    category_table cLEFT JOIN    category_table p ON c.parent_id = p.idORDER BY    c.id;

查询解析:

FROM category_table c: 将 category_table 视为“子分类”表,并为其指定别名 c。LEFT JOIN category_table p ON c.parent_id = p.id: 再次引用 category_table,但这次将其视为“父分类”表,并指定别名 p。连接条件是子分类 c 的 parent_id 等于父分类 p 的 id。SELECT c.id AS category_id, c.category AS category_name, p.category AS parent_category_name: 选取子分类的 id 和 category 名称,以及父分类 p 的 category 名称。使用别名使结果列更具可读性。ORDER BY c.id: 按照分类ID排序结果,便于查看。

执行此查询后,您将获得如下结果集:

category_id category_name parent_category_name

1category1NULL2category2NULL3category3NULL4subcategory4category25subcategory5category16subcategory6category37subcategory7category1

这正是我们期望的数据结构。

3. PHP实现:数据获取与展示

接下来,我们将使用PHP连接MySQL数据库,执行上述SQL查询,并将结果动态生成一个HTML表格。

<?php// 1. 数据库连接配置$servername = "localhost";$username = "your_username"; // 替换为您的数据库用户名$password = "your_password"; // 替换为您的数据库密码$dbname = "your_database";   // 替换为您的数据库名// 创建数据库连接$con = mysqli_connect($servername, $username, $password, $dbname);// 检查连接是否成功if (!$con) {    die("数据库连接失败: " . mysqli_connect_error());}// 2. SQL查询语句$sql = "SELECT            c.id AS category_id,            c.category AS category_name,            p.category AS parent_category_name        FROM            category_table c        LEFT JOIN            category_table p ON c.parent_id = p.id        ORDER BY            c.id;";// 3. 执行查询$result = mysqli_query($con, $sql);// 检查查询是否成功if (!$result) {    die("查询失败: " . mysqli_error($con));}// 4. 生成HTML表格$html = "";$html .= "";$html .= "";// 遍历查询结果集while ($row = mysqli_fetch_assoc($result)) {    // 处理父分类名称,如果为NULL则显示为空字符串    $parentCategoryName = $row['parent_category_name'] ?? '';    $html .= "";    $html .= "";    $html .= "";    $html .= "";}$html .= "";$html .= "
分类名称父分类名称
" . htmlspecialchars($row['category_name']) . "" . htmlspecialchars($parentCategoryName) . "
";// 5. 输出HTMLecho $html;// 6. 关闭数据库连接mysqli_close($con);?>

代码解析:

数据库连接: 使用 mysqli_connect() 函数建立与MySQL数据库的连接。请务必替换示例中的数据库凭据。错误处理: 在数据库连接和查询执行后,都加入了错误检查,以便在出现问题时提供有用的调试信息。SQL查询: 直接将前面构造好的 LEFT JOIN 查询字符串赋值给 $sql 变量。结果处理:mysqli_query() 执行SQL查询。mysqli_fetch_assoc() 逐行获取结果集,每行作为一个关联数组。$parentCategoryName = $row[‘parent_category_name’] ?? ”; 使用PHP 7+ 的空合并运算符 (??) 来优雅地处理父分类名称为 NULL 的情况,将其显示为空字符串而不是 “NULL”。htmlspecialchars() 函数用于转义HTML特殊字符,防止跨站脚本攻击(XSS),提高安全性。HTML生成: 逐步构建HTML表格的字符串,包括表头和数据行。关闭连接: mysqli_close() 在脚本执行完毕后关闭数据库连接,释放资源。

4. 运行效果

将上述PHP代码保存为一个 .php 文件,并在Web服务器上运行,您将看到一个格式整齐的HTML表格,其输出效果与期望的输出完全一致:

分类名称 父分类名称

category1category2category3subcategory4category2subcategory5category1subcategory6category3subcategory7category1

5. 注意事项

安全性: 在实际生产环境中,请确保您的数据库连接信息(用户名、密码等)不直接硬编码在代码中,或至少通过更安全的方式(如环境变量、配置文件)进行管理。同时,对所有用户输入的数据进行严格的验证和清理。错误处理: 生产环境中的错误处理应更加健壮,例如记录错误日志而不是直接 die(),并向用户显示友好的错误消息。数据库抽象层: 对于更复杂的应用,建议使用PDO或ORM(如Laravel Eloquent)等数据库抽象层,它们能提供更强大的功能、更好的安全性和更简洁的代码。性能优化: 对于非常大的分类表,确保 id 和 parent_id 字段上建立了索引,这将显著提高查询性能。多级嵌套: 本教程的方法适用于两级(父子)关系。如果您的分类存在多级深度嵌套(例如:祖父 -> 父 -> 子),则可能需要采用递归查询(如果数据库支持,如MySQL 8+ 的CTE)或在PHP中构建树形结构后再进行扁平化处理。

6. 总结

通过本教程,我们学习了如何利用SQL的自连接(特别是 LEFT JOIN)在单一数据库表中高效地查询具有父子关系的分类数据,并使用PHP将其格式化为用户友好的HTML表格。这种方法简洁、高效,是处理此类常见数据展示需求的一种标准实践。掌握自连接技巧对于处理复杂的关系型数据库查询至关重要。

以上就是PHP与MySQL:高效展示单表分类及其父分类的实践指南的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1334674.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Laravel Blade中实现条件性DOM元素分组渲染
上一篇 2025年12月12日 20:30:55
PHP持久化用户登录会话管理教程
下一篇 2025年12月12日 20:31:05

相关推荐

  • MySQL与SQL Server功能对比:哪个更适合您的业务需求?

    MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?MySQL与SQL Server功能对比:哪个更适合您的业务需求?

    MySQL与SQL Server功能对比:哪个更适合您的业务需求? 在当今数字化时代,数据库技术扮演着至关重要的角色,其中MySQL和SQL Server是两个备受关注的关系型数据库管理系统。无论是中小型企业还是大型企业,选择适合自身业务需求的数据库管理系统至关重要。本文将对MySQL和SQL Se…

    2026年9月25日 • 用户投稿
    200
  • 对话逐际动力张巍:造机器人很容易,关键是用起来

    对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来对话逐际动力张巍:造机器人很容易,关键是用起来

    “让天下没有难落地的机器人。” 在这样向量子位表达定位和使命后,逐际动力”解释了”为何会成为阿里投资的第一家具身智能机器人公司。 在这样解释定位和使命后,量子位大概感受到了逐际动力被投资的原因—— 至少是成为阿里第一个具身智能投资项目的原因。 实际上,…

    2026年9月25日 • 用户投稿
    500
  • Word文档全选文本怎么做_Word文档全选文本如何做详细方法

    Word文档全选文本怎么做_Word文档全选文本如何做详细方法Word文档全选文本怎么做_Word文档全选文本如何做详细方法Word文档全选文本怎么做_Word文档全选文本如何做详细方法Word文档全选文本怎么做_Word文档全选文本如何做详细方法

    全选Word文档最常用方法是使用快捷键Ctrl+A(Windows)或Command+A(Mac),可快速选中全部内容;也可通过“开始”选项卡中“编辑”组的“选择”命令进行全选;小文档可用鼠标拖动选中;在分节或多栏文档中需确保页面视图并尝试双击“全选”以避免遗漏,推荐优先使用快捷键操作。 在Word…

    2026年9月25日 • 用户投稿
    600
  • Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    可通过设置阻止Chrome自动加载媒体。①针对特定网站:点击地址栏锁形图标→网站设置→将“自动播放”设为不允许;②全局禁用:进入chrome://settings/content→自动播放→设为默认不允许;③使用扩展如uBlock Origin拦截媒体加载;④启用Lite模式以节省数据并延迟媒体加载…

    2026年9月25日 • 用户投稿
    300
  • sublime怎么跳转到指定行_sublime快速定位行号的方法

    sublime怎么跳转到指定行_sublime快速定位行号的方法sublime怎么跳转到指定行_sublime快速定位行号的方法sublime怎么跳转到指定行_sublime快速定位行号的方法sublime怎么跳转到指定行_sublime快速定位行号的方法

    跳转到指定行可通过快捷键实现:Windows/Linux按Ctrl + G,Mac按Cmd + G,弹出对话框后输入行号(如50)或行:列(如50:10)即可定位,状态栏双击亦可打开该对话框,还可通过命令面板输入“goto line”进行跳转,其中快捷键方式最快捷。 在 Sublime Text 中…

    2026年9月25日 • 用户投稿
    700
  • sublime怎么查看和安装主题_Sublime主题安装与切换美化教程

    sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程sublime怎么查看和安装主题_Sublime主题安装与切换美化教程

    在Sublime Text中更换和安装主题能显著提升编码体验,让界面更美观、更符合个人习惯。下面详细介绍如何查看、安装以及切换主题。 查看当前使用的主题 要确认当前Sublime Text正在使用哪个主题,可以打开命令面板: 按下 Ctrl+Shift+P(Windows/Linux)或 Cmd+S…

    2026年9月25日 • 用户投稿
    600
  • qq浏览器怎么设置网页编码 QQ浏览器网页乱码与编码格式调整方法

    qq浏览器怎么设置网页编码 QQ浏览器网页乱码与编码格式调整方法qq浏览器怎么设置网页编码 QQ浏览器网页乱码与编码格式调整方法qq浏览器怎么设置网页编码 QQ浏览器网页乱码与编码格式调整方法qq浏览器怎么设置网页编码 QQ浏览器网页乱码与编码格式调整方法

    首先尝试手动切换网页编码格式,点击QQ浏览器右上角菜单,选择“编码”后依次尝试GBK、GB2312或UTF-8;若需长期解决,可在设置中进入高级选项,将默认编码设为GBK;此外,部分版本支持在页面空白处右键直接更改编码,提升操作效率。 如果您在使用QQ浏览器访问某些网页时出现乱码问题,可能是由于浏览…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么显示行号 _sublime行号显示设置

    sublime怎么显示行号 _sublime行号显示设置sublime怎么显示行号 _sublime行号显示设置sublime怎么显示行号 _sublime行号显示设置sublime怎么显示行号 _sublime行号显示设置

    开启行号显示需点击View→Gutter→勾选Line Numbers,或在用户设置中添加”line_numbers”: true即可生效,部分面板不显示属正常现象。 Sublime Text 显示行号非常简单,只需要开启行号显示选项即可。默认情况下,Sublime Text…

    2026年9月25日 • 用户投稿
    000
  • 参加PHP+MySQL就业培训后能获得的岗位有哪些

    参加php+mysql就业培训后,你可以获得以下岗位:1. web开发工程师,利用php和mysql开发动态网站和web应用程序;2. 后端开发工程师,使用php构建后端服务和api;3. 全栈开发工程师,结合前端技术进行全站开发;4. 数据库管理员,负责mysql数据库的设计、优化和维护;5. 软…

    2026年9月25日
    400
  • sublime如何设置默认换行符 _sublime默认换行符配置方法

    sublime如何设置默认换行符 _sublime默认换行符配置方法sublime如何设置默认换行符 _sublime默认换行符配置方法sublime如何设置默认换行符 _sublime默认换行符配置方法sublime如何设置默认换行符 _sublime默认换行符配置方法

    设置默认换行符需在用户配置中添加”default_line_ending”参数,如设为”unix”则新建文件使用LF格式,支持windows、unix、mac选项,修改后通过右下角切换并保存文件应用新格式。 Sublime Text 默认换行符可以通过…

    2026年9月25日 • 用户投稿
    000
  • AI 图像水印失守!开源工具 5 分钟内抹除所有水印

    AI 图像水印失守!开源工具 5 分钟内抹除所有水印AI 图像水印失守!开源工具 5 分钟内抹除所有水印AI 图像水印失守!开源工具 5 分钟内抹除所有水印AI 图像水印失守!开源工具 5 分钟内抹除所有水印

    ai 图像的水印技术正面临重大挑战! 一种名为 UnMarker 的新型去水印技术横空出世,宣称可在短短5分钟内清除市面上绝大多数 AI 生成图像中的水印。 该技术已成功完全破解谷歌的 HiDDeN 水印系统,对另一款 Google 水印技术 SynthID 的破解率也达到了79%。 更令人震惊的是…

    2026年9月25日 • 用户投稿
    000
  • 如何在微服务之间共享静态数据

    如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据

    微服务架构的本质决定了微服务之间无法直接共享静态变量。正如上面摘要所说,每个微服务都是一个独立的进程,拥有自己的内存空间,静态变量只在其所属的进程内有效。试图在一个微服务中访问另一个微服务的静态变量,就像试图在一个独立的Java程序中访问另一个程序的变量一样,是不可能的。 微服务架构的独立性 微服务…

    2026年9月25日 • 用户投稿
    100
  • FineReport与.NET集成要点

    FineReport与.NET集成要点FineReport与.NET集成要点FineReport与.NET集成要点FineReport与.NET集成要点

    1、FineReport(FR)与.NET项目的集成主要涵盖三个核心部分,如上图所示。 2、报表发布是集成过程中的关键步骤之一。 3、需要注意的是,FR报表工程本质上是基于Java的Servlet应用,无法由IIS直接解析处理,因此必须将其部署在支持Servlet规范的Web应用服务器(如Tomca…

    2026年9月25日 • 用户投稿
    200
  • Linux系统与Windows系统在资源管理机制上有何差异?

    Linux在服务器领域因cgroups、procfs、ulimit和可调内核参数等机制,提供对资源的精细控制与高透明度;而Windows则通过WDDM、DirectX、优先调度UI线程及完善的驱动生态,优化桌面与多媒体体验,注重流畅性与兼容性。 Linux系统和Windows系统在资源管理机制上存在…

    2026年9月25日
    200
  • 2025年输入指令就可以生成图片的ai免费工具有哪些?

    2025年免费AI图像生成工具将主要来自开源项目、大公司免费额度、独立开发者工具及云平台免费套餐,如Stable Diffusion类开源模型、谷歌微软等集成服务、专注特定领域的在线工具,以及利用AWS、Azure等云平台资源,但通常存在生成速度慢、图像质量低、功能受限、使用次数限制、隐私风险和水印…

    2026年9月25日
    200
  • 拼多多第三方推广工具哪个好用?用什么推广最好?功能、数据、合作、预算——四维拆解选对方案!

    拼多多第三方推广工具哪个好用?用什么推广最好?功能、数据、合作、预算——四维拆解选对方案!拼多多第三方推广工具哪个好用?用什么推广最好?功能、数据、合作、预算——四维拆解选对方案!拼多多第三方推广工具哪个好用?用什么推广最好?功能、数据、合作、预算——四维拆解选对方案!拼多多第三方推广工具哪个好用?用什么推广最好?功能、数据、合作、预算——四维拆解选对方案!

    在拼多多这个充满挑战与机遇的电商环境中,每一位商家都希望自己的商品能够脱颖而出,获得更高的销量与曝光。虽然平台自带的广告系统提供了基础支持,但越来越多商家开始将目光投向第三方推广工具,试图通过更灵活、多元的方式实现突破。那么,面对琳琅满目的第三方推广渠道,究竟哪一款更实用?又该选择哪种推广方式才能事…

    2026年9月25日 • 用户投稿
    1000
  • 怎么用mysql创建数据表

    怎么用mysql创建数据表怎么用mysql创建数据表怎么用mysql创建数据表怎么用mysql创建数据表

    要在 MySQL 中创建数据表,请按照以下步骤操作:使用 CREATE TABLE 语句,指定表名。定义列名和数据类型,例如文本(varchar)、整数(int)、日期(date)等。根据需要设置约束,例如主键(PRIMARY KEY)、唯一约束(UNIQUE)或非空约束(NOT NULL)。使用分…

    2026年9月25日 • 用户投稿
    100
  • Laravel 中Eloquent ORM 相关操作

    定义 操作 获取(查询) 获取集合,(查询列表) 返回值是 IlluminateDatabaseEloquentCollection 的一个实例 获取所有的数据 use AppUser;$users = User::all(); 条件获取列表 $users = User::where(‘active…

    2026年9月25日
    600
  • mysql怎么创建数据库关系图

    mysql怎么创建数据库关系图mysql怎么创建数据库关系图mysql怎么创建数据库关系图mysql怎么创建数据库关系图

    答案:可以通过使用 MySQL Workbench 工具创建 MySQL 数据库关系图。步骤:导入数据库。创建关系模型,将表和视图拖放到画布上。使用外键连接表。调整布局。生成关系图。 如何创建 MySQL 数据库关系图? MySQL 关系图是可视化表示数据库架构的图表,它显示了表之间的关系。创建关系…

    2026年9月25日 • 用户投稿
    100
  • qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法

    qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法

    1、通过系统设置卸载QQ浏览器主程序;2、使用腾讯柠檬等清理工具扫描并清除残留文件;3、手动检查Android/data/com.tencent.mtt/等路径删除遗留数据。 如果您在卸载QQ浏览器后发现仍有文件或数据残留,可能是因为标准卸载流程未能清除所有相关项。以下是几种彻底移除QQ浏览器及其残…

    2026年9月25日 • 用户投稿
    900

发表回复

登录后才能评论
关注微信