walter371

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

 

分类:

技术点:

相关文章:

  • 2021-07-17
  • 2021-08-30
  • 2021-11-03
猜你喜欢
  • 2022-12-23
  • 2021-09-13
  • 2021-10-14
  • 2021-07-02
  • 2021-06-04
  • 2021-10-11
相关资源
相似解决方案