之前给学院弄的两个站都需要数据迁移,一个是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代码,另外也要读一部分数据写一部分数据。本例仅适用于少数据的情况。


Recent Comments