phpcms迁移ujcms,栏目迁移

<?php
/**
 * PHPCMS 栏目数据迁移到 UJCMS 脚本(适配 ujcms_channel 表)
 * 注意:执行前务必备份 UJCMS 数据库!
 */

// 1. 基础配置
$phpcms_db = [
    'host' => '127.0.0.1',
    'user' => 'root',
    'pwd' => '',
    'dbname' => 'test2',
    'charset' => 'utf8mb4'
];

$ujcms_db = [
    'host' => '127.0.0.1',
    'user' => 'root',
    'pwd' => '',
    'dbname' => 'test3',
    'charset' => 'utf8mb4'
];

$default_config = [
    'site_id_' => 1,
    'channel_model_id_' => 12,
    'article_model_id_' => 11,
    'performance_type_id_' => null,
    'default_alias_prefix' => 'cat_'
];

// 2. 数据库连接
function connectDB($config) {
    $conn = mysqli_connect(
        $config['host'],
        $config['user'],
        $config['pwd'],
        $config['dbname']
    );
    if (!$conn) die("数据库连接失败:" . mysqli_connect_error());
    mysqli_set_charset($conn, $config['charset']);
    return $conn;
}
$phpcms_conn = connectDB($phpcms_db);
$ujcms_conn = connectDB($ujcms_db);


// 3. 关键调整:临时关闭UJCMS外键约束(避免子栏目先导入的问题)
mysqli_query($ujcms_conn, "SET FOREIGN_KEY_CHECKS = 0");


// 4. 获取UJCMS最大ID(避免主键冲突)
$max_id_sql = "SELECT IFNULL(MAX(id_), 0) as max_id FROM ujcms_channel";
$max_id_result = mysqli_query($ujcms_conn, $max_id_sql);
$max_id_row = mysqli_fetch_assoc($max_id_result);
$new_id = $max_id_row['max_id'] + 1;


// 5. 读取PHPCMS栏目(按层级排序:先一级,再二级...)
// 先查所有启用的栏目,再按层级排序
$phpcms_sql = "SELECT * FROM co_category ORDER BY parentid ASC, catid ASC";
$phpcms_result = mysqli_query($phpcms_conn, $phpcms_sql);
if (mysqli_num_rows($phpcms_result) == 0) die("PHPCMS无可用栏目");


// 6. 数据迁移(记录ID映射)
$migrate_success = 0;
$migrate_fail = 0;
$fail_list = [];
$id_map = []; // 存储:PHPCMS的catid → UJCMS的新id_


