利用PHP导出MySQL数据表结构和SQL文件

news2024/11/29 0:42:48

目录

一、获取数据库所有的数据表

方法一:TP5

方法二:原生PHP

二、导出指定数据表的数据结构

三、 导出SQL文件

四、生成SQL语句 

五、完整代码

前端

后端


语言:PHP

数据库:MySQL

功能:分为四部分,① 查出数据库的所有表;② 导出指定数据表的结构;③ 以SQL文件的形式导出指定数据表的数据,并且支持带条件导出,导出的数据可以直接导入数据库;④ 生成SQL语句。

整体效果:

一、获取数据库所有的数据表

方法一:TP5

使用TP5的DB类中的getTables方法

public function index()
	{
		//获取数据库所有的数据表
		$tabList = Db::getTables();		
		$this->assign(['tabList'=>$tabList]);
		return $this->fetch();
	}

方法二:原生PHP

也可以使用原生PHP代码

// 数据库信息
$cfg_dbhost = 'localhost';
$cfg_dbname = 'xxx';
$cfg_dbuser = 'XXX';
$cfg_dbpwd = 'xxx';
$cfg_db_language = 'utf8';
$to_file_name = "xxx.sql"; //导出文件名

//链接数据库
$link = mysqli_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,$cfg_dbname);

//查询数据库中所有表名,并保存在数组中
$tables = mysqli_query($link,"SHOW TABLES");

二、导出指定数据表的数据结构

逻辑说明:输入要导出的数据表,指定导出的文件名,获取数据结构,写入导出文件

// 导出数据结构
	public function downStru()
	{
		// 接收条件
		$table = input('table');
		$to_file_name = ROOT_PATH . "public". DS ."sql". DS . "table_".$table.".sql" ; // 导出文件名

		// 导出数据表结构
		$sql = "show create table ".$table;
		$res = Db::query($sql);
		$info = "-- ----------------------------\r\n";
	    $info .= "-- Table structure for `".$table."`\r\n";
	    $info .= "-- ----------------------------\r\n";
	    $info .= "DROP TABLE IF EXISTS `".$table."`;\r\n";
	    $sqlStr = $info.$res[0]['Create Table'].";\r\n\r\n";

	    // 写入到文件
	    file_put_contents($to_file_name,$sqlStr);

	}

导出后结果如下图,可以直接导入数据库使用

三、 导出SQL文件

说明:以SQL文件的形式导出指定数据表的数据,并且支持带条件导出,导出的数据可以直接导入数据库。

① 先输入到导出的数据表和条件(条件可为空),指定导出文件名称;

② 获取数据表的结构并写入文件

③ 根据输入的条件组装SQL语句,并查询

④ 接收到查询结果后,循环结果集并拼接插入数据格式(如果有特殊格式请过滤掉,否则在导入数据库时会出错)

⑤ 写入导出文件

需要注意的是输入条件部分,字段名可以正常写,表达式支持=;>;<;>=;<=;<>;like;[not] between;[not] in;[not] null几种,当然也可以支持其他表达式,这里只列出了已经测试可以使用的表达式,查询条件需要特别注意,不同的表达式对应的查询条件也不相同,比如说like对应的是"%超声%",between对应的是1 AND 8,其实就是原生SQL的写法,通过自定义的方法进行拼接。

