php生成数据字典需直查information_schema获取字段注释、约束及真实类型,禁用pdo模拟预处理以确保类型准确,并对markdown输出做局部转义避免格式破坏。

PHP 本身不带 AI 能力,所谓“AI 自动生成数据字典”,本质是用 PHP 脚本读取数据库结构,结合规则/模板生成结构化文档——真正的“智能”只体现在字段注释提取、类型映射、关系推断等逻辑里,不是调个大模型 API 就完事。
怎么从 MySQL 读出真实字段注释和约束
很多脚本只查 DESCRIBE table_name,结果漏掉 COMMENT、外键、默认值、是否允许 NULL。正确做法是直接查 INFORMATION_SCHEMA.COLUMNS 和 INFORMATION_SCHEMA.KEY_COLUMN_USAGE:
$sql = "SELECT
COLUMN_NAME,
DATA_TYPE,
IS_NULLABLE,
COLUMN_DEFAULT,
COLUMN_COMMENT,
EXTRA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION";
注意:COLUMN_COMMENT 是人工写的注释,必须依赖它才能生成有意义的字典;EXTRA 字段能告诉你是不是 auto_increment;IS_NULLABLE 比靠 DESCRIBE 的 Null 列更可靠。
字段类型映射别硬背,用 PDO::ATTR_EMULATE_PREPARES = false
PHP 默认开启预处理模拟(PDO::ATTR_EMULATE_PREPARES = true),会导致 DATA_TYPE 返回字符串如 int,而不是标准 SQL 类型名 tinyint/bigint。这会让类型归类混乱:
- 设为
false后,DATA_TYPE值才和INFORMATION_SCHEMA一致,方便统一映射到「数字」「文本」「时间」等语义分类 - 例如
tinyint(1)多数是布尔标志,但只有拿到原始tinyint才能结合COLUMN_COMMENT(如含“是否启用”)做判断 - 别用
gettype()或var_dump()看字段值类型——那是 PHP 运行时类型,和数据库定义无关
生成 Markdown 时绕开 HTML 转义陷阱
字段注释里常有 _下划线_、*、`,直接拼进 Markdown 会破坏格式。别用 htmlspecialchars() 全局转义——那会让 `id` 变成 `id`,失去等宽效果。
正确做法是只对需防 XSS 的上下文(如输出到 HTML 页面)做全转义;生成 Markdown 文件时,用 preg_replace() 局部处理:
// 仅转义可能破坏 Markdown 解析的字符,保留 `code` 和 _emphasis_
$comment = preg_replace('/(?
<p>更稳妥的是用轻量级 Markdown 库(如 <code>cebe/markdown</code>)的 <code>parseParagraph()</code> 单段落解析,避免手写正则翻车。</p>
<h3>外键关系不能只靠 CONSTRAINT_NAME 匹配</h3>
<p>查 <code>KEY_COLUMN_USAGE</code> 时,<code>CONSTRAINT_NAME</code> 在不同表里可能重名(比如都叫 <code>fk_user_id</code>),光靠它无法准确定位被引用表。必须组合以下三列:</p>
-
REFERENCED_TABLE_NAME(目标表名) -
REFERENCED_COLUMN_NAME(目标字段) -
TABLE_NAME+COLUMN_NAME(当前表字段)
否则生成的字典里,“订单表 user_id → 用户表 id”这种关系会错配成“订单表 user_id → 商品表 id”。建议把外键信息单独提成 relationships 数组,生成时再按需渲染成「关联说明」或 ER 图描述。
真正难的不是生成文字,而是让字段注释写得规范、让外键命名有规律、让枚举值在注释里用统一格式标注(如 【0=禁用,1=启用】)——没有这些,再“智能”的 PHP 脚本也吐不出可用的数据字典。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











