利用PHP脚本将动易(PE)Access数据库迁移至DedeCMS MySQL

Felix
Felix
发布时间:2026-10-13 | 5人浏览过
原创

本文将详细介绍如何利用PHP脚本,将旧版动易(PowerEasy)ASP系统的Access数据库内容迁移至DedeCMS(织梦)MySQL数据库中。通过ADODB组件读取源数据并进行标准化处理,最终实现文章的自动入库,适用于网站重构或平台升级场景。

迁移原理与目标

动易(PE)通常采用Access(.mdb)作为数据存储后端,而DedeCMS使用MySQL。迁移的核心在于建立两者之间的数据桥接。我们需要执行以下逻辑:

  1. 连接源数据库:利用Windows环境下的COM组件调用ADO接口读取Access文件。
  2. 连接目标数据库:通过标准MySQL扩展连接到DedeCMS所在服务器。
  3. 数据清洗与映射:提取标题、内容、分类ID等关键字段,修正图片相对路径以适配新系统。
  4. 写入新库:检查重复后,将数据插入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数据维护与迁移的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表