代码如下

	public function downSql()
	{	
		// ① 接收条件
		$table = input('table');
		$field = input('field');
		$expre = input('expre');
		$condition = input('condition');

		$to_file_name = ROOT_PATH . "public". DS ."sql". DS . "table_".$table.".sql" ; // 导出文件名

		/**********② 导出数据表结构**************/
		$sql = "show create table ".$table;
		$res = Db::query($sql);
		$info = "-- ----------------------------\r\n";
	    $info .= "-- Table structure for `".$table."`\r\n";
	    $info .= "-- ----------------------------\r\n";
	    $info .= "DROP TABLE IF EXISTS `".$table."`;\r\n";
	    $sqlStr = $info.$res[0]['Create Table'].";\r\n\r\n";
		file_put_contents($to_file_name,$sqlStr);

		
		/**********导出数据**************/
		// ③ 根据输入条件组装查询条件
		if (!empty($field) && !empty($expre) && !empty($condition)) {

			$where = "where"." ". $field . " " .$expre . " " .$condition;
			// 查询语句
			$sql = "select * from ".$table ." ".$where;
		}else{
			// 查询语句
			$sql = "select * from ".$table ;
		}
		$res = Db::query($sql);

		// 判断数据是否为空
		if(count($res) >= 1){
			$info = "-- ----------------------------\r\n";
			$info .= "-- Records for `".$table."`\r\n";
			$info .= "-- ----------------------------\r\n";
			file_put_contents($to_file_name,$info,FILE_APPEND);

			/**********④ 拼接插入数据格式**************/
			 foreach($res as $v){
			 	$sqlStr = "INSERT INTO `".$table."` VALUES (";

			 	// 循环出字段对应的数据,并组装
			 	foreach($v as $zd){

			 		// 替换数据中的换行符
		            $zd = str_replace("\r\n","",$zd);
		            $sqlStr .= "'".$zd."', ";
		        }

		        //去掉最后一个逗号和空格
		        $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
		        $sqlStr .= ");\r\n";
		        // ⑤ 写入文件
		        file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

			 }

			 file_put_contents($to_file_name,"\r\n",FILE_APPEND);
		}

	}

导出结果如下,可以使用此文件直接导入到其他数据库

四、生成SQL语句 

说明:接收输入的数据表和条件,构造SQL查询语句,把构造的语句返回

public function creatSql()
	{
		// 接收条件
		$table = input('table');
		$field = input('field');
		$expre = input('expre');
		$condition = input('condition');

		// 根据输入条件组装查询条件
		if (!empty($field) && !empty($expre) && !empty($condition)) {

			$where = "where"." ". $field . " " .$expre . " " .$condition;
			// 查询语句
			$sql = "select * from ".$table ." ".$where;
		}else{
			// 查询语句
			$sql = "select * from ".$table ;
		}

		return $sql;
	}

效果如下

  

五、完整代码

前端

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
	<link rel="stylesheet" type="text/css" href="/static/index/layui/css/layui.css">
  	<script type="text/javascript" src="/static/index/layui/layui.js"></script>
	<script src="/static/index/js/jquery-1.11.3.min.js"></script>

	<style type="text/css">
		body{
	  		background-color:#F7F7F7;
	  		-webkit-overflow-scrolling: touch;
	  		height:auto;
	  		margin:0 auto;
	  		margin-top: 0.5rem;
	  	}
	</style>
</head>

