首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 合並 Discuz! 用戶腳本實現:直接 SQL 導入核心表

     編輯:PHP 綜合知識

場景回顧

兩個 Discuz! 論壇合並,用戶量 12 萬與 1.8 萬。決定保留大站,將小站用戶直接導入大站 pre_ucenter_members 表,快速實現賬號遷移。

關鍵步驟

  1. 從小站導出 pre_ucenter_members 表結構與數據為 SQL 文件
  2. 編寫 PHP 腳本批量執行 SQL,記錄成功/失敗統計
  3. 驗證導入結果,處理 UID 衝突 (如有)

導入腳本

set_time_limit(0);
ini_set('memory_limit', '512M');

$link = mysqli_connect('localhost', 'db_user', 'db_pass', 'target_db')
    or die('DB連接失敗: ' . mysqli_connect_error());
mysqli_set_charset($link, 'utf8mb4');

require 'small_site_uc_members.sql.php'; // 返回 $sqlArr = [...]

$ok = 0; $err = 0; $errors = [];

mysqli_query($link, "SET NAMES utf8mb4");
foreach ($sqlArr as $sql) {
    if (mysqli_query($link, $sql)) {
        $ok++;
    } else {
        $err++;
        $errors[] = [
            'sql'   => $sql,
            'error' => mysqli_error($link),
            'errno' => mysqli_errno($link),
        ];
    }
}

echo "導入完成: 成功 $ok, 失敗 $err\n";
if ($errors) {
    error_log(print_r($errors, true), 3, __DIR__ . '/import_errors.log');
    echo "錯誤詳情已寫入 import_errors.log\n";
}
mysqli_close($link);

SQL 文件生成建議

# 使用 mysqldump 導出純數據 INSERT 語句
mysqldump -u user -p --no-create-info --compact --skip-extended-insert \
  source_db pre_ucenter_members > small_site_uc_members.sql

# 轉換為 PHP 數組文件 (small_site_uc_members.sql.php)
# 簡單腳本: 讀取 SQL 文件,按分號分割,生成 $sqlArr = [...];

局限性與風險

問題影響緩解措施
UID 衝突主鍵重複導入失敗導入前檢查大站最大 UID,小站 UID 整體偏移 (UPDATE uid = uid + offset)
關聯數據缺失積分、好友、帖子、動態等不遷移僅適用於「棄用小站、僅保留賬號登錄」場景
密碼加密差異Discuz! 版本不同導致 password/salt 算法不一致確認兩站 UC_KEY 相同,或統一重置密碼通知用戶
性能瓶頸大量單條 INSERT 耗時極長SQL 使用 INSERT ... VALUES (...),(...),... 批量插入,或 LOAD DATA INFILE

優化版:批量插入

// 解析 SQL 文件,提取 VALUES 部分,組裝批量 INSERT
$batch = [];
$batchSize = 500;
foreach ($sqlArr as $sql) {
    if (preg_match("/INSERT INTO .*? VALUES \((.+)\);/s", $sql, $m)) {
        $batch[] = $m[1];
        if (count($batch) >= $batchSize) {
            $multiSql = "INSERT INTO pre_ucenter_members (uid, username, password, email, ...) VALUES " . implode(',', $batch);
            mysqli_query($link, $multiSql);
            $batch = [];
        }
    }
}
if ($batch) {
    $multiSql = "INSERT INTO pre_ucenter_members (...) VALUES " . implode(',', $batch);
    mysqli_query($link, $multiSql);
}

完整方案對比參考

參考文章 ID 59156《PHP 合並 Discuz! 用戶數據的兩種方案:直接導入與 UCenter 整合》 獲取 UCenter 官方整合方案,實現雙向同步、數據完整、長期運營無憂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved