mysql数据库本地化操作
<?php if(!defined('SITE_PATH')){ define('SITE_PATH',dirname(dirname(__FILE__))); } $dbconfig=include(SITE_PATH.'/Conf/config.php'); $database=$dbconfig['DB_NAME']; $server=$dbconfig['DB_HOST']; $port=$dbconfig['DB_PORT']; $user=$dbconfig['DB_USER']; $pw=$dbconfig['DB_PWD']; $pre=$dbconfig['DB_PREFIX']; $conn= mysql_connect($server.':'.$port, $user, $pw); //@mysql_query('CREATE DATABASE IF NOT EXISTS `'.$database.'` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); mysql_select_db($database,$conn) or die('select db error'); $tables=array(); foreach (glob(SITE_PATH."/db/*.php") as $filename) { //获取文件夹中的路径 if(basename($filename)!='index.php'&&basename($filename)!='pre.php'){ //排除文件夹中的index.php和pre.php $tables[str_replace('.php','',basename($filename))]=include($filename); //将文件内容组装成数组,不带后缀的文件名为key,文件中return的数组内容为value } } $sqls=array(); foreach($tables as $table=>$db){ //$table 位数据库表名,$db为字段数组 $sql=array(); //根据数组中设置的type类型,转换为数据库字段类型 // $k 为字段,$v 为字段属性,type,auto,pk等 foreach($db as $k=>$v){ if($v['type']=='time'){ $type='int(10) unsigned'; } elseif($v['type']=='number'){ $type='int(10)'; } elseif($v['type']=='datetime'){ $type='datetime'; } elseif($v['type']=='title'){ $type='varchar(255)'; } elseif($v['type']=='money'){ $type='decimal(20,2)'; } elseif($v['type']=='mini'){ $type='tinyint(4)'; } elseif($v['type']=='serialize'){ $type='text'; } else{ $type=$v['type']; } if(isset($v['default'])){ if($v['default']!=='null'){ $type=$type.' DEFAULT \''.$v['default'].'\''; } else{ $type=$type.' DEFAULT NULL'; } } else{ $type=$type.' DEFAULT NULL'; } if($v['auto']){ $type=$type.' AUTO_INCREMENT'; } $sql['columns'][$k]='`'.$k.'` '.$type; if($v['pk']){ $sql['key'][$k]='PRIMARY KEY `'.$k.'` (`'.$k.'`)'; } if($v['ukey']){ $sql['key'][$k]='UNIQUE KEY `'.$k.'` (`'.$k.'`)'; } if($v['key']){ $sql['key'][$k]='KEY `'.$k.'` (`'.$k.'`)'; } } $presql=file_get_contents(SITE_PATH.'/db/sql/sql_'.$pre.$table); if($presql){ $presql=unserialize($presql); // 序列化为数据库中字段映射。修改php数组,来影响数据库字段和索引 // 如果序列化中的字段在PHP数组中没有,则将删除字段语句组装进$sqls[],从而达到修改数组中的字段,来影响数据库中字段的效果 foreach($presql['columns'] as $k=>$v){ if(!in_array($v,$sql['columns'])){ $sqls[]='alter table '.$pre.$table.' drop column '.$k; } } // 如果php数组中的字段不在序列化数组中,则将添加该字段 foreach($sql['columns'] as $k=>$v){ if(!in_array($v,$presql['columns'])){ $sqls[]='alter table '.$pre.$table.' add column '.$v; } } // 如果php数组中的索引在序列化中不存在,则删除索引 foreach($presql['key'] as $k=>$v){ if(!in_array($v,$sql['key'])){ $sqls[]='drop index '.$k.' on '.$pre.$table; } } // 如果序列化中的索引在php数组中不存在,则添加索引 foreach($sql['key'] as $k=>$v){ if(!in_array($v,$presql['key'])){ $sqls[]='alter table '.$pre.$table.' add '.$v; } } } else{ $sqls[$pre.$table]='CREATE TABLE IF NOT EXISTS `'.$pre.$table.'` ('.implode(',',$sql['columns']).','.implode(',',$sql['key']).') ENGINE=InnoDB DEFAULT CHARSET=utf8'; } file_put_contents(SITE_PATH.'/db/sql/sql_'.$pre.$table,serialize($sql)); } foreach($sqls as $k=>$v){ mysql_query($v,$conn); } ?>