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

 

posted on 2014-12-23 16:02  walter371  阅读(485)  评论(0编辑  收藏  举报

导航