升級至 PHP 5.4 後,DedeCMS 5.7 後台登入成功卻顯示空白頁(白屏)。根本原因是 PHP 5.4 移除了 session_register() 函式,而 DedeCMS 核心檔案 include/userlogin.class.php 的 keepUser() 方法仍在使用該過時函式。本文提供精確的修復程式碼。
include/userlogin.class.php 中的 keepUser() 使用 @session_register($this->keepUserIDTag) 等語句。session_register() 自 PHP 5.4 起被完全移除(不再只是棄用),呼叫會導致嚴重錯誤中斷腳本,造成白屏。$_SESSION 超全域陣列直接操作 $_SESSION 即可達到相同效果,且相容所有 PHP 版本。
@session_register($this->keepUserIDTag);
$_SESSION[$this->keepUserIDTag] = $this->userID;
@session_register($this->keepUserTypeTag);
$_SESSION[$this->keepUserTypeTag] = $this->userType;
@session_register($this->keepUserChannelTag);
$_SESSION[$this->keepUserChannelTag] = $this->userChannel;
@session_register($this->keepUserNameTag);
$_SESSION[$this->keepUserNameTag] = $this->userName;
@session_register($this->keepUserPurviewTag);
$_SESSION[$this->keepUserPurviewTag] = $this->userPurview;
@session_register($this->keepAdminStyleTag);
$_SESSION[$this->keepAdminStyleTag] = $adminstyle;
PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
PutCookie('DedeLoginTime', time(), 3600 * 24, '/');
global $admincachefile, $adminstyle;
if (empty($adminstyle)) $adminstyle = 'dedecms';
// 移除所有 @session_register() 呼叫,直接寫入 $_SESSION
$_SESSION[$this->keepUserIDTag] = $this->userID;
$_SESSION[$this->keepUserTypeTag] = $this->userType;
$_SESSION[$this->keepUserChannelTag] = $this->userChannel;
$_SESSION[$this->keepUserNameTag] = $this->userName;
$_SESSION[$this->keepUserPurviewTag] = $this->userPurview;
$_SESSION[$this->keepAdminStyleTag] = $adminstyle;
PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
PutCookie('DedeLoginTime', time(), 3600 * 24, '/');
include/userlogin.class.php。session_register。$_SESSION[$this->keepUserIDTag] = $this->keepUserIDTag; 等賦值是多餘的,修正版已移除。global $admincachefile, $adminstyle; 確保變數作用域正確。display_errors=On)或查看錯誤日誌排查其他潛在問題。PHP 版本升級帶來的函式移除是舊專案遷移常見痛點。善用 $_SESSION 取代 session_register()/session_unregister()/session_is_registered() 是通用解法,建議全專案搜尋替換,徹底相容 PHP 5.4+。