您当前的位置:首页 > CMS常见问题 > 帝国cms常见问题 >

帝国cms会员注册register()函数代码注释

0
<?php
function register($add){
	global $empire,$dbtbpre,$public_r,$ecms_config;
	//用户设置-前台设置-会员注册,0开启,1关闭
	if($public_r['register_ok'])
	{
		//抱歉, 由于系统维护, 暂时关闭会员注册功能。
		printerror('CloseRegister','',1);
		//@include ECMS_PATH."e/data/"."../data/language/gb/pub/q_message.php";
		//$error = $qmessage_r["CloseRegister"];
		//@include(ECMS_PATH."e/data/"."../message/index.php");
	}
	eCheckTimeCloseDo('reg');//验证时间段允许操作
	eCheckAccessDoIp('register');//验证IP
	//如果设置了会员注册地址, 则转向注册地址
	if(!empty($ecms_config['member']['registerurl']))
	{
		header('location:'.$ecms_config['member']['registerurl']);
		exit();
	}
	if(getcvar('mluserid'))
	{
		//您已登录, 不能注册帐号
		printerror('LoginToRegister','',1);
	}
	checkCanPostUrl();//验证来源
	//使用第三方注册, 密码取8位随机密码, 使用第三方账号头像
	$tobind=(int)$add['tobind'];
	if($tobind)
	{
		$add['password']=make_password(8);
		$add['repassword']=$add['password'];
	}
	$username=trim($add['username']);
	$password=trim($add['password']);
	$username=RepPostVar($username);
	$password=RepPostVar($password);
	$email=RepPostStr($add['email']);
	$truepassword=$password;
	if(!$username||!$password||!$email)
	{
		//用户名, 密码与邮箱不能为空
		printerror('EmptyMember','history.go(-1)',1);
	}
	//验证码
	$keyvname='checkregkey';
	if($public_r['regkey_ok'])
	{
		ecmsCheckShowKey($keyvname,$add['key'],1);
	}
	$user_groupid=eReturnMemberDefGroupid();
	$groupid=(int)$add['groupid'];
	$groupid=empty($groupid)?$user_groupid:$groupid;
	CheckMemberGroupCanReg($groupid);//验证会员组是否可注册
	$regip=egetip();
	$regipport=egetipport();
	$pr=$empire->fetch1("select min_userlen,max_userlen,min_passlen,max_passlen,regretime,regclosewords,regemailonly from {$dbtbpre}enewspublic limit 1");
	$userlen=strlen($username);
	if($userlen<$pr['min_userlen']||$userlen>$pr['max_userlen'])
	{
		//用户名长度有误
		printerror('FaiUserlen','',1);
	}
	$passlen=strlen($password);
	if($passlen<$pr['min_passlen']||$passlen>$pr['max_passlen'])
	{
		//密码位数不够或过长
		printerror('FailPasslen','',1);
	}
	if($add['repassword']!==$password)
	{
		//二次密码不一致
		printerror('NotRepassword','',1);
	}
	if(!chemail($email))
	{
		//您输入的邮箱有误
		printerror('EmailFail','',1);
	}
	if(!preg_match("/^[A-Za-z0-9_\x{4e00}-\x{9fa5}]+$/u",$username))
	{
		printerror("用户名只能由中文、英文、数字及下划线组成","",1);
	}
	eCheckIpRegTime($regip,$pr['regretime']);//同一IP注册间隔限制
	toCheckCloseWord($username,$pr['regclosewords'],'RegHaveCloseword');//用户名保留关键字
	$username=RepPostStr($username);
	//检查用户名是否已存在
	$num=$empire->gettotal("select count(*) as total from ".eReturnMemberTable()." where ".egetmf('username')."='$username' limit 1");
	if($num)
	{
		//此用户名已被注册, 请重填!
		printerror('ReUsername','',1);
	}
	//会员邮箱唯一性检查, 1开启, 0关闭
	if($pr['regemailonly'])
	{
		$num=$empire->gettotal("select count(*) as total from ".eReturnMemberTable()." where ".egetmf('email')."='$email' limit 1");
		if($num)
		{
			//此邮箱已被注册
			printerror('ReEmailFail','',1);
		}
	}
	$lasttime=time();//注册时间
	$registertime=eReturnAddMemberRegtime();//返回当前注册时间
	$rnd=make_password(20);//产生20位随机数, 作为随机认证码
	$userkey=eReturnMemberUserKey();//产生12位随机数

	$salt=eReturnMemberSalt();
	$password=eDoMemberPw($password,$salt);
	//根据会员组ID返回是否需要审核
	//这里如果注册需要审核, 则返回0, 否则返回1
	$checked=ReturnGroupChecked($groupid);

	//会员注册审核方式, 0无, 1邮件激活
	//这里的意思是: 如果该会员组的会员需要审核, 则$checked的值为0(以下条件不通过), 如果该会员组的会员不需要审核, 则$checked的值为1。 
	if($checked&&$public_r['regacttype']==1)
	{
		$checked=0;
	}
	//验证附加表必填项
	$mr['add_filepass']=ReturnTranFilepass();
	//该会员组使用的信息使用表单id
	$fid=GetMemberFormId($groupid);
	$member_r=ReturnDoMemberF($fid,$add,$mr,0,$username);



}



