PHP 针对mysql 自动生成数据字典

PHP 针对mysql 自动生成数据字典

确保php 可以正常使用mysqli 扩展

这里还需要注意 数据库密码 如果密码中有特殊字符 如:

首先,我们需要了解MySQL中的特殊字符包括哪些。MySQL中的特殊字符主要包括以下几类:

复制代码
1. 单引号(')
2. 双引号(")
3. 反斜杠(\)
4. 美元符号($)
5. 反引号(`)
6. 百分号(%)
7. 下划线(_)

如果密码为123456$Aki

那么密码应该写成:

php 复制代码
$database['DB_PWD'] = '123456\$Aki';

完整代码如下:

php 复制代码
<?php
/**
 * 生成mysql数据字典
 */
header("Content-type:text/html;charset=utf-8");
// 配置数据库
$database = array();
$database['DB_HOST'] = '127.0.0.1';
$database['DB_NAME'] = 'demo';
$database['DB_USER'] = 'root';
$database['DB_PWD'] = '123456';

$conn = mysqli_connect("{$database['DB_HOST']}", "{$database['DB_USER']}", "{$database['DB_PWD']}", $database['DB_NAME']);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
mysqli_query($conn,"SET NAMES utf8");
$result = $conn->query('show tables', $mysql_conn);
if ($result->num_rows > 0) {

    // 取得所有表名
    while ($row = $result->fetch_array()) {
        $tables[]['TABLE_NAME'] = $row[0];
    }
}

// 循环取得所有表的备注及表中列消息
foreach($tables as $k => $v)
{
    $sql = 'SELECT * FROM ';
    $sql .= 'information_schema.TABLES ';
    $sql .= 'WHERE ';
    $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database['DB_NAME']}'";
    $table_result = $conn->query($sql);
    while ($t = $table_result->fetch_array())
    {
        $tables[$k]['TABLE_COMMENT'] = $t['TABLE_COMMENT'];
    }
    $sql = 'SELECT * FROM ';
    $sql .= 'information_schema.COLUMNS ';
    $sql .= 'WHERE ';
    $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database['DB_NAME']}'";
    $fields = array();
    $field_result = $conn->query($sql);
    while ($t = $field_result->fetch_array())
    {
        $fields[] = $t;
    }
    $tables[$k]['COLUMN'] = $fields;
}
$conn->close();
$html = '';
// 循环所有表
//print_r($tables);

//列出所有表的表信息列表(表名  表名称)
$html .= '<table border="1" cellspacing="0" cellpadding="0" align="center">';
$html .= '<tbody><tr><th>序号</th><th>表名</th><th>功能说明</th></tr>';

foreach($tables as $k => $v)
{
    $sort = $k+1;
    $html .= '<td class="c1">' . $sort . '</td>';
    $html .= '<td class="c2">' . $v['TABLE_NAME'] . '</td>';
    $html .= '<td class="c3">' . $v['TABLE_COMMENT'] .'</td>';
    $html .= '</tr>';
}
$html .= '</tbody></table></p>';

$html .= "<br /><br /><br />";

//循环每个表的具体信息
foreach($tables as $k => $v)
{
    $html .= '<table border="1" cellspacing="0" cellpadding="0" align="center">';
    $html .= '<caption>表名:' . $v['TABLE_NAME'] . ' ' . $v['TABLE_COMMENT'] . '</caption>';
    $html .= '<tbody><tr><th>字段名</th><th>数据类型</th><th>默认值</th><th>允许非空</th><th>自动递增</th><th>备注</th></tr>';
    $html .= '';
    foreach($v['COLUMN'] AS $f)
    {
        $html .= '<td class="c1">' . $f['COLUMN_NAME'] . '</td>';
        $html .= '<td class="c2">' . $f['COLUMN_TYPE'] . '</td>';
        $html .= '<td class="c3">' . $f['COLUMN_DEFAULT'] . '</td>';
        $html .= '<td class="c4">' . ($f['IS_NULLABLE'] == 'YES' ? '是':'否') . '</td>';
        $html .= '<td class="c5">' . ($f['EXTRA'] == 'auto_increment'?'是':' ') . '</td>';
        $html .= '<td class="c6">' . $f['COLUMN_COMMENT'] . '</td>';
        $html .= '</tr>';
    }
    $html .= '</tbody></table></p>';
}
/* 生成word */
//header ( "Content-type:application/vnd.ms-word" );
//header ( "Content-Disposition:attachment;filename={$database['DB_NAME']}数据字典.doc" );
/* 生成excel*/
//header ( "Content-type:application/vnd.ms-excel" );
//header ( "Content-Disposition:attachment;filename={$database['DB_NAME']}数据字典.xls" );
// 输出
echo '<html>
  <meta charset="utf-8">
  <title>自动生成数据字典</title>
  <style>
    body,td,th {font-family:"宋体"; font-size:12px;}
    table,h1,p{width:960px;margin:0px auto;}
    table{border-collapse:collapse;border:1px solid #CCC;background:#efefef;}
    table caption{text-align:left; background-color:#fff; line-height:2em; font-size:14px; font-weight:bold; }
    table th{text-align:left; font-weight:bold;height:26px; line-height:26px; font-size:12px; border:1px solid #CCC;padding-left:5px;}
    table td{height:20px; font-size:12px; border:1px solid #CCC;background-color:#fff;padding-left:5px;}
    .c1{ width: 150px;}
    .c2{ width: 150px;}
    .c3{ width: 80px;}
    .c4{ width: 100px;}
    .c5{ width: 100px;}
    .c6{ width: 300px;}
  </style>
  <body>';
echo '<h1 style="text-align:center;">'.$database['DB_NAME'].'数据字典</h1>';
echo '<p style="text-align:center;margin:20px auto;">生成时间:' . date('Y-m-d H:i:s',time()) . '</p>';
echo $html;
echo '<p style="text-align:left;margin:20px auto;">总共:' . count($tables) . '个数据表</p>';
echo '</body></html>';
?>

运行效果如图:

方法二:其实也差不多 页面样式略有变化

php 复制代码
<?php
/**
 * 自动生成mysql数据字典
 */
header("Content-type: text/html; charset=utf-8");
//配置数据库
$dbserver   = "127.0.0.1";
$port       = 3306;     //端口
$dbusername = "root"; // 数据库连接账号
$dbpassword = "123456"; // 数据库连接密码
$database   = "demo"; // 数据库名
// 连接数据库
$mysql_conn = mysqli_connect("$dbserver", "$dbusername", "$dbpassword", "$database",$port) or die("Mysql connect is error.");
mysqli_query($mysql_conn, 'SET NAMES utf8');
$table_result  = mysqli_query($mysql_conn, 'show tables');
$no_show_table = array(); // 不需要显示的表
$no_show_field = array(); // 不需要显示的字段
//取得所有的表名
$tables = array();
while ($row = mysqli_fetch_array($table_result)) {
  if (!in_array($row[0], $no_show_table)) {
    $tables[]['TABLE_NAME'] = $row[0];
  }
}
//循环取得所有表的备注及表中列信息
foreach ($tables as $k => $v) {
  $sql = 'SELECT * FROM ';
  $sql .= 'INFORMATION_SCHEMA.TABLES ';
  $sql .= 'WHERE ';
  $sql .= "table_name = '{$v['TABLE_NAME']}'  AND table_schema = '{$database}'";
  $table_result = mysqli_query($mysql_conn, $sql);
  while ($t = mysqli_fetch_array($table_result)) {
    $tables[$k]['TABLE_COMMENT'] = $t['TABLE_COMMENT'];
  }
  $sql = 'SELECT * FROM ';
  $sql .= 'INFORMATION_SCHEMA.COLUMNS ';
  $sql .= 'WHERE ';
  $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database}'";
  $fields = array();
  $field_result = mysqli_query($mysql_conn, $sql);
  while ($t = mysqli_fetch_array($field_result)) {
    $fields[] = $t;
  }
  $tables[$k]['COLUMN'] = $fields;
}
mysqli_close($mysql_conn);
$html = '';
//循环所有表
foreach ($tables as $k => $v) {
  if (!in_array($v['TABLE_NAME'], $no_show_table)) {
    $html .= '<h3>' . ($k + 1) . '、' . $v['TABLE_COMMENT'] . ' (' . $v['TABLE_NAME'] . ')</h3>';
    $html .= '<table border="1" cellspacing="0" cellpadding="0" width="100%">';
    $html .= '<tbody>';
    $html .= '<tr>';
    $html .= '<th>字段名</th>';
    $html .= '<th>数据类型</th>';
    $html .= '<th>默认值</th>';
    $html .= '<th>允许非空</th>';
    $html .= '<th>自动递增</th>';
    $html .= '<th>备注</th>';
    $html .= '</tr>';
    foreach ($v['COLUMN'] as $f) {
      if (!in_array($f['COLUMN_NAME'], $no_show_field)) {
        $html .= '<tr>';
        $html .= '<td class="c1">' . $f['COLUMN_NAME'] . '</td>';
        $html .= '<td class="c2">' . $f['COLUMN_TYPE'] . '</td>';
        $html .= '<td class="c3">' . $f['COLUMN_DEFAULT'] . '</td>';
        $html .= '<td class="c4">' . $f['IS_NULLABLE'] . '</td>';
        $html .= '<td class="c5">' . ($f['EXTRA'] == 'auto_increment' ? '是' : '&nbsp;') . '</td>';
        $html .= '<td class="c6">' . $f['COLUMN_COMMENT'] . '</td>';
        $html .= '</tr>';
      }
    }
    $html .= '</tbody>';
    $html .= '</table>';
  }
}
?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>数据字典</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <meta name="renderer" content="webkit|ie-comp|ie-stand">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <style>
    body, td, th{font-family: "微软雅黑";font-size: 14px;}
    .warp{margin: auto;width: 900px;}
    .warp h3{margin: 0px;padding: 0px;line-height: 30px;margin-top: 10px;}
    table{border-collapse: collapse;border: 1px solid #CCC;background: #efefef;}
    table th{text-align: left;font-weight: bold;height: 26px;line-height: 26px;font-size: 14px;text-align: center;border: 1px solid #CCC; padding: 5px;}
    table td{height: 20px;font-size: 14px;border: 1px solid #CCC;background-color: #fff;padding:5px;}
    .c1{width: 120px;}
    .c2{width: 120px;}
    .c3{width: 150px;}
    .c4{width: 80px;text-align:center;}
    .c5{width: 80px;text-align:center;}
    .c6{width: 270px;}
  </style>
</head>
<body>
  <div class="warp">
    <h1 style="text-align:center;">数据字典自动生成</h1>
    <?php echo $html; ?>
  </div>
</body>
</html>

效果如下图:

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端