PHP导出MySQL数据字典

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 2017年11月9日09:30:29 用 PHP mysqli 写的一个类文件, 用来导出MySQL数据字典 导出表信息; 字段信息, 索引信息 可以导出浏览器适用的样式, 也可以导出word文档(默认720px)宽度,字体10px 建议上线前用这个导出一份, 整体过一遍, 防止有些字段, not null, 索引等设置不到位的情况 https://gitee.

2017年11月9日09:30:29

用 PHP mysqli 写的一个类文件, 用来导出MySQL数据字典

导出表信息; 字段信息, 索引信息

可以导出浏览器适用的样式, 也可以导出word文档(默认720px)宽度,字体10px

建议上线前用这个导出一份, 整体过一遍, 防止有些字段, not null, 索引等设置不到位的情况

https://gitee.com/myDcool/PHP-DBDIC

 

用法:

1 include('./DBdic.php');
2 
3 //浏览器显示
4 DBdic::ini('localhost', 'db_name', 'username', 'password')->outForBrowser();
5 
6 //下载word文档
7 DBdic::ini('localhost', 'db_name', 'username', 'password')->outForWord();

 

 

  1 <?php
  2 /**
  3  * 生成mysql数据字典
  4  */
  5 class DBdic
  6 {
  7     public $database = array(); //数据库配置
  8     public $tables = array(); //读取的表信息数组
  9     public $htmlTable = ''; //表格内容
 10     public $html = '';
 11     
 12     public static function ini($host, $dbname, $user, $pwd)
 13     {
 14         return new self($host, $dbname, $user, $pwd);
 15     }
 16     
 17     function __construct($host, $dbname, $user, $pwd)
 18     {
 19         // 配置数据库
 20         $this->database['DB_HOST'] = $host;
 21         $this->database['DB_NAME'] = $dbname;
 22         $this->database['DB_USER'] = $user;
 23         $this->database['DB_PWD'] = $pwd;
 24     
 25         //链接MySQL
 26         $mysqli = mysqli_init();
 27         $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2); //超时2s
 28         $mysqli->options(MYSQLI_INIT_COMMAND, "set names utf8mb4;");
 29         $mysqli->real_connect($this->database['DB_HOST'], $this->database['DB_USER'], $this->database['DB_PWD'], $this->database['DB_NAME']) or die("Mysql connect is error.");
 30     
 31         // 取得所有表名
 32         $rs = $mysqli->query('show tables');
 33         $arrTableName = array_column($rs->fetch_all(), $value=0);
 34 
 35         // 取得所有表信息
 36         foreach ($arrTableName as $name) {
 37         
 38             //表注释
 39             $sql = "select * from information_schema.tables where table_schema = '{$this->database['DB_NAME']}' and table_name = '{$name}' "; //查询表信息
 40             $rs = $mysqli->query($sql);
 41             $arrTableInfo = $rs->fetch_assoc();
 42         
 43             //各字段信息
 44             $sql = "select * from information_schema.columns where table_schema ='{$this->database['DB_NAME']}' and table_name = '{$name}' "; //查询字段信息
 45             $rs = $mysqli->query($sql);
 46             $arrColumnInfo = $rs->fetch_all(MYSQLI_ASSOC);
 47         
 48             //索引信息
 49             $sql = "show index from {$name}";
 50             $rs = $mysqli->query($sql);
 51             $arrIndexInfo = $rs->fetch_all(MYSQLI_ASSOC);
 52         
 53             $this->tables[] = array(
 54                 'TABLE' => $arrTableInfo,
 55                 'COLUMN' => $arrColumnInfo,
 56                 'INDEX' => $this->getIndexInfo($arrIndexInfo)
 57             );
 58         }
 59     
 60         //组装HTML
 61         $html = '';
 62         foreach($this->tables as $v)
 63         {
 64             $html .= '<table border="1" cellspacing="0" cellpadding="0" align="center">';
 65             $html .= '<caption>' . $v['TABLE']['TABLE_NAME'] . ' ' . $v['TABLE']['TABLE_COMMENT'] . '</caption>';
 66             $html .= '<tbody><tr><th>字段名</th><th>数据类型</th><th>默认值</th><th>允许非空</th><th>索引/自增</th><th>备注(字段数: '. count($v['COLUMN']).')</th></tr>';
 67         
 68             foreach ($v['COLUMN'] AS $f) {
 69                 $html .= '<tr>';
 70                 $html .= '<td class="c1">' . $f['COLUMN_NAME']      . '</td>';
 71                 $html .= '<td class="c2">' . $f['COLUMN_TYPE']      . '</td>';
 72                 $html .= '<td class="c3">' . $f['COLUMN_DEFAULT']   . '</td>';
 73                 $html .= '<td class="c4">' . $f['IS_NULLABLE']      . '</td>';
 74                 $html .= '<td class="c5">' . $f['COLUMN_KEY'].' '.$f['EXTRA']. '</td>';
 75                 $html .= '<td class="c6">' . $f['COLUMN_COMMENT']   . '</td>';
 76                 $html .= '</tr>';
 77             }
 78             $html .= '</tbody></table>';
 79         
 80             $html .= '<table style="border-top:hidden"  cellspacing="0" cellpadding="0" align="center">';
 81             $html .= '<tr><th>索引名</th><th>索引顺序</th></tr>';
 82             foreach ($v['INDEX'] as $indexName => $indexContent) {
 83                 $html .= '<tr>';
 84                 $html .= '<td class="c7">' . $indexName . '</td>';
 85                 $html .= '<td>' . implode('; ', $indexContent) . '</td>';
 86                 $html .= '</tr>';
 87             }
 88             $html .= '</table><br>';
 89         }
 90         $this->htmlTable = $html;
 91     }
 92     
 93     //整合单个表的所有索引(将复合索引归纳到一起)
 94     function getIndexInfo($arrIndexInfo)
 95     {
 96         $index = array();
 97         foreach ($arrIndexInfo as $v) {
 98             $unique = ($v['Non_unique'] == 0) ? '(unique)' : '';
 99             $index[$v['Key_name']][] = $v['Seq_in_index'].': '.$v['Column_name'].$unique;
100         }
101         
102         return $index;
103     }
104     
105     //输出到浏览器, 表格宽度用百分比
106     function outForBrowser()
107     {
108         header("Content-type:text/html;charset=utf-8");
109         $html = '<html>
110               <meta charset="utf-8">
111               <title>自动生成数据字典</title>
112               <style>
113                 body,td,th {font-family:"宋体"; font-size:14px;}
114                 table,h1,p{width:80%;margin:0px auto;}
115                 table{border-collapse:collapse;border:1px solid #CCC;background:#efefef;}
116                 table caption{text-align:left; background-color:#fff; line-height:2em; font-size:14px; font-weight:bold; }
117                 table th{text-align:left; font-weight:bold;height:26px; line-height:26px; font-size:14px; border:1px solid #CCC;padding-left:5px;}
118                 table td{height:20px; font-size:14px; border:1px solid #CCC;background-color:#fff;padding-left:5px;}
119                 .c1{ width: 10%;}
120                 .c2{ width: 10%;}
121                 .c3{ width: 5%;}
122                 .c4{ width: 5%;}
123                 .c5{ width: 10%;}
124                 .c6{ width: 60%;}
125                 .c7{ width: 10%;}
126               </style>
127               <body>';
128         $html .= '<h1 style="text-align:center;">'.$this->database['DB_NAME'].'数据字典</h1>';
129         $html .= '<p style="text-align:center;margin:20px auto;">生成时间:' . date('Y-m-d H:i:s') . '  总共:' . count($this->tables) . '个数据表</p>';
130         $html .= $this->htmlTable;
131         $html .= '</body></html>';
132         
133         $this->html = $html;
134         echo $html;
135         // return $this;
136     }
137     
138     //输出到word文档, 固定宽度为720px
139     function outForWord()
140     {
141         /* 生成word */
142         header("Content-type:text/html;charset=utf-8");
143         header( "Content-type:application/vnd.ms-word" );
144         header( "Content-Disposition:attachment;filename={$this->database['DB_NAME']}数据字典.doc" );
145     
146         $html = '<html>
147               <meta charset="utf-8">
148               <title>自动生成数据字典</title>
149               <style>
150                 body,td,th {font-family:"宋体"; font-size:14px;}
151                 table,h1,p{width:720px;margin:0px auto;}
152                 table{border-collapse:collapse;border:1px solid #CCC;background:#efefef;}
153                 table caption{text-align:left; background-color:#fff; line-height:2em; font-size:14px; font-weight:bold; }
154                 table th{text-align:left; font-weight:bold;height:20px; line-height:20px; font-size:11px; border:1px solid #CCC;padding-left:5px;}
155                 table td{height:20px; font-size:11px; border:1px solid #CCC;background-color:#fff;padding-left:5px;}
156                 .c1{ width: 100px;}
157                 .c2{ width: 110px;}
158                 .c3{ width: 50px;}
159                 .c4{ width: 55px;}
160                 .c5{ width: 100px;}
161                 .c6{ width: 300px;}
162                 .c7{ width: 200px;}
163               </style>
164               <body>';
165         $html .= '<h1 style="text-align:center;">'.$this->database['DB_NAME'].'数据字典</h1>';
166         $html .= '<p style="text-align:center;margin:20px auto;">生成时间:' . date('Y-m-d H:i:s') . '  总共:' . count($this->tables) . '个数据表</p>';
167         $html .= $this->htmlTable;
168         $html .= '</body></html>';
169         
170         $this->html = $html;
171         echo $html;
172         // return $this;
173     }
174     
175     function out()
176     {
177         // echo $this->html;
178     }
179     
180 }
View Code

 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
10月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
8月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
409 0
|
6月前
|
关系型数据库 MySQL PHP
PHP和Mysql前后端交互效果实现
本文介绍了使用PHP连接MySQL数据库的基本函数及其实现案例。内容涵盖数据库连接、选择数据库、执行查询、获取结果等常用操作,并通过用户登录和修改密码的功能实例,展示了PHP与MySQL的交互过程及代码实现。
401 0
PHP和Mysql前后端交互效果实现
|
7月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
541 10
|
8月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
204 0
|
11月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
502 28
|
11月前
|
关系型数据库 MySQL Linux
查看Linux、Apache、MySQL、PHP版本的技巧
以上就是查看Linux、Apache、MySQL、PHP版本信息的方法。希望这些信息能帮助你更好地理解和使用你的LAMP技术栈。
511 17
|
10月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
263 0
|
12月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
12月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,

推荐镜像

更多