<body>
<div style="width:80%; margin: 1rem auto; background: #fff;padding:0.5rem">

	<div class="layui-row layui-col-space30">
    	<div class="layui-col-xs4 layui-col-sm4 layui-col-md4">
    		
			<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
			  <legend>数据表</legend>
			</fieldset>
			<table class="layui-table">
			    <thead>
			      <tr>
			        <th>数据表</th>
			      </tr> 
			    </thead>
			    <tbody>
		      	{volist name="tabList" id="vo"}
			      <tr>
					<td>{$vo}</td>
			      </tr>
				{/volist}
			    </tbody>
			</table>
    	</div>
    	<div class="layui-col-xs8 layui-col-sm8 layui-col-md8">
    		<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
			  <legend>导出数据结构</legend>
			</fieldset>
			<div class="layui-form-item">
			    <label class="layui-form-label">输入表名</label>
			    <div class="layui-input-block">
			      <input type="text" name="table1" lay-verify="required" autocomplete="off" placeholder="数据表" class="layui-input">
			    </div>
			</div>
			<div class="layui-form-item">
			    <div class="layui-input-block">
					<button type="button" class="layui-btn layui-btn-normal structure" style="margin-bottom:0.2rem;">导出数据结构</button>
			    </div>
			</div>

    		<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
			  <legend>导出SQL文件</legend>
			</fieldset>
			<div class="layui-form-item">
			    <label class="layui-form-label">输入表名</label>
			    <div class="layui-input-block">
			      <input type="text" name="table2" lay-verify="required" autocomplete="off" placeholder="数据表" class="layui-input">
			    </div>
			</div>
			<div class="layui-form-item">
			    <label class="layui-form-label">字段名</label>
			    <div class="layui-input-block">
			      <input type="text" name="field" lay-verify="" autocomplete="off" placeholder="字段" class="layui-input">
			    </div>
			</div>

			<div class="layui-form-item">
			      <label class="layui-form-label">表达式</label>
			      <div class="layui-input-block">
			        <input type="text" name="expre" lay-verify="" autocomplete="off" class="layui-input">
			      </div>
			</div>
			<div class="layui-form-item">
				<label class="layui-form-label" style="color:#999">说明:</label>
			    <div class="layui-form-mid layui-word-aux"> =;>;<;>=;<=;<>;like;[not]between;[not]in;[not]null</div>
			</div>
			<div class="layui-form-item">
			      <label class="layui-form-label">查询条件</label>
			      <div class="layui-input-block">
			        <input type="text" name="condition" lay-verify="" autocomplete="off" class="layui-input" placeholder="数值或文本">
			      </div>
			      <div class="layui-form-mid layui-word-aux"></div>
			</div>
			<div class="layui-form-item">
				<label class="layui-form-label" style="color:#999">说明:</label>
			    <div class="layui-form-mid layui-word-aux"> 字符串需要加英文引号['字符串'];like需要加%[字符串%];between使用[1 AND 8]形式;in 使用[(1,8)]形式</div>
			</div>

			<div class="layui-form-item">
			    <div class="layui-input-block">
					<button type="button" class="layui-btn layui-btn-normal creatSql" style="margin-bottom:0.2rem;">生成SQL语句</button>
					<button type="button" class="layui-btn layui-btn-normal downSql" style="margin-bottom:0.2rem;">导出sql文件</button>
			    </div>
			</div>

			<div class="layui-form-item">
				 <label class="layui-form-label">原生SQL语句</label>
			    <div class="layui-input-block">
					<textarea placeholder="" class="layui-textarea sqltext"></textarea>
			    </div>
			</div>

    	</div>

	</div>
	

	
</div>

</body>

<script type="text/javascript">
	layui.use(['form','element'], function(){
		var form = layui.form
		,$ = layui.jquery
		,element = layui.element;

		// 导出数据结构
		$('.structure').click(function () {

			var table= $("input[name='table1']").val()
			console.log(table)

			$.ajax({
				url:'downStru',
				type:'get',
				dataType:'JSON',
				data:{table:table},
				success:function (res) {
					console.log(res)
				}
			})
		})

		// 导出sql文件
		$('.downSql').click(function () {

			var table= $("input[name='table2']").val()
			console.log(table)
			var field= $("input[name='field']").val()
			var expre= $("input[name='expre']").val()
			var condition= $("input[name='condition']").val()

			$.ajax({
				url:'downSql',
				type:'get',
				dataType:'JSON',
				data:{table:table,field:field,expre:expre,condition:condition},
				success:function (res) {
					console.log(res)
				}
			})
		})

		// 生成SQL语句
		$('.creatSql').click(function () {

			var table= $("input[name='table2']").val()
			console.log(table)
			var field= $("input[name='field']").val()
			var expre= $("input[name='expre']").val()
			var condition= $("input[name='condition']").val()

			$.ajax({
				url:'creatSql',
				type:'get',
				dataType:'JSON',
				data:{table:table,field:field,expre:expre,condition:condition},
				success:function (res) {
					console.log(res)
					$('.sqltext').val(res)
				}
			})
		})
	})
