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 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
PHP Stream_*系列函数
Aug 01 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
Jun 14 PHP
PHP获取windows登录用户名的方法
Jun 24 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
php实现简单的MVC框架实例
Sep 23 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
PHP多进程编程实例详解
Jul 19 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 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 截取字符串专题集合
2010/08/19 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php数组查找函数总结
2014/11/18 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
jquery cookie插件代码类
2009/05/26 Javascript
学习ExtJS table布局
2009/10/08 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python的时间模块datetime详解
2017/04/17 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
医学生自荐信范文
2013/12/03 职场文书
开服装店计划书
2014/08/15 职场文书
人民检察院起诉书
2015/05/20 职场文书
演讲比赛主持词
2015/06/29 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
asyncio异步编程之Task对象详解
2022/03/13 Python