直接查information_schema.columns是最稳定方式,关键字段column_comment存注释内容;需显式指定table_schema,空注释返回空字符串而非null,建议按table_name和ordinal_position排序,并用表名为键组织php数组结构。

如何用 PHP 一次性读取所有表的字段注释
直接查 information_schema.COLUMNS 是最稳定的方式,不用依赖客户端工具或手动点 Navicat。关键字段是 COLUMN_COMMENT,它存的就是你用 COMMENT 'xxx' 写进去的内容。
注意三点:
-
TABLE_SCHEMA必须显式指定数据库名,不能留空或用database()函数(某些权限下会报错) -
COLUMN_COMMENT是字符串类型,空注释返回空字符串'',不是NULL,判断时别写成IS NULL - 字段顺序默认按
ORDINAL_POSITION,但如果你要导出为文档,建议加ORDER BY TABLE_NAME, ORDINAL_POSITION保证可读性
示例 SQL:
SELECT TABLE_NAME AS `表名`, COLUMN_NAME AS `字段名`, COLUMN_TYPE AS `类型`, IS_NULLABLE AS `允许为空`, COLUMN_DEFAULT AS `默认值`, COLUMN_COMMENT AS `注释` FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db_name' ORDER BY TABLE_NAME, ORDINAL_POSITION;
PHP 中执行并格式化为数组结构
别用 mysqli_fetch_all(MYSQLI_ASSOC) 一股脑拉平——字段注释要按表归组,否则后续生成 Markdown 或 Excel 文档时还得再遍历合并。
推荐结构:$docs['user']['id'] = ['type' => 'BIGINT', 'comment' => '主键'];
实操要点:
- 用
mysqli::query()执行上面那条 SQL,不要用multi_query,纯查无需多语句 - 循环结果时,用
$row['表名']作为一级键,避免硬编码字段索引(列序变动就崩) - 如果某字段没写注释,
$row['注释']是空字符串,建议统一转成'-'或null,避免导出时出现空白单元格干扰阅读
导出为 Markdown 表格时的常见坑
MySQL 字段类型如 varchar(255)、datetime、tinyint(1) 直接塞进 Markdown 表格没问题,但以下情况容易翻车:
-
COLUMN_COMMENT里含换行符(\n)或竖线|:Markdown 表格会错位,必须用str_replace(["\n", "|"], [" ", "|"], $comment)预处理 - 字段名含反引号或中文:PHP 生成字符串时无需转义,但写进 Markdown 表头时建议用双引号包裹,比如
"`user_id`"而不是`user_id`(后者在某些解析器里会被误判) - 表太多导致单个 Markdown 文件超 1000 行:Git diff 和编辑器加载变慢,建议按前缀拆分,例如
user_*.md、order_*.md
配合 phpEnv 自动生成文档的最小可行脚本
phpEnv 默认不带命令行入口,所以得自己写个 gen_docs.php 放在项目根目录,通过 php gen_docs.php 触发。
核心逻辑就三步:
- 从
$_ENV['DB_DATABASE']或配置文件读库名(别硬编码) - 用
mysqli_connect()连接,失败时die("DB connect failed: " . mysqli_connect_error()) - 查完数据后,用
file_put_contents('docs/fields.md', $markdown)覆盖写入,别用FILE_APPEND,否则每次跑都叠加上去
最后一句提醒:字段注释不会自动同步到代码里的 PHPDoc,如果你们团队要求 PHP 类属性也带说明,得额外写个解析器匹配字段名和 @property 标签——这事没法靠 MySQL 元数据全自动完成。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











