PHP网页游戏学习之Xnova(ogame)源码解读(三)


Posted in PHP onJune 23, 2014

四、 用户注册(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()基本相同,就不详细写了,自己看下吧。至此,用户注册流程就分析完了。

PHP 相关文章推荐
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
php自动加载方式集合
Apr 04 PHP
yii2 数据库读写分离配置示例
Feb 10 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
在laravel中实现事务回滚的方法
Oct 10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 #PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 #PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 #PHP
ThinkPHP实现事务回滚示例代码
Jun 23 #PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 #PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 #PHP
You might like
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
PHP的开发框架的现状和展望
2007/03/16 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
jquery获取radio值实例
2014/10/16 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Python实现结构体代码实例
2020/02/10 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
优秀的计算机专业求职信范文
2013/12/27 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
武夷山导游词
2015/02/03 职场文书
安全教育主题班会总结
2015/08/14 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
PHP使用QR Code生成二维码实例
2021/07/07 PHP
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android