支援 enum 型別的欄位允許為空插入資料庫

黄文Rex發表於2024-10-03

支援 enum 型別的欄位允許為空插入資料庫,我們需要對現有程式碼進行一些修改。具體來說,我們需要在處理每一行資料時判斷每個欄位的型別,並在插入時正確處理 NULL 值。

以下是修改後的程式碼示例:

// 備份資料記錄
$result = Db::query("SELECT * FROM `{$table}` LIMIT {$start}, 1000");

foreach ($result as $row) {
    // 使用 addslashes 處理特殊字元
    $row = array_map('addslashes', $row);

    // 獲取表結構資訊
    $table_structure = Db::query("SHOW COLUMNS FROM `{$table}`");

    // 構造 INSERT 語句
    $values = [];
    foreach ($table_structure as $column_info) {
        $column_name = $column_info['Field'];
        $column_type = $column_info['Type'];

        // 判斷是否為 enum 型別
        if (stripos($column_type, 'enum') !== false) {
            // 如果是 enum 型別且值為 null 或空字串,則插入 NULL
            if ($row[$column_name] === null || $row[$column_name] === '') {
                $values[] = 'NULL';
            } else {
                // 否則正常插入
                $values[] = "'" . str_replace(array("\r", "\n"), array('\r', '\n'), $row[$column_name]) . "'";
            }
        } else {
            // 非 enum 型別直接插入
            $values[] = "'" . str_replace(array("\r", "\n"), array('\r', '\n'), $row[$column_name]) . "'";
        }
    }

    $sql = "INSERT INTO `{$des_table}` VALUES (" . implode(", ", $values) . ");\n";

    if (false === $this->write($sql)) {
        return false;
    }
}

// 還有更多資料
if ($count > $start + 1000) {
    return array($start + 1000, $count);
}

相關文章