程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP網頁游戲學習之Xnova(ogame)源碼解讀(三)

PHP網頁游戲學習之Xnova(ogame)源碼解讀(三)

編輯:PHP綜合

四、 用戶注冊(reg.php)

在看用戶注冊之流程之前,我把表的用途做個簡單說明,現在只是大概的說明,後面我們再仔細了解,大家可以記下這個說明。

game_aks          聯合攻擊組記錄表,攻擊完成刪除數據
game_alliance      聯盟表
game_annonce      公告表,基本無用
game_banned        Ban玩家表
game_buddy        好友表
game_chat          聊天記錄表
game_config        系統參數表
game_errors        錯誤日志表
game_fleets        艦隊活動記錄表,活動完成刪除數據
game_galaxy        星系表
game_iraks        星際導彈活動表,活動完成刪除數據
game_lunas        月球列表
game_messages      消息表
game_notes        筆記表
game_planets      星球列表,包括月球
game_rw            戰報表
game_statpoints    積分表
game_users        用戶表


現在我們開始用戶注冊流程,一開始又可以看到定義了兩個常量,

define('INSIDE' , true);
define('INSTALL' , false); 

INSIDE是用來防止攻擊的,值為true;INSTALL是用來記錄現在是否處於安裝游戲的進程中,值為false。接下來又是Include兩個文件,extension.inc和common.php;然後又是load語言文件reg.mo。在後面的章節裡,我不再介紹了前面這段代碼,大家已經明了了。


下面聲明了兩個函數,用來發送注冊成功後的信息,包括用戶名和密碼等。

function sendpassemail($emailaddress, $username, $password)
function mymail($to, $title, $body, $from = '') 


現在介紹Xnova源碼裡面經常用到的一個結構,下面是偽代碼說明,

if ($_POST) { //如果用戶有輸入
//這裡是有用戶輸入後執行過程
}else{
//這裡是無用戶輸入後的執行過程,包括頁面第一次顯示的時候
}


我們看用戶注冊流程,為了說明前面的結構,特意貼了代碼。和前面我們講過的一樣,先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()創建星球,這裡要使用三個系統參數LastSettedGalaxyPos、LastSettedSystemPos、LastSettedPlanetPos,看命名就應該清楚,分別是最後星系、最後太陽系、最後行星位置

8. 更新users表中的星球ID為剛剛生成的星球ID

9. 向這個玩家發送歡迎信息

10. 向這個玩家發送注冊信息郵件

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()基本相同,就不詳細寫了,自己看下吧。至此,用戶注冊流程就分析完了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved