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

mysql数据库本地化操作的更多相关文章

  1. zabbix数据库mariadb从服务器迁移到云mysql数据库的操作

    zabbix数据库mariadb从本机迁移到云mysql数据库的操作 1.将zabbix数据库导出,并导入到云数据库中 由于数据库较大,如果直接使用shell会话中断会导致数据库导出或者导入失败,使用 ...

  2. DBA必备:MySQL数据库常用操作和技巧

    DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...

  3. C语言对mysql数据库的操作

    原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ...

  4. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

  5. 利用workbench对linux/Ubuntu系统中的mysql数据库进行操作

    在上一篇文章中,我分享了在linux中如何安装mysql数据库,但是这只是安装了mysql的服务,并没有图形化管理界面,所以这样子操作起来并没有那么方便,那么现在我们就来实现如何利用在window中安 ...

  6. Mysql数据库基础操作

    Mysql数据库基础操作 在mysql数据库中开启使用tab键补全功能 1)修改主配置文件/etc/mysql/my.cnf(mysql和mariadb目录有些不同) vim /etc/mysql/m ...

  7. django 中连接mysql数据库的操作步骤

    django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...

  8. MySQL 数据库高级操作 (配图)

    MySQL数据库高级操作 1.一键部署mysql 数据库 2.数据表高级操作 3.数据库用户管理 4.数据库用户授权 1.首先一键部署mysql 数据库 : 可以看我之前的博客 https://www ...

  9. MYSQL数据库的操作

    Mysql的连接方式: 1.原生函数:mysql_connect($server,$username,$password);   //打开一个到Mysql服务器的连接 mysql_select_db( ...

随机推荐

  1. compass做雪碧图

    由于最近没什么时间好好写博文,我把用sass做雪碧图的关键点贴出来方便自己记忆: config.rb注释 # Set this to the root of your project when dep ...

  2. jQuery选择器之基本过滤选择器Demo

    测试代码: 03-基本过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  3. html学习笔记1

    一.特殊按键和快捷键 键盘上除了有字母.数字之外,还有一些特殊的按键:ctrl.shift.alt.tab ● ctrl键是英语control"控制"的意思,这个按键,单独按没有任 ...

  4. 学习笔记2:前端PS切图

    前端PS切图 一.Photoshop的界面设置 二.Photoshop的基本操作 三.Photoshop的传统切图 四.Photoshop的精准切图 五.Photoshop的扩展知识 视频学习:htt ...

  5. 浅谈我眼中的ASP.NET MVC

    坦白地说,学习MVC是前一段时间的事情了.但是,我当时虽然也实践过,却也不能很好的说出个所以然来.因此,也 一直没敢写点什么文字总结.最近,开始学习EF,也同时在使用MVC来结合EF实践增删改查.慢慢 ...

  6. jsp中页面间传汉字参数转码

    转码:a.href="./showCont.jsp?tcontent="+encodeURI(encodeURI(tcontent)); 解码:java.net.URLDecode ...

  7. Java根据一个网址链接获取源代码

    package test; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpU ...

  8. 【学习笔记】【C语言】第一个C程序

    1.新建C语言程序 *打开Xcode  *新建文件  *选择C语言程序  *输入程序名称  *选择存放路径  *创建完成后  2.也可以用终端来创建  通过指令来创建.c文件   3.编写代码  4. ...

  9. 【Unity3D】场景转换与退出

    1.场景转换 : 老版本的场景切换用的是Application.LoadLevel([场景名字或者在File->Build settings里面的场景代号]); 新版本的场景转换用到了Scene ...

  10. 20141017--异常语句try-catch

    //try-catch 尝试(try)-抓获(catch) try//尝试,保护起来,使程序出错也能执行 { //确定不会出错时不要用try,当不确定时使用try-catch可以捕获错误, int i ...