您好,欢迎访问一九零五行业门户网

PHP会员找回密码功能实现实例介绍,php找回密码_PHP教程

php会员找回密码功能实现实例介绍,php找回密码设置思路
1、用户注册时需要提供一个e-mail邮箱,目的就是用该邮箱找回密码。
2、当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的e-mail邮箱,提交。
3、系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678)。
4、系统借助jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名、临时密码、提醒用户及时修改临时密码的提示语)。
5、用户用临时密码即可登录。
html
我们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,然后提交前台js来处理交互。
代码如下 复制代码
输入您注册的电子邮箱,找回密码:
jquery
当用户输入完邮箱并点击提交后,jquery先验证邮箱格式是否正确,如果正确则通过向后台sendmail.php发送ajax请求,sendmail.php负责验证邮箱是否存在和发送邮件,并会返回相应的处理结果给前台页面,请看jquery代码:
代码如下 复制代码
$(function(){
$(#sub_btn).click(function(){
var email = $(#email).val();
var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配email
if(email=='' || !preg.test(email)){
$(#chkmsg).html(请填写正确的邮箱!);
}else{
$(#sub_btn).attr(disabled,disabled).val('提交中..').css(cursor,default);
$.post(sendmail.php,{mail:email},function(msg){
if(msg==noreg){
$(#chkmsg).html(该邮箱尚未注册!);
$(#sub_btn).removeattr(disabled).val('提 交').css(cursor,pointer);
}else{
$(.demo).html(
+msg+);
}
});
}
});
})
以上使用的jquery代码很方便简洁的完成了前端交互操作,如果您有一定的jquery基础,那上面的代码一目了然,不多解释。
当然别忘了在页面中加载jquery库文件,有的同学经常问我说从www.111cn.net下载了demo怎么用不了,那80%是jquery或者其他文件加载路径错了导致没加载必要的文件。
php
sendmail.php需要验证email是否存在系统用户表中,如果有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串作为找回密码的验证码,然后构造url。同时我们为了控制url链接的时效性,将记录用户提交找回密码动作的操作时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载。
代码如下 复制代码
include_once(connect.php);//连接数据库
$email = stripslashes(trim($_post['mail']));
$sql = select id,username,password from `t_user` where `email`='$email';
$query = mysql_query($sql);
$num = mysql_num_rows($query);
if($num==0){//该邮箱尚未注册!
echo 'noreg';
exit;
}else{
$row = mysql_fetch_array($query);
$getpasstime = time();
$uid = $row['id'];
$token = md5($uid.$row['username'].$row['password']);//组合验证码
$url = /demo/resetpass/reset.php?email=.$email.
&token=.$token;//构造url
$time = date('y-m-d h:i');
$result = sendmail($time,$email,$url);
if($result==1){//邮件发送成功
$msg = '系统已向您的邮箱发送了一封邮件
请登录到您的邮箱及时重置您的密码!';
//更新数据发送时间
mysql_query(update `t_user` set `getpasstime`='$getpasstime' where id='$uid ');
}else{
$msg = $result;
}
echo $msg;
}
//发送邮件
function sendmail($time,$email,$url){
include_once(smtp.class.php);
$smtpserver = ; //smtp服务器,如smtp.163.com
$smtpserverport = 25; //smtp服务器端口
$smtpusermail = ; //smtp服务器的用户邮箱
$smtpuser = ; //smtp服务器的用户帐号
$smtppass = ; //smtp服务器的用户密码
$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$emailtype = html; //信件类型,文本:text;网页:html
$smtpemailto = $email;
$smtpemailfrom = $smtpusermail;
$emailsubject = www.111cn.net - 找回密码;
$emailbody = 亲爱的.$email.:
您在.$time.提交了找回密码请求。请点击下面的链接重置密码
(按钮24小时内有效)。
.$url.;
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype);
return $rs;
}
好了,这个时候你的邮箱将会收到一封来自helloweba的密码找回邮件,邮件内容中有一个url链接,点击该链接到www.111cn.net的reset.php来验证邮箱。
代码如下 复制代码
include_once(connect.php);//连接数据库
$token = stripslashes(trim($_get['token']));
$email = stripslashes(trim($_get['email']));
$sql = select * from `t_user` where email='$email';
$query = mysql_query($sql);
$row = mysql_fetch_array($query);
if($row){
$mt = md5($row['id'].$row['username'].$row['password']);
if($mt==$token){
if(time()-$row['getpasstime']>24*60*60){
$msg = '该链接已过期!';
}else{
//重置密码...
$msg = '请重新设置密码,显示重置密码表单,
这里只是演示,略过。';
}
}else{
$msg = '无效的链接';
}
}else{
$msg = '错误的链接!';
}
echo $msg;
reset.php首先接受参数email和token,然后根据email查询数据表t_user中是否存在该email,如果存在则获取该用户的信息,并且和sendmail.php中的token组合方式一样构建token值,然后与url传过来的token进行对比,如果当前时间与发送邮件时的时间相差超过24小时的,则提示“该链接已过期!”,反之,则说明链接有效,并且调转到重置密码页面,最后就是用户自己设置新密码了。
小结:通过注册邮箱验证与本文邮件找回密码,我们知道发送邮件在网站开发中的应用以及它的重要性,当然,现在也流行短信验证应用,这个需要相关的短信接口对接就可以了。
最后,附上数据表t_user结构:
代码如下 复制代码
create table `t_user` (
`id` int(11) not null auto_increment,
`username` varchar(30) not null,
`password` varchar(32) not null,
`email` varchar(50) not null,
`getpasstime` int(10) not null,
primary key (`id`)
) engine=myisam default charset=utf8;
smtp.class.php类文件
代码如下 复制代码
debug = false;
$this->smtp_port = $smtp_port;
$this->relay_host = $relay_host;
$this->time_out = 30; //is used in fsockopen()
$this->auth = $auth; //auth
$this->user = $user;
$this->pass = $pass;
$this->host_name = localhost; //is used in helo command
$this->log_file = ;
$this->sock = false;
}
/* main function */
function sendmail($to, $from, $subject = , $body = , $mailtype, $cc = , $bcc = , $additional_headers = ) {
$mail_from = $this->get_address($this->strip_comment($from));
$body = ereg_replace((^|(rn))(.), 1.3, $body);
$header .= mime-version:1.0rn;
if ($mailtype == html) {
$header .= content-type:text/htmlrn;
}
$header .= to: . $to . rn;
if ($cc != ) {
$header .= cc: . $cc . rn;
}
$header .= from(www.111cn.net): $fromrn;
$header .= subject: . $subject . rn;
$header .= $additional_headers;
$header .= date: . date(r) . rn;
$header .= x-mailer:by redhat (php/ . phpversion() . )rn;
list ($msec, $sec) = explode( , microtime());
$header .= message-id: rn;
$to = explode(,, $this->strip_comment($to));
if ($cc != ) {
$to = array_merge($to, explode(,, $this->strip_comment($cc)));
}
if ($bcc != ) {
$to = array_merge($to, explode(,, $this->strip_comment($bcc)));
}
$sent = true;
foreach ($to as $rcpt_to) {
$rcpt_to = $this->get_address($rcpt_to);
if (!$this->smtp_sockopen($rcpt_to)) {
$this->log_write(error: cannot send email to . $rcpt_to . n);
$sent = false;
continue;
}
if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
$this->log_write(e-mail has been sent to n);
} else {
$this->log_write(error: cannot send email to n);
$sent = false;
}
fclose($this->sock);
$this->log_write(disconnected from remote hostn);
}
return $sent;
}
/* private functions */
function smtp_send($helo, $from, $to, $header, $body = ) {
if (!$this->smtp_putcmd(helo, $helo)) {
return $this->smtp_error(sending helo command);
}
// auth
if ($this->auth) {
if (!$this->smtp_putcmd(auth login, base64_encode($this->user))) {
return $this->smtp_error(sending helo command);
}
if (!$this->smtp_putcmd(, base64_encode($this->pass))) {
return $this->smtp_error(sending helo command);
}
}
if (!$this->smtp_putcmd(mail, from:)) {
return $this->smtp_error(sending mail from command);
}
if (!$this->smtp_putcmd(rcpt, to:)) {
return $this->smtp_error(sending rcpt to command);
}
if (!$this->smtp_putcmd(data)) {
return $this->smtp_error(sending data command);
}
if (!$this->smtp_message($header, $body)) {
return $this->smtp_error(sending message);
}
if (!$this->smtp_eom()) {
return $this->smtp_error(sending . [eom]);
}
if (!$this->smtp_putcmd(quit)) {
return $this->smtp_error(sending quit command);
}
return true;
}
function smtp_sockopen($address) {
if ($this->relay_host == ) {
return $this->smtp_sockopen_mx($address);
} else {
return $this->smtp_sockopen_relay();
}
}
function smtp_sockopen_relay() {
$this->log_write(trying to . $this->relay_host . : . $this->smtp_port . n);
$this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write(error: cannot connenct to relay host . $this->relay_host . n);
$this->log_write(error: . $errstr . ( . $errno . )n);
return false;
}
$this->log_write(connected to relay host . $this->relay_host . n);
return true;
;
}
function smtp_sockopen_mx($address) {
$domain = ereg_replace(^.+@([^@]+)$, 1, $address);
if (!@ getmxrr($domain, $mxhosts)) {
$this->log_write(error: cannot resolve mx . $domain . n);
return false;
}
foreach ($mxhosts as $host) {
$this->log_write(trying to . $host . : . $this->smtp_port . n);
$this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
if (!($this->sock && $this->smtp_ok())) {
$this->log_write(warning: cannot connect to mx host . $host . n);
$this->log_write(error: . $errstr . ( . $errno . )n);
continue;
}
$this->log_write(connected to mx host . $host . n);
return true;
}
$this->log_write(error: cannot connect to any mx hosts ( . implode(, , $mxhosts) . )n);
return false;
}
function smtp_message($header, $body) {
fputs($this->sock, $header . rn . $body);
$this->smtp_debug(> . str_replace(rn, n . > , $header . n> . $body . n> ));
return true;
}
function smtp_eom() {
fputs($this->sock, rn.rn);
$this->smtp_debug(. [eom]n);
return $this->smtp_ok();
}
function smtp_ok() {
$response = str_replace(rn, , fgets($this->sock, 512));
$this->smtp_debug($response . n);
if (!ereg(^[23], $response)) {
fputs($this->sock, quitrn);
fgets($this->sock, 512);
$this->log_write(error: remote host returned . $response . n);
return false;
}
return true;
}
function smtp_putcmd($cmd, $arg = ) {
if ($arg != ) {
if ($cmd == )
$cmd = $arg;
else
$cmd = $cmd . . $arg;
}
fputs($this->sock, $cmd . rn);
$this->smtp_debug(> . $cmd . n);
return $this->smtp_ok();
}
function smtp_error($string) {
$this->log_write(error: error occurred while . $string . .n);
return false;
}
function log_write($message) {
$this->smtp_debug($message);
if ($this->log_file == ) {
return true;
}
$message = date(m d h:i:s ) . get_current_user() . [ . getmypid() . ]: . $message;
if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, a))) {
$this->smtp_debug(warning: cannot open log file . $this->log_file . n);
return false;
;
}
flock($fp, lock_ex);
fputs($fp, $message);
fclose($fp);
return true;
}
function strip_comment($address) {
$comment = ([^()]*);
while (ereg($comment, $address)) {
$address = ereg_replace($comment, , $address);
}
return $address;
}
function get_address($address) {
$address = ereg_replace(([ trn])+, , $address);
$address = ereg_replace(^.*.*$, 1, $address);
return $address;
}
function smtp_debug($message) {
if ($this->debug) {
echo $message .
;;
}
}
}
?>
最后面有个数据库连接类,这里就不介绍了大大家可以百本站找相关的数据库连接mysql类哦
from:http://www.111cn.net/phper/php/54606.htm
http://www.bkjia.com/phpjc/917485.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/917485.htmltecharticlephp会员找回密码功能实现实例介绍,php找回密码 设置思路 1、用户注册时需要提供一个e-mail邮箱,目的就是用该邮箱找回密码。 2、当用户...
其它类似信息

推荐信息