PHP網頁游戲學習之Xnova(ogame)源碼解讀(三)
四、 用戶注冊(reg.php)
在看用戶注冊之流程之前,我把表的用途做個簡單說明,現在只是大概的說明,后面我們再仔細了解,大家可以記下這個說明。
game_aks 聯合攻擊組記錄表,攻擊完成刪除數據 game_alliance 聯盟表 game_annonce 公告表,基本無用 game_banned Ban玩家表 game_buddy 好友表 game_chat 聊天記錄表 game_config 系統(tǒng)參數表 game_errors 錯誤日志表 game_fleets 艦隊活動記錄表,活動完成刪除數據 game_galaxy 星系表 game_iraks 星際導彈活動表,活動完成刪除數據 game_lunas 月球列表 game_messages 消息表 game_notes 筆記表 game_planets 星球列表,包括月球 game_rw 戰(zhàn)報表 game_statpoints 積分表 game_users 用戶表
現在我們開始用戶注冊流程,一開始又可以看到定義了兩個常量,
define('INSIDE' , true);
define('INSTALL' , false);
INSIDE是用來防止攻擊的,值為true;INSTALL是用來記錄現在是否處于安裝游戲的進程中,值為false。接下來又是Include兩個文件,extension.inc和common.php;然后又是load語言文件reg.mo。在后面的章節(jié)里,我不再介紹了前面這段代碼,大家已經明了了。
下面聲明了兩個函數,用來發(fā)送注冊成功后的信息,包括用戶名和密碼等。
function sendpassemail($emailaddress, $username, $password) function mymail($to, $title, $body, $from = '')
現在介紹Xnova源碼里面經常用到的一個結構,下面是偽代碼說明,
if ($_POST) { //如果用戶有輸入
//這里是有用戶輸入后執(zhí)行過程
}else{
//這里是無用戶輸入后的執(zhí)行過程,包括頁面第一次顯示的時候
}
我們看用戶注冊流程,為了說明前面的結構,特意貼了代碼。和前面我們講過的一樣,先gettemplate文件,然后parse出來并顯示頁面。
if ($_POST) {
//代碼略
} else {
$parse = $lang;
$parse['servername'] = $game_config['game_name'];
$page = parsetemplate(gettemplate('registry_form'), $parse);
display ($page, $lang['registry'], false);
}
下面看用戶輸入信息后的流程,一堆的if都是判斷用戶輸入的信息是否合法,并用$errors變量記錄錯誤的數量,$errorlist變量記錄錯誤的消息。如果$errors不為零就輸出錯誤信息;如果沒有錯誤,就進入下面的流程:
1. 檢查用戶名是否有非法字符
2. 檢查Email是否有非法字符
3. 檢查星球名是否有非法字符
4. 加密用戶的密碼,md5
5. 往表users中INSERT用戶信息
6. 取得剛剛插入生成的用戶ID號備用
7. 一大段代碼功能,找一個空的星球坐標給這個用戶作為母星,并使用函數CreateOnePlanetRecord()創(chuàng)建星球,這里要使用三個系統(tǒng)參數LastSettedGalaxyPos、LastSettedSystemPos、LastSettedPlanetPos,看命名就應該清楚,分別是最后星系、最后太陽系、最后行星位置
8. 更新users表中的星球ID為剛剛生成的星球ID
9. 向這個玩家發(fā)送歡迎信息
10. 向這個玩家發(fā)送注冊信息郵件
11. 顯示注冊成功頁面,注冊結束
以上流程,我們都可以找到對應的代碼,代碼難度不大,所以沒有列出來。函數CreateOnePlanetRecord()以后詳細介紹,現在說了反而頭大,函數SendSimpleMessage()我們現在看一下,聲明在SendSimpleMessage.php文件中。
function SendSimpleMessage ( $Owner, $Sender, $Time, $Type, $From, $Subject, $Message) {
global $messfields;
if ($Time == '') {
$Time = time();
}
if ($Sender == null){
$Sender = 0;
}
$QryInsertMessage = "INSERT INTO {{table}} SET ";
$QryInsertMessage .= "'message_owner' = ". $Owner .", ";
$QryInsertMessage .= "'message_sender' = ". $Sender .", ";
$QryInsertMessage .= "'message_time' = " . $Time . ", ";
$QryInsertMessage .= "'message_type' = ". $Type .", ";
$QryInsertMessage .= "'message_from' = '". addslashes( $From ) ."', ";
$QryInsertMessage .= "'message_subject' = '". addslashes( $Subject ) ."', ";
$QryInsertMessage .= "'message_text' = '". addslashes( $Message ) ."';";
doquery( $QryInsertMessage, 'messages');
$QryUpdateUser = "UPDATE {{table}} SET ";
$QryUpdateUser .= "'".$messfields[$Type]."' = '".$messfields[$Type]."' + 1, ";
$QryUpdateUser .= "'".$messfields[100]."' = '".$messfields[100]."' + 1 ";
$QryUpdateUser .= "WHERE ";
$QryUpdateUser .= "'id' = '". $Owner ."';";
doquery( $QryUpdateUser, 'users');
}
函數的功能是往messages表中插入詳細消息,并更新users表的消息數量,很明了,呵呵。另外一個函數message()的功能和display()基本相同,就不詳細寫了,自己看下吧。至此,用戶注冊流程就分析完了。
相關文章
PHP讀取Excel內的圖片(phpspreadsheet和PHPExcel擴展庫)
今天接到了一個從Excel內讀取圖片的需求,這里介紹一下分別使用phpspreadsheet和PHPExcel擴展庫來實現讀取Excel內圖片的功能,感興趣的朋友一起看看吧2019-11-11
Thinkphp5.0框架視圖view的循環(huán)標簽用法示例
這篇文章主要介紹了Thinkphp5.0框架視圖view的循環(huán)標簽用法,結合實例形式分析了thinkPHP5框架視圖view中的volist標簽、foreach標簽、for標簽相關使用方法,需要的朋友可以參考下2019-10-10

