基于FleaPHP的数据迁移:Access to Mysql

Web No Comments »

之前给学院弄的两个站都需要数据迁移,一个是Access to Mysql,一个是Excel to Mysql。后者可以把Excel转成Access,所以说到底还是Access to Mysql。

Access to Mysql主要途径有二:工具法和脚本法。前者可以用Navicat等Mysql批量转换,简单又快但不灵活;后者虽然比较麻烦,但效果好,且灵活,这里用到的是第二种。

由于远程服务器不能在PHP上使用Access,所以我是在本机上使用APM Express,把数据导入到本地数据库,再用Navicat迁移到远程数据库,现实使用的效果还不错。

我的目录设置为

根目录为/site

FleaPHP程序目录为/site/APP

迁移数据的原理基本上就是,同时打开ADODB(连接Access)和FleaPHP下的TDG(连接Mysql),再同时读数据和写数据。

先建立一个/site/inc/_common.php文件,由于用不上MVC,所以要用这个来启动非MVC模式的FleaPHP。

<?php
/**
 * 将FleaPHP以non-MVC模式启动,用于传统开发方式
 *
 * @author Hicrokee hicrokee@gmail.com
 * @version 1.0
 * @date Thu Mar 13 15:33:02 CST 2008
 */
 
define('DEPLOY_MODE', true);
define('LIB_DIR', realpath(dirname(__FILE__) . '/../APP'));
require('../FLEA/FLEA.php');
FLEA::loadAppInf(LIB_DIR.'/Config/common.php');
FLEA::import(LIB_DIR);
FLEA::init();

再建立/site/TOOLS/db.php文件,把ACCESS数据库放在同一目录,这个示例代码包含了编码转换,时间STAMP转换,文本替换等常用功能。$rs->Fields($field)的$field值是从0开始,从左到右数的字段序号

<?php
include('../inc/_common.php');
 
//初始化mdb数据库
$conn = new com("ADODB.Connection");
$connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("ncms.mdb");
 
$conn->Open($connstr);
$rs = new com("ADODB.RecordSet");
 
//初始化Mysql数据库
$tblArticles = FLEA::getSingleton('Table_Articles');
/* @var $tblArticles Table_Articles */
 
$rs->Open("select * from NCMS_news",$conn,1,1);
$rows = array();
while(! $rs->eof) {
	$row = array();
	$row['title'] = iconv('GB2312','UTF-8',$rs->Fields(2));//新数据库所有的字段比原数据库长,所以都不用截
	$row['content'] = iconv('GB2312','UTF-8',str_replace('new/tools/loadimg.asp?FileName=','site/upload/news/oldimg/',$rs->Fields(3)));
	$row['author'] = iconv('GB2312','UTF-8',$rs->Fields(4));
	$row['source'] = iconv('GB2312','UTF-8',$rs->Fields(5));
	$row['created'] = iconv('GB2312','UTF-8',strtotime($rs->Fields(16)));//时间STAMP转换
	$row['updated'] = $row['created']; 
	$row['class_id'] = 58;//因为迁移时分类改变了,干脆重置为同一个数字
 
	$rows[] = $row;
	$rs->MoveNext();
}
 
$tblArticles->saveRowset($rows,false);
 
echo '数据转换成功,为了安全,请删除或重命名本文件。';
?>

转换后记得检查是否正确,这里演示用的数据量很少,所以直接用数组缓存了再导入Mysql,如果数据多的话,可以不用TDG而用回原生的PHP代码,另外也要读一部分数据写一部分数据。本例仅适用于少数据的情况。

抛弃MysqlFront,拥抱Navicat

Web No Comments »

Windows平台下的Mysql可视化管理器不多,一般来说能用phpMyAdmin的我都尽量不用其它管理工具,

原因很简单,phpMyAdmin方便,好用,无需客户端,功能丰富且强大,很多时候服务商都不会提供可用的外连接口,此外,MysqlFront一类软件的功能不足,更新慢,编码絮乱,相比之下,phpMyAdmin无疑是最佳选择。

但也有些情况下是无法使用phpMyAdmin的,比如我所管理的院网,我也不明白为什么学校不提供一个phpMyAdmin,而仅凭分配给学院的权限,是无法安装phpMyAdmin的。学校的Mysql提供了一个外连接口,可以让像MysqlFront一类的软件使用,但要用外连就必须使用校园网,对于我们这些使用ADSL的学生来说,老要换网才能管理数据库,是件很痛苦的事。

幸好最近发现了一个更好用的可视化管理器:Navicat,一个比MysqlFront更强大的软件,GUI设计很简洁,能满足大部分的功能,有官方的简体中文版,最重要的是,这个强大的利器完全是免费的!

对我而言,Navicat还有一个很强大的功能:Navicat-HTTP-Tunnel,就是可以通过HTTP作为代理访问数据库!

Navicat可以通过上传一个特定的PHP Script到服务器,模拟出Mysql协议,以此为代理,Navicat就可以访问到服务器的数据库了。学校虽然限制了服务器3306端口的访问,但HTTP的访问理所当然是不受限制的,通过Navicat-HTTP-Tunnel,就能让外网计算机访问校园网的内部Mysql数据库。

Navicat-HTTP-Tunnel的使用很简单,步骤如下:

1、到http://www.navicat.net.cn/index.html下载免费的简体中文版Navicat,安装。

2、在安装目录上,找到ntunnel_mysql.php文件,通过校园网上传至服务器,服务器必需支持PHP,而且这个文件必须是可执行和可访问的。

3、新建连接,在连接的常规设置上填写你的服务器地址和Mysql帐号(这个帐号必须是允许外连的),在HTTP选项卡上勾选“使用HTTP通道”,填上你的ntunnel_mysql.php文件的地址。连接测试成功则可。

总的来说,虽然速度是有点慢,但至少大部分的操作都不成问题。Navicat-HTTP-Tunnel也启发了我,有种冲动开发一个同样通过PHP Script的文件管理器,毕竟没有开通FTP的服务商太多了。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS 登录