<?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. Shanghai InfoSys .NET engineer telephone interview

    Collect the answers,interested friends from research. 1,Interface and Abstract difference? 2,Generic ...

  2. PHP实现前台同步显示后台任务进度

    一次批量发送几千条短信. 如果直接在后台循环执行虽然可行,但是前台操作用户就只能坐着空等,完全看不到后台执行结果,所以考虑能不能有一种办法可以在php后台执行过程中同时在前台显示后台执行任务进度呢. ...

  3. Apache2.4 与 PHP 5.5 64位版的安装配置

    我的环境:windows7 旗舰版 64位 首先下载相关文件: php 5.5.0 windows 64版 http://windows.php.net/download/#php-5.5 (选择 6 ...

  4. Xcode6 模拟器不显示键盘

    在学习加法计算器时,程序运行后发现点击模拟器上的输入框时有时候键盘可以弹出来,有时候又弹不出来. 网上查询结果只需要在模拟器的菜单中找到hardware -> keyboard -> 取消 ...

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

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

  6. angularjs中的directive

    正在初学angularjs中,在网上看到一篇详细讲解directive指令的文章,于是就记录在这里和大家一起分享 angular.module('docsTransclusionExample', [ ...

  7. .NET4.5可以给所有线程设置默认的Culture了

    How to set CurrentCulture for all threads in a domain in .NET 4.5 Before .NET 4.5 if we wanted to se ...

  8. 【风马一族_Android】第4章Android常用基本控件

    第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...

  9. PCB参数计算神器-Saturn PCB Design Toolkit下载及安装指南

    进行PCB设计,特别是高频高速设计时,难免会涉及到PCB相关参数的计算及设置,如:VIA的过流能力,VIA的寄生电容.阻抗等,导线的载流能力,两相互耦合信号线间的串扰,波长等参数. 这里向大家介绍一款 ...

  10. C# Winform中DataGridView的DataGridViewCheckBoxColumn使用方法

    下面介绍Winform中DataGridView的DataGridViewCheckBoxColumn使用方法: DataGridViewCheckBoxColumn CheckBox是否选中 在判断 ...