<?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. ASP三种常用传值方式:

    ASP 页面(两个aspx页面)传值方式:背景: 两个aspx 页面valuepage.aspx tbusername tbpwdobtainvalue.aspx tbusername tbpwd 1 ...

  2. HTML常见标签

    标题:h1.h2.h3.h4.h5.... 段落:p 换行:br 容器:div.span(用来容纳其他标签) 表格:table.tr.td 列表:ul.ol.li 图片:img 表单:input 链接 ...

  3. css+js 控制幻灯片效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...

  5. PAT1005—— 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  6. A*算法的实现

    #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #inc ...

  7. 页面table的每行都有一个<input type='button' />,如何实现点击按钮在按钮下方弹出一个div,点击空白消失

    \ <input id="test" type="button" />/*按钮*/ <div id="tanchu"> ...

  8. C# 序列化(二)二进制序列化的案例

    这篇是针对上一篇讲序列化的文章的一个实际案例,WinForm程序的主界面如下:

  9. 利用kvc对UITabBar上的UITabBarButton的尝试修改.md

    一.前言 一次比较懒的想法,不想自定义UITabBar,也不想用第三方框架,于是想尝试修改苹果私有类来达到部分效果 效果如下 点击tabBar 上的按钮,图片有变大再变小的动画 tabBar 上某个按 ...

  10. SpringMvc入门三----控制器

    在传统的Spring MVC开发方法中,必须在Bean配置文件中为每个控制器类配置实例和请求映射和让每个控制器类去实现或者扩展特定于框架的接口或者基类,不够灵活. 如果Spring MVC可以自动侦测 ...