</script>

</html>

后端

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

/**
 * 数据库操作类
 */
class Sql extends Controller
{

	public function index()
	{
		//获取数据库所有的数据表
		$tabList = Db::getTables();		
		$this->assign(['tabList'=>$tabList]);
		return $this->fetch();
	}

	// 导出数据结构
	public function downStru()
	{
		// 接收条件
		$table = input('table');
		$to_file_name = ROOT_PATH . "public". DS ."sql". DS . "table_".$table.".sql" ; // 导出文件名

		// 导出数据表结构
		$sql = "show create table ".$table;
		$res = Db::query($sql);
		$info = "-- ----------------------------\r\n";
	    $info .= "-- Table structure for `".$table."`\r\n";
	    $info .= "-- ----------------------------\r\n";
	    $info .= "DROP TABLE IF EXISTS `".$table."`;\r\n";
	    $sqlStr = $info.$res[0]['Create Table'].";\r\n\r\n";

	    // 写入到文件
	    file_put_contents($to_file_name,$sqlStr);

	}

	// 导出sql文件
	public function downSql()
	{	
		// ① 接收条件
		$table = input('table');
		$field = input('field');
		$expre = input('expre');
		$condition = input('condition');

		$to_file_name = ROOT_PATH . "public". DS ."sql". DS . "table_".$table.".sql" ; // 导出文件名

		/**********② 导出数据表结构**************/
		$sql = "show create table ".$table;
		$res = Db::query($sql);
		$info = "-- ----------------------------\r\n";
	    $info .= "-- Table structure for `".$table."`\r\n";
	    $info .= "-- ----------------------------\r\n";
	    $info .= "DROP TABLE IF EXISTS `".$table."`;\r\n";
	    $sqlStr = $info.$res[0]['Create Table'].";\r\n\r\n";
		file_put_contents($to_file_name,$sqlStr);

		
		/**********导出数据**************/
		// ③ 根据输入条件组装查询条件
		if (!empty($field) && !empty($expre) && !empty($condition)) {

			$where = "where"." ". $field . " " .$expre . " " .$condition;
			// 查询语句
			$sql = "select * from ".$table ." ".$where;
		}else{
			// 查询语句
			$sql = "select * from ".$table ;
		}
		$res = Db::query($sql);

		// 判断数据是否为空
		if(count($res) >= 1){
			$info = "-- ----------------------------\r\n";
			$info .= "-- Records for `".$table."`\r\n";
			$info .= "-- ----------------------------\r\n";
			file_put_contents($to_file_name,$info,FILE_APPEND);

			/**********④ 拼接插入数据格式**************/
			 foreach($res as $v){
			 	$sqlStr = "INSERT INTO `".$table."` VALUES (";

			 	// 循环出字段对应的数据,并组装
			 	foreach($v as $zd){

			 		// 替换数据中的换行符
		            $zd = str_replace("\r\n","",$zd);
		            $sqlStr .= "'".$zd."', ";
		        }

		        //去掉最后一个逗号和空格
		        $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
		        $sqlStr .= ");\r\n";
		        // ⑤ 写入文件
		        file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

			 }

			 file_put_contents($to_file_name,"\r\n",FILE_APPEND);
		}

	}

	// 生成SQL语句
	public function creatSql()
	{
		// 接收条件
		$table = input('table');
		$field = input('field');
		$expre = input('expre');
		$condition = input('condition');

		// 根据输入条件组装查询条件
		if (!empty($field) && !empty($expre) && !empty($condition)) {

			$where = "where"." ". $field . " " .$expre . " " .$condition;
			// 查询语句
			$sql = "select * from ".$table ." ".$where;
		}else{
			// 查询语句
			$sql = "select * from ".$table ;
		}

		return $sql;
	}


}