//验证注册时间
function eCheckIpRegTime($ip,$time){
	global $empire,$dbtbpre;
	if(empty($time))
	{
		return "";
	}
	//查询会员副表是否存在该IP的记录, 如果不存在则返回空字符串
	$uaddr=$empire->fetch1("select userid from {$dbtbpre}enewsmemberadd where regip='$ip' order by userid desc limit 1");
	if(empty($uaddr['userid']))
	{
		return "";
	}
	//根据IP在会员副表里返回的userid来查询该userid在会员主表里的记录, 如果不存在则返回空字符串
	$ur=$empire->fetch1("select ".eReturnSelectMemberF('userid,registertime')." from ".eReturnMemberTable()." where ".egetmf('userid')."='$uaddr[userid]' limit 1");
	if(empty($ur['userid']))
	{
		return "";
	}
	$registertime=eReturnMemberIntRegtime($ur['registertime']);
	if(time()-$registertime<=$time*3600)
	{
		//同一IP不能重复注册
		printerror('RegisterReIpError','',1);
	}
}
//返回注册时间(int)
function eReturnMemberIntRegtime($regtime){
	global $ecms_config;
	//注册时间保存格式,0为正常时间,1为数值型
	return empty($ecms_config['member']['regtimetype'])?to_time($regtime):$regtime;
}
//时间转换函数
function to_time($datetime){
	if(strlen($datetime)==10)
	{
		$datetime.=" 00:00:00";
	}
	$r=explode(" ",$datetime);
	$t=explode("-",$r[0]);
	$k=explode(":",$r[1]);
	$dbtime=@mktime($k[0],$k[1],$k[2],$t[1],$t[2],$t[0]);
	return $dbtime;
}
//验证包含字符
function toCheckCloseWord($word,$closestr,$mess){
	if($closestr&&$closestr!='|')
	{
		$checkr=explode('|',$closestr);
		$ckcount=count($checkr);
		for($i=0;$i<$ckcount;$i++)
		{
			if($checkr[$i])
			{
				if(stristr($checkr[$i],'##'))//多字
				{
					$morer=explode('##',$checkr[$i]);
					if(stristr($word,$morer[0])&&stristr($word,$morer[1]))
					{
						printerror($mess,"history.go(-1)",1);
					}
				}
				else
				{
					if(stristr($word,$checkr[$i]))
					{
						printerror($mess,"history.go(-1)",1);
					}
				}
			}
		}
	}
}
//返回当前注册时间
function eReturnAddMemberRegtime(){
	global $ecms_config;
	//注册时间保存格式, 0为正常时间, 1为数值型
	return empty($ecms_config['member']['regtimetype'])?date('Y-m-d H:i:s'):time();
}
//返回UserKey
function eReturnMemberUserKey(){
	global $ecms_config;
	return make_password(12);
}
//返回SALT
function eReturnMemberSalt(){
	global $ecms_config;
	//SALT随机码字符数
	return make_password($ecms_config['member']['saltnum']);
}
//密码
function eDoMemberPw($password,$salt){
	global $ecms_config;
	if($ecms_config['member']['pwtype']==0)//单重md5
	{
		$pw=md5($password);
	}
	elseif($ecms_config['member']['pwtype']==1)//明码
	{
		$pw=$password;
	}
	elseif($ecms_config['member']['pwtype']==3)//16位md5
	{
		$pw=substr(md5($password),8,16);
	}
	else//双重md5
	{
		$pw=md5(md5($password).$salt);
	}
	return $pw;
}
//返回是否审核
function ReturnGroupChecked($groupid){
	global $level_r;
	if($level_r[$groupid]['regchecked']==1){
		$checked=0;
	}else{
		$checked=1;
	}
	//注册是否需要审核, 1是, 0否
	//如果注册需要审核, 则返回0, 否则返回1
	return $checked;
}
//返回filepass
function ReturnTranFilepass(){
	$filepass=time();
	return $filepass;
}
//取得表单id
function GetMemberFormId($groupid){
	global $empire,$dbtbpre;
	$groupid=(int)$groupid;
	$r=$empire->fetch1("select formid from {$dbtbpre}enewsmembergroup where groupid='$groupid'");
	return $r['formid'];
}
//返回会员字段
function ReturnDoMemberF($fid,$add,$mr,$ecms=0,$username='',$admin=0){
	global $empire,$dbtbpre,$ecms_config,$public_r;
	//openmembertranimg 文件设置-会员表单附件设置, 开启上传图片, 1为开启
	//memberimgsize 最大图片5120KB=5M
	//memberimgtype 图片扩展名.gif|.jpg|.png|.jpeg|.bmp
	//openmembertranfile 开启上传附件, 1为开启
	//memberfilesize 最大附件500KB
	//memberfiletype 附件扩展名.zip|.rar
	$pr=$empire->fetch1("select openmembertranimg,memberimgsize,memberimgtype,openmembertranfile,memberfilesize,memberfiletype from {$dbtbpre}enewspublic limit 1");
	//fid 表单ID
	//enter text 录入项
	//mustenter text 必填项
	//filef varchar(255) 附件字段集合
	//imgf varchar(255) 图片字段集合
	//canaddf text 可增加项
	//caneditf text 可修改项
	//checkboxf text 复选字段集合
	$formr=$empire->fetch1("select fid,enter,mustenter,filef,imgf,canaddf,caneditf,checkboxf from {$dbtbpre}enewsmemberform where fid='$fid'");
	//检测必填字段
	$mustr=explode(",",$formr['mustenter']);
	$mustcount=count($mustr);
	for($i=1;$i<$mustcount-1;$i++)
	{
		$mf=$mustr[$i];
		//附件或者图片
		if(strstr($formr['filef'],",".$mf.",")||strstr($formr['imgf'],",".$mf.","))
		{
			$mfilef=$mf."file";
			//上传文件
			if($_FILES[$mfilef]['name'])//用户系统中的文件名称
			{
				if(strstr($formr['imgf'],",".$mf.",")){
					//是否开启上传图片
					if(!$pr["openmembertranimg"]){
						printerror("CloseQTranPic","",1);
					}
				}else{
					//是否开启上传附件
					if(!$pr["openmembertranfile"]){
						printerror("CloseQTranFile","",1);
					}
				}
			}elseif(!trim($add[$mf])&&!$mr[$mf]){
				printerror("EmptyQMustF","",1);
			}
		}else{
			//例如 ReturnMCheckboxAddF($add["hobby"], "hobby", ",hobby,")
			$chmustval=ReturnMCheckboxAddF($add[$mf],$mf,$formr['checkboxf']);
			if(!trim($chmustval)){
				printerror("EmptyQMustF","",1);
			}
		}
	}
	//字段处理
	$dh="";
	$tranf="";
	$rec