“数据提取 + 数据转换 + 数据导入”,下面我将为你提供一个详细的、分步的指南,涵盖从准备到验证的完整流程。

(图片来源网络,侵删)
第一步:准备工作(至关重要!)
在开始任何操作之前,请务必做好备份,以防数据丢失或操作失误。
-
完整备份源站(织梦CMS)和目标站(PHPCMS):
- 备份织梦CMS的网站根目录、数据库(
data目录下的数据库文件)。 - 备份PHPCMS的网站根目录、数据库。
- 强烈建议:在本地或测试服务器上操作,不要在生产环境直接操作。
- 备份织梦CMS的网站根目录、数据库(
-
了解两个系统的数据结构:
- 织梦CMS:
- 表前缀:通常是
dede_(可自定义)。 - 核心表:
dede_archives: 文章主表,存储文章ID、标题、关键字、作者、发布时间等。dede_addonarticle: 文章附加表,存储文章内容、来源、点击量等。dede_arctype: 栏目表,存储栏目ID、名称、父ID、目录、模板等。dede_arcrank: 文章级别表(如:普通会员、投稿、管理员等)。dede_admin: 管理员表。
- 表前缀:通常是
- PHPCMS:
- 表前缀:通常是
v9_(可自定义)。 - 核心表:
v9_news: 文章主表(对应PHPCMS的“文章”模型)。v9_news_data: 文章数据表,存储文章内容、来源、点击量等。v9_category: 栏目表。v9_member: 会员表。v9_admin: 管理员表。
- 表前缀:通常是
- 织梦CMS:
-
创建临时数据库和目录结构:
(图片来源网络,侵删)- 在PHPCMS的数据库中,创建一个新的临时数据库,用于存放转换后的数据,避免污染现有数据。
- 在PHPCMS的
caches目录下,创建一个临时文件夹(如dede_temp),用于存放你的转换脚本。
第二步:数据提取(从织梦导出)
最简单的方式是使用织梦后台的“数据备份/还原”功能。
- 登录织梦CMS后台。
- 进入【系统】-> 【数据库备份/还原】。
- 选择【数据备份】,勾选你需要导出的表:
- 必须导出:
dede_archives,dede_addonarticle,dede_arctype。 - 可选导出:
dede_admin(如果需要转移管理员),dede_member(如果需要转移会员),dede_tagindex,dede_taglist(如果需要转移标签)。
- 必须导出:
- 点击【开始备份】,等待备份完成,你会在
data/databackup/目录下得到一个或多个.sql文件。
第三步:数据转换(核心步骤)
这是最关键、最复杂的一步,你需要编写一个PHP脚本,将织梦的SQL数据读取、处理后,插入到PHPCMS的对应表中。
手动编写转换脚本(推荐,最灵活)
在你的 caches/dede_temp 目录下创建一个 convert.php 文件,然后编写代码。
脚本逻辑:

(图片来源网络,侵删)
- 连接数据库:同时连接织梦的数据库和PHPCMS的临时数据库。
- 栏目转换:
- 从织梦的
dede_arctype表读取所有栏目。 - 遍历每个栏目,将其信息映射到PHPCMS的
v9_category表。 - 注意字段映射:
dede_arctype.id->v9_category.catid(需要重新生成ID)dede_arctype.typename->v9_category.catnamedede_arctype.reid->v9_category.parentid(顶级栏目为0)dede_arctype.typedir->v9.category.url(需要根据PHPCMS的规则重新生成)dede_arctype.defaultname->v9.category.modelid(PHPCMS中文章模型的ID通常是1)
- 生成新ID:由于PHPCMS的栏目ID是自增的,你不能直接使用织梦的ID,你需要先获取PHPCMS当前最大的栏目ID,然后新栏目ID在此基础上+1。
- 从织梦的
- 文章转换:
- 从织梦的
dede_archives和dede_addonarticle表中读取文章数据(JOIN连接)。 - 遍历每篇文章,将其信息映射到PHPCMS的
v9_news和v9_news_data表。 - 注意字段映射:
- 栏目ID:这是最容易出错的地方,你需要建立一个“织梦栏目ID”到“PHPCMS栏目ID”的映射数组。
$map_catid[织梦栏目ID] = PHPCMS栏目ID;。 dede_archives.id->v9_news.id(同样需要重新生成)dede_archives.title->v9_news.titledede_archives.pubdate->v9_news.updatetime(PHPCMS常用更新时间)dede_addonarticle.body->v9_news_data.contentdede_addonarticle.source->v9_news_data.sourcedede_addonarticle.click->v9_news_data.click
- 栏目ID:这是最容易出错的地方,你需要建立一个“织梦栏目ID”到“PHPCMS栏目ID”的映射数组。
- 内容处理:织梦的编辑器生成的内容(如图片路径、
<img>标签中的src)可能需要批量替换,指向新的域名或目录。
- 从织梦的
- 执行插入:使用
INSERT INTO ... VALUES ...语句将处理好的数据插入到PHPCMS的临时数据库表中。
示例代码片段(仅供参考)
<?php
// convert.php
// --- 1. 数据库配置 ---
$db_dede = [
'host' => 'localhost',
'user' => 'dede_user',
'pass' => 'dede_pass',
'dbname' => 'dede_db',
'prefix' => 'dede_'
];
$db_phpcms = [
'host' => 'localhost',
'user' => 'phpcms_user',
'pass' => 'phpcms_pass',
'dbname' => 'phpcms_temp_db', // 临时数据库
'prefix' => 'v9_'
];
// --- 2. 连接数据库 ---
$conn_dede = mysqli_connect($db_dede['host'], $db_dede['user'], $db_dede['pass'], $db_dede['dbname']);
$conn_phpcms = mysqli_connect($db_phpcms['host'], $db_phpcms['user'], $db_phpcms['pass'], $db_phpcms['dbname']);
if (!$conn_dede || !$conn_phpcms) {
die("数据库连接失败!");
}
mysqli_set_charset($conn_dede, 'utf8');
mysqli_set_charset($conn_phpcms, 'utf8');
// --- 3. 栏目转换 ---
$catid_map = []; // 用于存储新旧栏目ID的映射关系
// 获取PHPCMS当前最大栏目ID
$sql_max_catid = "SELECT MAX(catid) as max_id FROM {$db_phpcms['prefix']}category";
$result = mysqli_query($conn_phpcms, $sql_max_catid);
$row = mysqli_fetch_assoc($result);
$new_catid_start = $row['max_id'] + 1;
// 查询织梦所有栏目
$sql_dede_cats = "SELECT * FROM {$db_dede['prefix']}arctype";
$result_dede_cats = mysqli_query($conn_dede, $sql_dede_cats);
while ($cat = mysqli_fetch_assoc($result_dede_cats)) {
$old_catid = $cat['id'];
$new_catid = $new_catid_start++;
// 构建插入PHPCMS的数据
$phpcms_cat = [
'catid' => $new_catid,
'catname' => $cat['typename'],
'parentid' => $cat['reid'] == 0 ? 0 : $catid_map[$cat['reid']], // 注意:父栏目必须先转换
'modelid' => 1, // 假设文章模型ID为1
'url' => 'category.php?catid=' . $new_catid, // 简单示例,实际应根据PHPCMS规则生成
'listorder' => $cat['sortrank'],
'display' => $cat['isdefault'],
];
// ... 执行插入到 v9_category 表 ...
// 记录映射关系
$catid_map[$old_catid] = $new_catid;
}
// --- 4. 文章转换 ---
// 获取PHPCMS当前最大文章ID
$sql_max_news_id = "SELECT MAX(id) as max_id FROM {$db_phpcms['prefix']}news";
$result = mysqli_query($conn_phpcms, $sql_max_news_id);
$row = mysqli_fetch_assoc($result);
$new_newsid_start = $row['max_id'] + 1;
// 查询织梦所有文章
$sql_dede_articles = "SELECT a.*, ad.* FROM {$db_dede['prefix']}archives a LEFT JOIN {$db_dede['prefix']}addonarticle ad ON a.id = aid";
$result_dede_articles = mysqli_query($conn_dede, $sql_dede_articles);
while ($article = mysqli_fetch_assoc($result_dede_articles)) {
$old_catid = $article['typeid'];
$new_catid = $catid_map[$old_catid];
$new_newsid = $new_newsid_start++;
// 插入主表 v9_news
$sql_news = "INSERT INTO {$db_phpcms['prefix']}news (id,catid,catid_1,catid_2,catid_3,title,style,color,keywords,description,username,updatetime,status)
VALUES ($new_newsid, $new_catid, $new_catid, $new_catid, '{$article['title']}', '', '', '{$article['keywords']}', '{$article['description']}', '{$article['adminid']}', {$article['pubdate']}, 99)";
mysqli_query($conn_phpcms, $sql_news);
// 插入数据表 v9_news_data
$sql_news_data = "INSERT INTO {$db_phpcms['prefix']}news_data (id, content, source, click)
VALUES ($new_newsid, '{$article['body']}', '{$article['source']}', {$article['click']})";
mysqli_query($conn_phpcms, $sql_news_data);
}
echo "转换完成!";
mysqli_close($conn_dede);
mysqli_close($conn_phpcms);
?>
使用现成的转换工具(谨慎使用)
网上可能有一些第三方开发的织梦转PHPCMS的转换工具或程序。使用这些工具存在风险:
- 安全性:工具可能包含恶意代码。
- 兼容性:可能与你特定版本的织梦或PHPCMS不兼容。
- 功能:可能无法完美处理所有数据,特别是自定义字段。
如果你决定使用,请务必:
- 从可靠的来源下载。
- 在本地测试环境中先运行。
- 仔细检查转换后的数据。
第四步:数据导入(导入PHPCMS)
当你通过脚本成功将数据转换到PHPCMS的临时数据库后,就可以进行导入了。
- 验证数据:登录PHPCMS后台,连接到你的临时数据库,检查
v9_category和v9_news表中的数据是否正确。 - 正式导入:
- 登录PHPCMS后台,进入【系统】-> 【数据库备份/还原】。
- 选择【数据还原】,选择你临时数据库中的
v9_category和v9_news等表。 - 点击【开始还原】,将数据导入到PHPCMS的主数据库中。
- 替换前缀:如果你的PHPCMS安装时使用了非
v9_的表前缀,请确保在导入时或之后,将临时表中的数据导入到正确前缀的表中。
第五步:收尾工作
数据导入后,还有一些工作需要完成。
- 更新栏目缓存:在PHPCMS后台,进入【内容】-> 【栏目管理】,点击“更新栏目缓存”,以确保后台能正确显示所有栏目。
- 伪静态设置:检查PHPCMS的URL规则设置,确保文章和栏目的链接格式正确。
- 内容替换:检查文章内容中的图片路径、链接等,是否需要批量替换为新的域名或路径。
- 清理临时文件:删除临时数据库和转换脚本。
- 最终测试:在前台和后台全面测试,确保文章能正常显示、能被正常点击、栏目能正常跳转。
总结与建议
- 难度:这是一个中高级的技术任务,需要对PHP和MySQL有一定了解。
- 时间成本:手动编写脚本可能需要数小时甚至更长时间,具体取决于网站的数据量和复杂度。
- 替代方案:如果数据量不大,或者你对技术不自信,可以考虑手动复制粘贴,虽然耗时耗力,但最安全可控,对于重要内容,可以只转换核心文章,舍弃一些不重要的数据。
- 寻求帮助:如果你在某个环节卡住了,可以去PHPCMS或织梦的官方论坛、社区寻求有经验用户的帮助,并附上你的数据结构和遇到的具体问题。
祝你迁移顺利!
