今天測試 XOOPS 2.7 的 profile 模組時,無意間發現後台欄位編輯有一個問題。 操作路徑:後台 → Profile 模組 → 欄位 → 編輯 只要修改任意一項後送出,就會出現錯誤: Errors field_name 為必填項 Incorrect column name '' MySQL 除錯訊息會看到類似這段: ALTER TABLE profile_profile ADD varchar(255) NULL 一開始看起來很像資料表壞掉,因為 SQL 竟然要新增一個空白欄位名稱。但後來追程式才發現,真正原因不是資料表問題,而是表單送出時沒有把既有欄位的 id 傳回去。 XOOPS 2.7 的 modules/profile/admin/field.php 在儲存時會從 POST 讀取欄位 id: $fieldId = Request::getInt('id', 0, 'POST'); 如果 POST 沒有收到 id,系統就會誤判成「新增欄位」。但因為目前其實是在編輯既有欄位,表單中沒有 field_name 輸入框,最後就變成欄位名稱是空字串,進而產生: ADD varchar(255) 修復方式 用文字編輯器打開:modules/profile/include/forms.php 找到 profile_getFieldForm() 裡建立表單的位置,大約在前段: $form = new XoopsThemeForm($title, 'form', $action, 'post', true); 在下方加入: if (!$field->isNew()) { $form->addElement(new XoopsFormHidden('id', $field->getVar('field_id'))); } 也就是讓所有「編輯既有欄位」的表單,都固定送出 hidden id。 修正後,送出欄位設定時,field.php 就能正常收到 POST id,不會再誤判成新增欄位,也不會產生空欄位名稱的 SQL。 修正後結果 經實測: - profile 欄位可正常編輯 - 欄位設定可正常儲存 - 不再出現 field_name ...