<?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. 配置多个Log4net实例

    应用场景: 控制软件工程拆分为多个子项目,在开发阶段希望每个子项目的日志是单独的.同时又希望日志统一集中定义在Tools(Tools为工具类项目,生成Tools.dll)下,而不是分散在各个子项目中. ...

  2. Pascal 语言中字符与字符串

    [题目]输入一段文章(255个字符以内),求文章中单词的个数,相同单词只记一次,The 和 the 视作相同. [敲代码] //网友代码 var article,w:string; arr:array ...

  3. AngularJS 学习笔记(1)

    AngularJS是一款前端JS框架.AngularJS官网 http://angularjs.org [开发环境准备]: 1,下载AngularJS:JS and CSS in Solution 2 ...

  4. 符号渲染篇——Symbol

    Symbol 是对 Graphic 对象进行符号样式设置的接口,所有符号样式类都实现了 Symbol 接口. 1.PictureMarkerSymbolPictureMarkerSymbol 是对于点 ...

  5. 关于App Transport Security的更新,中英文对照 --Xcode 7 --iOS9

    章节都为本人定义,无抄袭,其中英文部分内容为官方文档摘抄以及自己总结,翻译的不好,敬请指正 App Transport Security(暂且翻译为app传输安全) What is ATS? App ...

  6. 微信公共号url地址出错,调用上次设置地址.

    开发微信公共号时总是会遇到要修改公共号里自定义菜单的地址,修改过后有些手机会重新请求错误(上次)的地址. 针对这个问题,我采用重新关注公共号.清楚公共号内容.清楚浏览器缓存的方式,前两种均不得解决,第 ...

  7. Regsvr32注册ActiveX控件

    命令:Regsvr32 XX.dll 注册ActiveX控件 Regsvr32命令参数:/u 卸载ActiveX控件/s 注册成功后不显示操作成功信息框/c 控制台输出/I 调用DllInstall安 ...

  8. (转)MongoDB 3.0 WT引擎参考配置文件

    mongodb 3.0 改变很多,从2.6版本升级到3.0要关注的细节很多,如权限等等.3.0在数据存储引擎上更换成了wiredTiger,在数据压缩方面很有效,解决大数据量问题的情况下,磁盘不够用的 ...

  9. Codevs 1080 线段树联系

    题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或 ...

  10. Winfrom皮肤样式的使用

    IrisSkin类库提供了可供我们使用的设置窗体皮肤的类,简单地说,就是给我们提供了一个皮肤引擎,通过设置皮肤引擎来达到我们想要的窗体界面. 具体的开发步骤: (1)引入IrisSkin.dll文件 ...