while ($row = mysqli_fetch_assoc($phpcms_result)) {
    // 1. 处理别名(确保唯一)
    $base_alias = !empty($row['catdir']) 
        ? strtolower(preg_replace('/[^a-zA-Z0-9_]/', '', $row['catdir'])) 
        : $default_config['default_alias_prefix'] . $row['catid'];
    $check_alias_sql = "SELECT COUNT(*) as count FROM ujcms_channel WHERE alias_ = '{$base_alias}' AND site_id_ = '{$default_config['site_id_']}'";
    $check_result = mysqli_query($ujcms_conn, $check_alias_sql);
    $check_row = mysqli_fetch_assoc($check_result);
    if ($check_row['count'] > 0) $base_alias .= '_' . rand(100, 999);


    // 2. 字段映射(关键:父ID用映射后的UJCMS新ID)
    $channel_data = [
        'id_' => $row['catid'], // 用UJCMS自增新ID,避免冲突
        'site_id_' => $default_config['site_id_'],
        // 父ID转换为UJCMS的新ID(如果父栏目已迁移)
        'parent_id_' => isset($id_map[$row['parentid']]) ? $id_map[$row['parentid']] : null,
        'channel_model_id_' => $default_config['channel_model_id_'],
        'article_model_id_' => $default_config['article_model_id_'],
        'performance_type_id_' => $default_config['performance_type_id_'],
        'name_' => mysqli_real_escape_string($ujcms_conn, $row['catname']),
        'alias_' => mysqli_real_escape_string($ujcms_conn, $base_alias),
        'seo_title_' => null,
        'seo_keywords_' => null,
        'seo_description_' => null,
        'type_' => $row['type'] == 1 ? 2 : 1,
        'article_template_' => 'article',
        'channel_template_' => 'channel',
        'channel_static_path_' => null,
        'image_' => null,
        'link_url_' => null,
        'process_key_' => null,
        'target_blank_' => '0',
        'book_' => '0',
        'real_' => '1',
        'nav_' => '1',
        'page_size_' => 20,
        'order_desc_' => '1',
        'allow_comment_' => '1',
        'allow_contribute_' => '0',
        'allow_search_' => '1',
        'mains_json_' => null,
        'clobs_json_' => null,
        'created_' => date('Y-m-d H:i:s'),
        'modified_' => date('Y-m-d H:i:s'),
        'depth_' => 1,
        'order_' => $row['sort'] ?: 999999,
        'views_' => 0,
        'self_views_' => 0
    ];


    // 3. 插入UJCMS
    $insert_sql = "INSERT INTO ujcms_channel (
        id_, site_id_, parent_id_, channel_model_id_, article_model_id_,
        performance_type_id_, name_, alias_, seo_title_, seo_keywords_,
        seo_description_, type_, article_template_, channel_template_,
        channel_static_path_, image_, link_url_, process_key_, target_blank_,
        book_, real_, nav_, page_size_, order_desc_, allow_comment_,
        allow_contribute_, allow_search_, mains_json_, clobs_json_,
        created_, modified_, depth_, order_, views_, self_views_
    ) VALUES (
        '{$channel_data['id_']}',
        '{$channel_data['site_id_']}',
        " . ($channel_data['parent_id_'] === null ? "NULL" : "'{$channel_data['parent_id_']}'") . ",
        '{$channel_data['channel_model_id_']}',
        '{$channel_data['article_model_id_']}',
        " . ($channel_data['performance_type_id_'] === null ? "NULL" : "'{$channel_data['performance_type_id_']}'") . ",
        '{$channel_data['name_']}',
        '{$channel_data['alias_']}',
        " . ($channel_data['seo_title_'] === null ? "NULL" : "'{$channel_data['seo_title_']}'") . ",
        " . ($channel_data['seo_keywords_'] === null ? "NULL" : "'{$channel_data['seo_keywords_']}'") . ",
        " . ($channel_data['seo_description_'] === null ? "NULL" : "'{$channel_data['seo_description_']}'") . ",
        '{$channel_data['type_']}',
        " . ($channel_data['article_template_'] === null ? "NULL" : "'{$channel_data['article_template_']}'") . ",
        " . ($channel_data['channel_template_'] === null ? "NULL" : "'{$channel_data['channel_template_']}'") . ",
        " . ($channel_data['channel_static_path_'] === null ? "NULL" : "'{$channel_data['channel_static_path_']}'") . ",
        " . ($channel_data['image_'] === null ? "NULL" : "'{$channel_data['image_']}'") . ",
        " . ($channel_data['link_url_'] === null ? "NULL" : "'{$channel_data['link_url_']}'") . ",
        " . ($channel_data['process_key_'] === null ? "NULL" : "'{$channel_data['process_key_']}'") . ",
        '{$channel_data['target_blank_']}',
        '{$channel_data['book_']}',
        '{$channel_data['real_']}',
        '{$channel_data['nav_']}',
        '{$channel_data['page_size_']}',
        '{$channel_data['order_desc_']}',
        '{$channel_data['allow_comment_']}',
        '{$channel_data['allow_contribute_']}',
        '{$channel_data['allow_search_']}',
        " . ($channel_data['mains_json_'] === null ? "NULL" : "'{$channel_data['mains_json_']}'") . ",
        " . ($channel_data['clobs_json_'] === null ? "NULL" : "'{$channel_data['clobs_json_']}'") . ",
        '{$channel_data['created_']}',
        '{$channel_data['modified_']}',
        '{$channel_data['depth_']}',
        '{$channel_data['order_']}',
        '{$channel_data['views_']}',
        '{$channel_data['self_views_']}'
    )";


    if (mysqli_query($ujcms_conn, $insert_sql)) {
        $migrate_success++;
        // 记录ID映射:PHPCMS的catid → UJCMS的新id_
        $id_map[$row['catid']] = $channel_data['id_'];
    } else {
        $migrate_fail++;
        $fail_list[] = "栏目【{$row['catname']}】导入失败:" . mysqli_error($ujcms_conn);
    }
}


// 7. 恢复外键约束
mysqli_query($ujcms_conn, "SET FOREIGN_KEY_CHECKS = 1");


// 8. 输出结果
echo "===== 迁移结果 =====\n";
echo "成功导入:{$migrate_success} 个栏目\n";
echo "导入失败:{$migrate_fail} 个栏目\n";
if (!empty($fail_list)) {
    echo "失败详情:\n";
    foreach ($fail_list as $fail) echo "- {$fail}\n";
}


// 9. 关闭连接
mysqli_close($phpcms_conn);
mysqli_close($ujcms_conn);
?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容