Discuz3.3注册程序修改添加记录推荐人账号

Discuz3.3注册入口地址为:member.php?mod=register

一.member.php:

打开之后,代码非常简单。

其中有一句:

1 $mod = !in_array($discuz->var[‘mod‘], $modarray) && (!preg_match(‘/^\w+$/‘, $discuz->var[‘mod‘]) || !file_exists(DISCUZ_ROOT.‘./source/module/member/member_‘.$discuz->var[‘mod‘].‘.php‘)) ? ‘register‘ : $discuz->var[‘mod‘];

这一句里面的 $discuz->var[‘mod‘]来源,有专门的技术贴分析:http://www.phpfensi.com/cms/20150930/10204.html

1 require libfile(‘function/member‘);//载入menber 函数
2 require libfile(‘class/member‘);//载入menber 类库
3 runhooks();  //运行hook点
4
5 require DISCUZ_ROOT.‘./source/module/member/member_‘.$mod.‘.php‘;//载入member_register.php页面。

从这里面来看,主要注册程序页为:source/module/member/member_register.php页面。

二.source/module/member/member_register.php:

if(!defined(‘IN_DISCUZ‘)) {
    exit(‘Access Denied‘);
}//来源检测

define(‘NOROBOT‘, TRUE);

$ctl_obj = new register_ctl();//实例化register_ctl类
$ctl_obj->setting = $_G[‘setting‘];//获取全局变量中setting值
$ctl_obj->template = ‘member/register‘;//载入模板template\default\member\register.htm
$ctl_obj->on_register();//执行on_register函数

注册执行的主函数为:register_ctl类中的on_register(),register_ctl类的位置是:source/class/class_member.php文件中。这个文件在第一部分已经通过载入类库方式载入。

三.source/class/class_member.php:

function register_ctl(){}
function on_register(){}

这个文件只有这两个函数,register_ctl(){}初始化,载入相关类库。on_register()注册程序。

注册程序很长,选几个关键点来看:

大约700行左右(这个程序页面我稍微修改过,跟官方原版略有区别):

            if(!$activation) {
                $ffromuser=getuserbyuid($fromuid);//这个系我添加,上面程序已经获取了$fromuid推荐人ID,这里我获取了一下推荐人的数据(注:这是个人员数据数组对象, $ffromuser[‘username‘]是用户名)。
                $uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G[‘clientip‘], $ffromuser[‘username‘]);//ucenter中心添加用户。

这个程序uc_user_register()是添加用户的具体实现方法。

uc_user_register()这个程序的位置是:uc_client\client.php页面里面。

四.uc_client\client.php:

function uc_user_register($username, $password, $email, $questionid = ‘‘, $answer = ‘‘, $regip = ‘‘,$fromuser = ‘‘) {
    return call_user_func(UC_API_FUNC, ‘user‘, ‘register‘, array(‘username‘=>$username, ‘password‘=>$password, ‘email‘=>$email, ‘questionid‘=>$questionid, ‘answer‘=>$answer, ‘regip‘=>$regip, ‘fromuser‘=>$fromuser));
}

代码很简单,调用了call_user_func()方法实现了多接口复用。其中参数:

UC_API_FUNC参数在该页面头部定义了:

define(‘UC_API_FUNC‘, UC_CONNECT == ‘mysql‘ ? ‘uc_api_mysql‘ : ‘uc_api_post‘);//在我这边连接方式是mysql,根据配置,也可以使用api post方式传送用户注册信息。

uc_api_mysql()函数,在本页面上部定义了:

function uc_api_mysql($model, $action, $args=array()) {
    global $uc_controls;
    if(empty($uc_controls[$model])) {
        if(function_exists("mysql_connect")) {
            include_once UC_ROOT.‘./lib/db.class.php‘;
        } else {
            include_once UC_ROOT.‘./lib/dbi.class.php‘;
        }
        include_once UC_ROOT.‘./model/base.php‘;
        include_once UC_ROOT."./control/$model.php";
        eval("\$uc_controls[‘$model‘] = new {$model}control();");
    }
    if($action{0} != ‘_‘) {
        $args = uc_addslashes($args, 1, TRUE);
        $action = ‘on‘.$action;
        $uc_controls[$model]->input = $args;
        return $uc_controls[$model]->$action($args);
    } else {
        return ‘‘;
    }
}

include_once UC_ROOT."./control/$model.php";表示载入/control/user.php模块。

$action = ‘on‘.$action;表示调用函数onregister();

五.uc_client\control\user.php:

    function onregister() {
        $this->init_input();
        $username = $this->input(‘username‘);
        $password =  $this->input(‘password‘);
        $email = $this->input(‘email‘);
        $questionid = $this->input(‘questionid‘);
        $answer = $this->input(‘answer‘);
        $regip = $this->input(‘regip‘);
        $fromuser = $this->input(‘fromuser‘);//这一行是我添加的推荐人信息。

        if(($status = $this->_check_username($username)) < 0) {
            return $status;
        }
        if(($status = $this->_check_email($email)) < 0) {
            return $status;
        }
        $uid = $_ENV[‘user‘]->add_user($username, $password, $email, 0, $questionid, $answer, $regip, $fromuser);//这一行是我修改的推荐人账号传参。
        return $uid;
    }

