利用PHP脚本将动易(PE)Access数据库迁移至DedeCMS MySQL
本文将详细介绍如何利用PHP脚本,将旧版动易(PowerEasy)ASP系统的Access数据库内容迁移至DedeCMS(织梦)MySQL数据库中。通过ADODB组件读取源数据并进行标准化处理,最终实现文章的自动入库,适用于网站重构或平台升级场景。
迁移原理与目标
动易(PE)通常采用Access(.mdb)作为数据存储后端,而DedeCMS使用MySQL。迁移的核心在于建立两者之间的数据桥接。我们需要执行以下逻辑:
- 连接源数据库:利用Windows环境下的COM组件调用ADO接口读取Access文件。
- 连接目标数据库:通过标准MySQL扩展连接到DedeCMS所在服务器。
- 数据清洗与映射:提取标题、内容、分类ID等关键字段,修正图片相对路径以适配新系统。
- 写入新库:检查重复后,将数据插入DedeCMS的核心表 `dede_archives` 和附加表 `dede_addonarticle`。
准备条件
- 运行环境:由于涉及 `com("ADODB.Connection")`,该脚本必须在 Windows操作系统 且安装了Microsoft Office Access引擎(或JET/ACE驱动)的环境下运行。Linux环境需改用纯PHP mdb解析库。
- 权限配置:确保PHP拥有读取 `.mdb` 文件的权限,且MySQL用户具备对应数据库的读写权限。
- 备份数据:在修改数据库前,务必备份DedeCMS的目标数据库,以防误删或重复录入造成污染。
具体操作步骤
第1步:配置数据库连接信息
打开编辑器,新建一个PHP文件。首先定义源Access数据库的路径和目标MySQL的连接参数。注意修改代码中的实际路径和账号密码。
<?php
// 设置脚本运行时间无限制,防止大数据量超时
set_time_limit(0);
// === 源数据配置 (Access) ===
$conn = new com("ADODB.Connection");
// 请修改下方的路径为实际的 .mdb 文件物理路径
$connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".realpath("E:\web2\qq.mdb");
$conn->Open($connstr);
$rs = new com("ADODB.RecordSet");
// 假设动易文章表名为 PE_Article,根据实际表名调整
$rs->Open("select * from PE_Article Where ArticleID>0 orDER BY ArticleID ASC",$conn,1,1);
// === 目标数据配置 (MySQL/DedeCMS) ===
$conn2 = mysql_connect("localhost","root",""); // 修改用户名和密码
mysql_select_db("dede",$conn2); // 修改为目标数据库名
mysql_query("SET NAMES GBK",$conn2); // 保持编码一致,若新库为UTF8可改为 UTF8
$i=0;
?>
第2步:数据读取与清洗处理
在循环读取Access记录时,需要对关键字段进行处理。例如,清理关键字中的特殊字符,处理时间格式,以及最重要的是**修正图片路径**。动易的文章内容中常包含类似 `[InstallDir_ChannelDir]{$UploadDir}` 这样的虚拟路径占位符,必须替换为DedeCMS默认的 `/UploadFiles` 路径。
<?php
while(! $rs->eof) {
// 1. 获取原始字段
$id = $rs->Fields('ArticleID')->value;
$title = addslashes($rs->Fields('Title')->value);
$classid = $rs->Fields('ClassID')->value;
// 2. 处理标签关键词 (将竖线分隔符转为空格)
$keywordstr = $rs->Fields('Keyword')->value;
$keywordstr = str_replace("|"," ",$keywordstr);
$keyword = trim($keywordstr);
// 3. 处理发布时间
$datestr = $rs->Fields('UpdateTime')->value;
$datearr = explode("-" ,$datestr);
// 注意:此处原脚本为了演示生成了随机日期,生产环境建议保留原更新时间或使用固定偏移
$yy = $datearr[0];
$mm = $datearr[1];
$dd = rand(1,28); // 建议改为: $dd = isset($datearr[2]) ? intval($datearr[2]) : 1;
$time=mktime(0,0,0,$mm,$dd,$yy);
// 4. 获取并清洗文章内容
$content=addslashes($rs->Fields('Content')->value);
// 核心修正:将动易特有的上传目录标记替换为DedeCMS默认路径
$content = str_replace('[InstallDir_ChannelDir]{$UploadDir}','/UploadFiles',$content);
?>
第3步:执行插入操作与去重判断
为防止重复迁移导致数据膨胀,需先查询目标库是否已存在该ID。若不存在,则同时向 `dede_archives`(文章主表)和 `dede_addonarticle`(文章正文附表)写入数据。写入后利用 `sleep()` 避免对数据库造成过大瞬时压力。
<?php
// 检查是否已存在该ID
$sql0 = "select ID from dede_archives where ID='$id'";
$rs0 = mysql_query($sql0,$conn2);
$row = mysql_fetch_array($rs0);
if(intval($row['ID'])==0) {
// 插入主表:dede_archives
// 注意:channel=1 默认为文章模型,如需其他模型请修改typeid对应关系
$sql1 = "insert into dede_archives (ID,typeid,channel,title,sortrank,pubdate,senddate,adminID,keywords) values ('$id','$classid',1,'$title','$time','$time','$time',1,'$keyword')";
$rs1 = mysql_query($sql1,$conn2);
if(!$rs1) {
echo $sql1;
echo "<br>";
echo mysql_error();
// exit; // 调试时可开启中断
}
// 获取刚插入的主表自增ID或指定ID
$id2 = mysql_insert_id();
if($id2>0) {
// 插入附表:dede_addonarticle
$sql2 = "insert into dede_addonarticle (aid ,typeid, body ) values('$id','$classid','$content');";
$rs2 = mysql_query($sql2,$conn2);
if(!$rs2) {
echo $sql2;
echo "<br>";
echo mysql_error();
}
}
}
// 遍历下一条
$rs->MoveNext();
$i++;
// 每处理50条暂停5秒,保护服务器性能
if($i%50==0) sleep(5);
}
echo "完成";
?>
注意事项与排错
- 编码一致性:如果DedeCMS站点是GBK编码,脚本中应使用 `SET NAMES GBK`;如果是UTF-8,请改为 `SET NAMES UTF8`,否则中文会出现乱码。
- 类图依赖:本方法强依赖Windows COM组件。如果你在Linux服务器上操作,需要安装 `MDBTools` 或使用PHP专用的 `MDB2_Driver_mysqli` 等第三方库重写读取部分。
- 栏目映射:代码中 `
classid` 直接使用了动易原有的ID作为DedeCMS的分类ID。这要求你的动易分类ID与DedeCMS分类ID完全一致。如果不一致,需在代码中加入映射数组(如:$class_map = array('1'=>'10','2'=>'12');)进行转换。 - 图片链接:脚本仅替换了根目录虚拟路径。如果原文章使用的是绝对地址(如
http://old.com/img.jpg),则无需修改;如果是其他相对结构,可能需要编写正则表达式进一步替换。注意:迁移后需在DedeCMS后台重新生成HTML或更新缓存以确保图片显示正常。
总结
通过上述PHP脚本,可以高效地完成从动易到DedeCMS的数据迁移工作。关键在于路径的精准替换和表结构的正确对应。该方案具有通用性,类似的ASP CMS(如新云、Nblog等)转PHP CMS的过程亦可参照此逻辑进行二次开发。以上就是利用PHP脚本将动易数据迁移至DedeCMS的详细内容,更多关于DedeCMS数据维护与迁移的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









