功能:比较两个不同版本的数据库src和dst, 生成sql文件 将src升级为dst
<?phpdefine("dsn",'mysql:host=127.0.0.1;port=3306;dbname=gmsys');//gm数据库配置define("src_db","ea_role"); define("target_db","game_role"); define("user","liming"); define("pass",""); define("file_name","updatesql.sql");//获取数据库结构//数据库名称,链接,返回所有表,所有表的结构<tablename,<tablename,fields>>,表的属性值function getdbstructure($db_name,$pdo,&$tables,&$db_stru,&$table_status){ # code... //获取src_db 的数据库结构 $pdo->query("use ".$db_name); print_r("<pre>"); //表属性 foreach ($pdo->query("show table status") as $key => $value) { # code... $table_status[$value[0]] = $value; } //echo php_eol; foreach ($pdo->query("show tables") as $key => $value) { # code... $tables[$key] = $value[0];//表名 //echo $value[0]."|"; } //echo php_eol; foreach ($tables as $key => $name) { # code... //echo $name .php_eol; $table = null;//记得初始化 foreach ($pdo->query("desc ".$name) as $key => $value) { # code... $table[$value[0]] = $value; //字段名 ——> 字段属性 //echo $value[0] ."|"; } //echo php_eol; $db_stru[$name] = $table; //表名 -> 表结构 } }//生成创建数据库的sql// 表名 表结构function createtablesql($name,$table){ # code... $pri_key = array(); $mul_key = array(); $sql = "create table `{$name}` ("; foreach ($table as $key => $value) { # code... $field = $value[0];//字段名 $type = $value[1]; //字段类型 $null = $value[2]; //是否为空 yes no $key = $value[3]; //pri mul $default = $value[4]; //字段类型 $extal = $value[5];// $isnull = ""; if ($null == "yes") { # code... $isnull = "not null"; } //$defaultmsg = $default; if (!is_null($default)) { # code... $default = " default {$default}"; } if ($key == "pri") { # code... array_push($pri_key, $field); } else if ($key == "mul") { # code... array_push ($mul_key, $field); } //拼接字符串 $row = "`{$field}` {$type} {$isnull} {$default},"; $sql = $sql . php_eol . $row ; } //添加主键 if (!empty($pri_key)) { # code... $sql = $sql . php_eol."primary key ("; foreach ($pri_key as $v) { # code... $sql = $sql."`{$v}`,"; } $sql = substr($sql, 0,strlen($sql)-1); $sql = $sql . ")," ; } //拼接主键 if (!empty($mul_key)) { # code... foreach ($mul_key as $v) { # code... $sql = $sql . php_eol . "key `{$v}` ({$v}),"; } } $sql = substr($sql, 0,strlen($sql)-1);//去掉最后一个‘,’ $sql = $sql . php_eol . ");".php_eol; return $sql; }//生成update文件// $fields <tabname,field>//alter table `familyer` add column `joinfightdata` blob after `ssfightblob`;function genupdatesql($fields){ $updatesql=null ; foreach ($fields as $tab_name => $value) { # code... foreach ($value as $key => $v) { # code... $isnull = ""; if ($v[2] == "yes") { # code... $isnull = "not null"; } $default = $v[4]; if (!is_null($default)) { # code... $default = " default {$default}"; } $updatesql = $updatesql . "alter table `{$tab_name}` add column `{$v[0]}` {$v[1]} {$isnull} {$default};".php_eol; } $updatesql = $updatesql.php_eol; } return $updatesql; }//比价数据库结构//dst_db 有 src_db 没有 返回表字段数组function cmp($src_db,$dst_db){ $tables =array();//dst有 但是src中没有的表 <tale> $fields = array();//表名 -> <字段名,字段属性> foreach ($dst_db as $key => $value) { # code... if ( array_key_exists($key,$src_db) ) {//如果存在比较字段 # code... $tmp = array_diff_key($value,$src_db[$key]); if ( !empty($tmp) ) { # code... $fields[$key]=$tmp; } } else array_push($tables,$key); } return $fields; }$pdo = new pdo(dsn, user, pass);//创建数据库链接//源数据库结构$src_tables= null;//表名数组$src_db = null; //数据库结构 表名->表字段$src_table_status = null; //表属性 name -> 属性getdbstructure(src_db,$pdo,$src_tables,$src_db,$src_table_status);//目的数据库结构$dst_tables =null;$dst_db=null;$dst_table_status=null; getdbstructure(target_db,$pdo,$dst_tables,$dst_db,$dst_table_status);$cmp_table = array_diff($dst_tables,$src_tables);$cmp_fields = cmp($src_db,$dst_db);//print_r($cmp_table);$text = null;foreach ($cmp_table as $value) { # code... if ( !strchr($value,"pvprankreward") ) { # code... $text = $text.createtablesql($value,$dst_db[$value]); } }$text = $text . genupdatesql($cmp_fields);$myfile = fopen(file_name,"w"); fwrite($myfile, $text); fclose($myfile);//对比数据库结构 返回差异 表//cmp($dst_db,$src_db);//对比表结构返回有差异的表//$str = createtablesql($src_tables[0],$src_db[$src_tables[0]]);//$myfile = fopen("sql.sql","w");//fwrite($myfile, $str);//fclose($myfile);// print_r("<pre>");//print_r($src_db["pvprankreward170525"]);//print_r($src_table_status["role"]);?>
相关推荐:
php数据库操作记录
php数据库常用的函数详解
php数据库永久连接
以上就是php数据库比较工具分享的详细内容。