如果有其他已经测试可以使用的表达式可以在下面留言,若导出的SQL文件在导入到其他数据库时出现错误,也欢迎指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智大数据比赛的总结

强国杯个人赛一定要报 hive 和hadoop基础环境配置 开启单节点集群环境 (0 / 10 分) 本次使用环境为单节点集群,对应主机名为hadoop000,使用工具连接对应主机并进行相关操作。 环境中已经安装java、Hadoop、Hive、Mysql并配置对应环境变量,安装路径为/root/software/,对应…

通过python采集关键字搜索1688工厂数据接口,1688工厂数据接口,1688API接口

1688是一个行业网站&#xff0c;主要提供中小型批发和生产商的信息&#xff0c;是中国供应商向全球采购商展示其产品的平台。在1688上&#xff0c;可以找到许多工厂和制造商的信息&#xff0c;包括公司名称、地址、联系人、联系方式、主要产品等。 采集1688工厂数据可以帮助采…

MySQL数据库 2.启动与停止

目录 ​编辑 &#x1f914; 启动与停止&#xff1a; &#x1f642;1.WIN加R调用windows命令行&#xff0c;输入&#xff1a;services.msc &#x1f642;2.可以在cmd&#xff08;管理员模式&#xff09;中输入以下指令&#xff1a; &#x1f914; 启动MySQ后的操作步骤&…

linux安装tomcat8

1.tomcat8下载 https://tomcat.apache.org/download-80.cgi 2.tomcat8安装 &#xff08;1&#xff09;将tomcat jar上传到usr/local目录 &#xff08;2&#xff09;解压tomcat压缩包 [rootiZ2ze7vthdl3oh0n0hzlu7Z local]# tar -zxvf apache-tomcat-8.5.58.tar.gz&#x…

开发小程序过程中的兼容难题,应当何去何从?

如今小程序开发已经成为了互联网行业发展的主流&#xff0c;而小程序开发过程中的兼容难题也让许多开发者感到头疼。那么小程序开发过程中兼容问题究竟有哪些&#xff0c;该如何解决&#xff1f;下面我们就针对这个问题展开一下分析。 什么是小程序&#xff1f; 小程序是一种无…

为什么魂斗罗只有 128KB 却可以实现那么长的剧情

经常看到有同学在抱怨现在的游戏、APP占用非常大的空间&#xff0c;基本都是 10G 起步。 这让我想到初中时玩过的一款游戏魂斗罗&#xff0c;为什么它只有 128KB 却可以实现那么长的剧情呢&#xff1f;这篇文章将会给大家讲讲这里面的奥秘~ 正文 现代程序员 A 和 1980 年代游戏…

小程序安装Vant Weapp详细步骤,下载和npm安装版