$_ENV是PHP中的一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP程序的任何地方直接访问它。

在 uc_client/model/base.php 中,使用了load()方法定义了 $_ENV[$model] 并赋值。

function load($model, $base = NULL) {
    $base = $base ? $base : $this;
    if(empty($_ENV[$model])) {
        require_once UC_ROOT."./model/$model.php";
        eval(‘$_ENV[$model] = new ‘.$model.‘model($base);‘);
    }
    return $_ENV[$model];
}

这里的作用,我们不深究,知道这里调用的是UC_ROOT."./model/user.php中的add_user()方法。

六.uc_client/model/user.php:

大约L129:

    function add_user($username, $password, $email, $uid = 0, $questionid = ‘‘, $answer = ‘‘, $regip = ‘‘, $fromuser = ‘‘) {
        $regip = empty($regip) ? $this->base->onlineip : $regip;
        $salt = substr(uniqid(rand()), -6);
        $password = md5(md5($password).$salt);
        $sqladd = $uid ? "uid=‘".intval($uid)."‘," : ‘‘;
        $sqladd .= $questionid > 0 ? " secques=‘".$this->quescrypt($questionid, $answer)."‘," : " secques=‘‘,";
        $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username=‘$username‘, password=‘$password‘, email=‘$email‘, regip=‘$regip‘, regdate=‘".$this->base->time."‘, salt=‘$salt‘");
        $uid = $this->db->insert_id();
        $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid=‘$uid‘");
        return $uid;
    }

到此,参数就传递到写入数据库的部分了,具体如何放置就不属于本文讨论范围,相信大家会有很多很好的解决方案。

所有需要修改的部分就完成了。总共涉及6个页面。

时间: 2024-10-29 13:36:28

Discuz3.3注册程序修改添加记录推荐人账号的相关文章

注册表添加多级菜单

案例:添加.EXE文件右键菜单父菜单项[DC编程助手],子菜单项[PEiD][OllyDbg] Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\exefile\shell\DC]"SubCommands"="PEiD;OllyDbg""MUIVerb"="DC编程助手""icon"="\"D:\\Program Files\

存储过程之多表添加记录

     在接触MIS类型的项目,无可避免的要和数据库打交道,相信大家对于单个表的操作已经不陌生了(掌握好基本的SQL语句就行).但是随着项目的优化和规范,原本的表中的字段可能要随着范式的进行而分割实体的属性,这样原本一张表就可以满足的功能,现在可能需要多张表同时操作才能进行.今天和大家分享下如何使用数据库自带的存储过程实现同时对多张表的添加记录功能.     存储过程:一组为了完成特定功能的SQL 语句集.创建名为Pro_studentQuery语句集(具体的优缺点和其他功能可以上网百度).

ADO.NET之4-使用SqlCommand对象向数据库添加记录---ShinePans

源代码: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQLTest { class Program { static void Main(string[] args) { //连接数据库 str

使用mybatis注解@Options实现添加记录时返回主键值

官网:http://www.mybatis.org/mybatis-3/index.html 在使用mybatis作为ORM框架时,我通常更喜欢使用注解而非xml配置文件的方式.业务场景:添加记录之后需要返回自己自增长的主键字段值.通常,我们会将DAO层写成如下代码(以添加员工Staff为例): public interface StaffDAO { @InsertProvider(type=StaffProvider.class, method="buildSinleStaff")

利用注册表添加系统右键菜单

最近,不知道是用了什么软件,在清理的时候把右键菜单里面的一些快捷操作都给清理掉了.因为一直在使用git bash命令行工具,要到具体目录操作的时候如果没有右键快捷打开的话,就得一直cd,cd(摩擦,摩擦)...到具体目录下,很痛苦的,所以就去google了下,然后利用修改注册表添加了系统的右键菜单. 注:其实win7以上系统按住shift键在右键就可以在相应目录打开cmd工具 添加空白处的右键菜单(添加 git bash为例) 1.win+r运行regedit(注册表编辑器). 2.找到HKEY

mybatis添加记录时返回主键id

参考:https://www.cnblogs.com/nuccch/p/7687281.html 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个目的.鉴于mybatis目前已经支持xml配置和注解2种方式,所以分别给予详细介绍. 数据表设计: drop table if exists `test`; create table `test` ( `id` bigint(20) NOT NU

Django之跨表查询及添加记录

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)

1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity   对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef   添加一条记录后,如何获取新记录的ID值?如下代码: var te = new TestEntity (){ Name = "名字", Age = 21};using (EFDbContext context = new EFDbContext()){ context.TestEntity .Add(te);

学习Spring Cloud中eureka注册中心添加security认证,eureka client注册启动报错

最近使用SpringCloud在eureka server端添加security登录认证之后,eureka client注册启动一直报错,大概意思是未发现eureka server,导致注册启动失败! 1 2018-08-09 14:50:06.042 WARN 13256 --- [nfoReplicator-0] c.n.discovery.InstanceInfoReplicator : There was a problem with the instance info replicat