標籤:選擇 where file 解決 應該 strong 頁面 分析 允許
論壇升級後發現註冊使用者在輸入任何郵箱email時,一直提示email 地址無效.用firephp跟蹤發現:隨機產生的email的尾碼是@localhost!
找到原因,修改如下:
//原來代碼if(empty($email) && $_G[‘setting‘][‘forgeemail‘]){$_GET[‘email‘] = $email = strtolower(random(6)).‘@‘.$_SERVER[‘HTTP_HOST‘];}//但是如果本地調試emai尾碼就是@localhost,不符合郵箱的規則if(empty($email) && $_G[‘setting‘][‘forgeemail‘]){$_GET[‘email‘] = $email = strtolower(random(16)).‘@‘.‘klaus.com‘;}//增加了16位隨機碼,減少產生相同的郵箱機率;//尾碼固定,這樣就不提示‘Email 地址無效‘了!
但是這個感覺太lower了,回到dz3.1以前的玩法是:
在DZ3.2以前的版本的後台我們可以在全域——註冊與訪問——取消郵箱註冊必填如:
接下來就問題來了,Discuz官方團隊可能也考慮到了這個問題,也許他們也像我這樣認為這個地方在後台出現沒多大必要,於是他們就在X3.2版本中更新了這個模組,更新的結果我覺得應該是這樣的:在後台取消這個設定,但資料庫裡面儲存的資訊不變,而且在註冊的時候不再使用這個資料庫裡面的設定的值為依據。於是就造成了上面的問題了,雖然讓使用者覺得不需要必須填(因為沒紅星),但不填之後註冊不了
問題分析
通過對X3.1後台設定分析發現這裡是一個radio類型的,也就是開關(廢話而已,誰都看得出來);表單name為settingnew[forgeemail],值為0和1,0為關閉,1為開啟,這個跟一般的習慣都是一樣的。也就是說這個值選擇1時我們註冊的時候可以不需要填寫郵箱,反之也就是預設情況下我們必須填寫郵箱才能註冊帳號。
而做過Discuz二次開發的同學都應該清楚,其實後台類似這樣的設定資料都是儲存在common_setting這個資料表中,而很快我發現這個資料表中直接有forgeemail這個記錄,說明這個地方dz是直接儲存的(不想儲存高亮值資訊那樣,還通過進位轉化,哈哈,不用再看原始碼去了)。如(當然下面是預設的樣子)
問題解決
說到這裡大家就應該明白了什麼問題了,其實這個問題就是3.2以後這個資料表中的skey為forgeemail的記錄只是用於判斷是否帶紅星,而不用於判斷是不是真要填;換句話說不管這裡設定的是0還是1,你的網站註冊的時候都得填寫郵箱(這可能也是DZ團隊在升級改變這個問題所忽視的地方,比如就算強制設計成必填,那麼也應該把資料庫的這個欄位值在升級的時候自動覆蓋成0了)。
那麼如果徹底解決(也就是可以讓你的網站實現使用者不不必填寫郵箱也可以註冊),這個相對比較複雜,要修改你註冊表單的驗證程式,而且我個人也不推薦這麼做,這裡就不詳述了。
那麼接下來就是把註冊的時候帶上紅星(其實預設的時候就是這樣的),當然問題是針對在3.2之前通過後台設定過這值的網站。那麼現在去資料庫找到common_setting這個資料表找到skey值forgeemail的svalue改為預設的0就可以了,也可以在資料庫管理工具或者網站後台運行以下sql語句
update pre_common_setting set ‘svalue‘=‘0‘ where ‘skey‘=‘orgeemail‘注意:這裡的表首碼為DZ的預設的pre_,如果你修改了,改成你新修改的
discuzX3.2後台關閉註冊郵箱必填選項的功能。詳細過程如下:
步驟1:source/admincp/admincp_setting.php 檔案
尋找:
showsetting(‘setting_access_register_send_register_url‘, ‘settingnew[sendregisterurl]‘, $setting[‘sendregisterurl‘], ‘radio‘);
大概是440-441行:
增加以下代碼:
showsetting(‘setting_access_register_forge_email‘, ‘settingnew[forgeemail]‘, $setting[‘forgeemail‘], ‘radio‘);
步驟2:開啟source/language/lang_admincp.php 檔案
尋找: 一個郵箱只允許註冊一個帳戶
大概811行,增加以下代碼:
‘setting_access_register_forge_email‘ => ‘取消註冊郵箱必填‘,‘setting_access_register_forge_email_comment‘ => ‘開啟後如果用不不填寫註冊郵箱,將自動產生一個郵箱地址‘,
步驟3:修改source
/class/class_member.php
大概611行:
原文是:
$email = strtolower(trim($_GET[‘email‘]));if(empty($this->setting[‘ignorepassword‘])) {if($_GET[‘password‘] !== $_GET[‘password2‘]) { showmessage(‘profile_passwd_notmatch‘);}if(!$_GET[‘password‘] || $_GET[‘password‘] != addslashes($_GET[‘password‘])) { showmessage(‘profile_passwd_illegal‘); } $password = $_GET[‘password‘];} else { $password = md5(random(10)); }}
修改為(或直接替換以下:)
$email = strtolower(trim($_GET[‘email‘]));if(empty($email) && $_G[‘setting‘][‘forgeemail‘]) { $_GET[‘email‘] = $email = strtolower(random(6)).‘@‘.$_SERVER[‘HTTP_HOST‘];}if(empty($this->setting[‘ignorepassword‘])){ if($_GET[‘password‘] !== $_GET[‘password2‘]) { showmessage(‘profile_passwd_notmatch‘); } if(!$_GET[‘password‘] || $_GET[‘password‘] != addslashes($_GET[‘password‘])) { showmessage(‘profile_passwd_illegal‘); } $password = $_GET[‘password‘];} else { $password = md5(random(10));}}
工具->更新緩衝:
全域->註冊與存取控制:
如果你想在註冊頁面不顯示 註冊郵箱選項,直接去掉模板中的相應的email代碼即可。
關閉discuzX3.2註冊頁面的註冊郵箱驗證