6月28號阿裡雲polarDB宕機後, 被迫把一部分老客戶用的數據遷移到自架的MySQL 8.0服務裡面。客戶用的是dedecms, 下午打電話說後台登錄不上去了, 29號抽空找了半天, 終於看到是因mysql 8.0新制定的語句表名限制條件被dede自帶的後台用戶登錄檢查語句指定表別名所違背而引起的bug。如何解決呢?
找到dedecms的文档目錄, 在include子目錄下找到userlogin.class.php, 249行左右看到如下語句:
//只允許用戶名和密碼用0-9,a-z,A-Z,'@','_','.','-'這些字符 $this->userName = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $username); $this->userPwd = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $userpwd); $pwd = substr(md5($this->userPwd), 5, 20); $dsql->SetQuery("SELECT admin.*,atype.purviews FROM `#@__admin` admin LEFT JOIN `#@__admintype` atype ON atype.rank=admin.usertype WHERE admin.userid LIKE '".$this->userName."' LIMIT 0,1"); $dsql->Execute(); $row = $dsql->GetObject();
其中SetQuery就是設定將要執行的sql語句, 下一行Execute()來執行這個設定好語句,我們從語句裡面改。改成如下:
//只允許用戶名和密碼用0-9,a-z,A-Z,'@','_','.','-'這些字符 $this->userName = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $username); $this->userPwd = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $userpwd); $pwd = substr(md5($this->userPwd), 5, 20); $dsql->SetQuery("SELECT admi.*,atype.purviews FROM `#@__admin` admi LEFT JOIN `#@__admintype` atype ON atype.rank=admi.usertype WHERE admi.userid LIKE '".$this->userName."' LIMIT 0,1"); $dsql->Execute(); $row = $dsql->GetObject();
這樣一來,表的別名從admin刪去一個n被改成admi, 就可以正常登錄後台了。
任何其他問題可以加QQ群: 2702237