<?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);
}
?>