小程序安装Vant Weapp详细步骤 使用npm下载1、新建项目并初始化项目2、下载Vant Weapp3、修改 app.json4、构建 npm 包5、引入组件 下载方式1. npm下载或者下载[官方示例](https://github.com/youzan/vant-weapp)2. 把里面的dist文件夹复制出来&#xff0c;放到项目的根目录&am…

MKS SimpleFOC ESP32 例程7 双电机电流控制

Makerbase ESP32 FOC 例程7 双电机电流控制 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12ARDUINO UNO主板23MKS SF2804电机1412V电源适配器15USB 线1 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。…

恒流间歇滴定法(GITT)测试锂离子电池的实验流程

恒流间歇滴定法&#xff08;GITT&#xff09;测试锂离子电池的实验流程 锂电池作为现代电子设备中最常用的电源之一&#xff0c;其性能和安全性对于设备的正常运行至关重要。恒电流间歇滴定法是一种常用的测试方法&#xff0c;用于评估锂电池的容量、循环寿命和内阻等关键参数。…

黄色荧光染料:1811539-32-8,JF549,NHS,JaneliaFluor549,SE,JF549琥珀酰亚胺酯

【产品描述】 Janelia Fluor549&#xff0c;SE是一种黄色荧光染料&#xff0c;作为NHS酯提供&#xff0c;用于连接伯胺基。NHS酯部分可以与伯胺特异有效地反应&#xff0c;形成共价酰胺键。NHS活化酯是生物标记反应中常用的活化基团。NHS活化TAMRA分子中的羧基&#xff0c;让它…

Ubuntu pwn环境搭建

文章目录 前言环境准备系统安装安装VMtoolsapt换源安装pip并换源安装pwntools安装gdb插件安装one_gadget安装 LibcSearcher 后记参考 前言 重新装了一下pwn环境&#xff0c;踩到了好多坑&#xff0c;顺便记录一下 环境准备 ubuntu 20.04&#xff0c;可以到镜像站下载&#x…

[CTFTraining] 0CTF 2016 Unserialize

​ 打开环境后是这样&#xff1a; ​ 找了挺多地方没啥头绪&#xff0c;干脆直接上dirsearch&#xff1a; ​ 发现有源码泄露&#xff0c;直接下载下来分析。先进行自动审计&#xff1a; ​ 发现有疑似的漏洞&#xff0c;但根据题目来看是反序列化的&#xff0c;还是要自行进…

月报总结|Moonbeam 5月份大事一览

本月&#xff0c;Moonbeam迎来了Uniswap V3的部署&#xff0c;经过一年的社区讨论&#xff0c;UniSwap V3终于以5000万个同意票通过&#xff0c;将在未来一个月内部署于Moonbeam&#xff0c;为Web3用户提供更广泛公链生态的多链体验&#xff0c;加速应用之间跨链交互&#xff0…

平板电脑系统优化垃圾清理软件CleanMyMac X

CleanMyMac 这是一款苹果系统电脑的清理软件&#xff0c;无论是Mac、苹果笔记本电脑还是平板电脑都可以使用。垃圾清理操作简单又方便&#xff0c;不但专项清理各种垃圾&#xff0c;还能卸载垃圾软件。 对于刚拿到苹果电脑的朋友来讲&#xff0c;选择一些必备的mac软件可以省去…

opencv3 模板匹配与直方图

模板匹配 尽量加上归一化操作 像素差值计算&#xff0c;模板在原图上滑动 ① 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与&#xff08;图像被模板覆盖的地方&#xff09;的差别程度(例如值127与值190的区别)&#xff0c;这个差别…

NVM-Nodejs多版本管理工具

NVM:&#x1f50e;:下载点我 下载含有 setup.exe的 下载完成之后修改一下settings.txt 文件&#xff0c;在原有的基础上直接加入这些配置 root: D:\nvm path: D:\nvm\nodejs node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors…

(转载)多种群遗传算法的函数优化算法(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1 理论基础 1.1 遗传算法早熟问题 遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应的全局优化概率搜索算法。由于优化时不依赖于梯度&#xff0c;具有很强…

vue可视化大屏教程

在我们日常生活中&#xff0c;经常会看到各式各样的大屏&#xff0c;其中有一部分是传统的数据大屏&#xff0c;如工业监控大屏、环保监测大屏等。这些大屏的主要作用是展示信息&#xff0c;让用户快速获取信息&#xff0c;避免用户在阅读时产生视觉疲劳。还有一部分是智能的可…

建筑七大员有哪些发证部门?证书有什么区别?

建筑七大员是指建筑施工企业关键技术岗位&#xff0c;七大员分别是 施工员 质量员 标准员 材料员 机械员 劳务员 资料员 建筑七大员&#xff0c;常见的发证单位有住房和成乡建设厅和中国建设教育协会两个部门发证&#xff0c;但是大家还是要考住房和城乡建设厅的&#xff0c;建…

CANoe中如何仿真报文的CRC和Counter,告诉你三种方法皆可实现

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 📘前言 🍅 作为网络测试,有些测试场景总线中的其它节点进行仿真,因为…