一、前言

当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程。

本文将使用PHP+Mysql+jQuery来实现一个密码找回的功能,一般步骤是:

1.表单输入注册时的邮箱;

2.验证用户邮箱是否正确,如果用户邮箱不存在网站的用户表中,则提示用户邮箱未注册;

3.发送邮件,如果用户邮箱确实存在用户表中,则组合用于验证用户信息的字符串,并构造URL发送到用户邮箱中;

4.用户登录邮箱收取邮件,点击URL链接到网站验证程序;

5.网站程序通过用户请求的字符串查询本地用户表,比对用户信息是否正确;

6.如果正确则转到重置密码页面重新设置新密码,反之则提示用户验证无效。

二、HTMl代码:

我们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,然后提交前台js来处理交互。

<p><strong>输入您注册的电子邮箱,找回密码:</strong></p>
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p>
<p><input type="button" class="btn" id="sub_btn" value="提 交"></p> 

三、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("<h3>"+msg+"</h3>"); } }); } });
}) 

四、服务器端邮箱验证是否存在:

说明:这一步只要是用户输入邮箱地址的时候,验证该邮箱是否被注册过,以及邮箱的格式验证是否正确,同时给用户邮箱发送一份邮件,用户点击就可以修改密码啦!

// 邮箱验证public function checkEmail(){$email = I('post.email', '756684177@qq.com');$model = M('User');$condition['email'] = $email;$result = $model->where($condition)->find();if (!$result) exit('该邮箱尚未注册');//同时我们为了控制URL链接的时效性$passwordToken = md5($result['id'] . $result['username'] . $result['password']);$link = "http://wechatu.xd107.com/home/Index/resetPassword/email/{$email}/passwordToken/{$passwordToken}";$str = "您好!{$result['username']}, 请点击下面的链接重置您的密码:<p></p>" . $link;$sendResult = send_email($email, "Tinywan世界重置密码", $str);if ($sendResult['error'] == 1) exit($result);//修改密码发送时间$passwordTime = time();$where['id'] = $result['id'];$updateResult = $model->where($where)->setField('passwordTime', $passwordTime);if (!$updateResult) exit('修改数据库密码发送时间失败!');exit("系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!");}

五、用户点击链接打开的地址:

六、用户点击链接打开的地址

说明:首先接受参数email和token,然后根据email查询数据表user中是否存在该Email,如果存在则获取该用户的信息,并且和数据库中的token组合方式一样构建token值,然后与url传过来的token进行对比,如果当前时间与发送邮件时的时间相差超过24小时的,则提示“该链接已过期!”,反之,则说明链接有效,并且调转到重置密码页面,最后就是用户自己设置新密码了。

/*** 密码验证*/public function resetPassword(){$email = I('get.email');$passwordToken = I('get.passwordToken');$model = M('User');$condition['email'] = $email;$result = $model->where($condition)->find();if (!$result) exit('error link');$checkToken = md5($result['id'] . $result['username'] . $result['password']);if ($checkToken != $passwordToken) exit('this no exit link');var_dump($result['passwordtime']);if (time() - $result['passwordtime'] > 24 * 60 * 60) exit('The link has expires');$link = "http://wechatu.xd107.com/home/Index/reSet?uid={$result['id']}"; //这里跳转到一个个人博客的二维码// 跳转至客户密码重置页面header('location:' . $link);}

七、用户重设密码

/*** 重设密码验证*/public function reSet(){$uid = I('get.uid');$model = M('User');$condition['id'] = $uid;$result = $model->where($condition)->find();//若果是POST方式提交的话,就是修改密码了,重置密码就是if (IS_POST) {$newPassword = I('post.password', '11111111111111');$email = I('post.email', '756684177@qq.com');$where['email'] = ':email';$model->password = $newPassword;$model->update_time = time();//save方法的返回值是影响的记录数,如果返回false则表示更新出错,因此一定要用恒等来判断是否更新失败$modPassword = $model->where($where)->bind(':email', $email)->save();if (!$modPassword) exit('修改密码失败');exit($email . 'update password success' . $modPassword);}var_dump($result);die;}

八、数据库表结构:

DROP TABLE IF EXISTS `wechat_user`;
CREATE TABLE `wechat_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`orgId` int(11) DEFAULT '0' COMMENT '组织ID',`username` varchar(40) DEFAULT NULL,`password` varchar(40) NOT NULL,`nickName` varchar(40) DEFAULT NULL,`mobile` varchar(20) DEFAULT NULL,`openId` varchar(50) DEFAULT NULL,`createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',`checkFlag` int(2) DEFAULT NULL,`enabled` tinyint(2) DEFAULT '1',`accessExpires` int(12) DEFAULT NULL,`accessToken` varchar(128) DEFAULT NULL,`reTime` varchar(32) DEFAULT NULL,`email` varchar(128) DEFAULT NULL,`passwordTime` varchar(128) DEFAULT NULL,`update_time` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=444 DEFAULT CHARSET=utf8 COMMENT='组织和用户关系表';

ThinkPHP 3.2 用户注册邮箱验证帐号找回密码相关推荐

  1. php正则邮箱验证,两种PHP用户注册邮箱验证正则表达式方法

    一般我们在WEB端新注册或者登陆账户的时候,对于字段的验证不仅仅是需要验证其是否为空或者长度,有些特殊的字段,比如EMAIL邮箱我们需要验证是不是邮箱的格式,比如是都带有@符号等.刚才在练习PHP程序 ...

  2. 一个 SQL 同时验证帐号是否存在、密码是否正确

    出处:http://www.cnblogs.com/jacklondon/archive/2012/01/13/2321686.html近日偶尔看到一个很巧妙的 SQL 技巧,一个简单的 SQL 同时 ...

  3. 如何得到别人的上网帐号和密码

    如何得到别人的上网帐号和密码,我在这里介绍几种弱智方法. 方案一:利用特洛伊***得到帐号.必备工具:NTESPY.PWLVIEW. 优点:只要对方运行了程序就有80%的成功率,而且不需要任何网络** ...

  4. 访问局域网计算机切换用户,图解“访问局域网中的电脑时提示输入帐号和密码”...

    我们在访问局域网时,遇到这个问题,那么就是对方电脑设置问题引起的,要想不输入密码就能访问对方的电脑,我们就需要在对方的电脑中设置以下四点: 一.关闭"防火墙". 方法: 1.打开& ...

  5. 登录共享计算机的用户名和密码,如何设置访问共享时每次都需要输入帐号和密码?...

    访问共享时,如何设置每次都需要输入帐号和密码呢,这里小编以WIN7系统做演示,XP系统类似操作. 1.首先在开始菜单中找到"附件"下的"运行",点击打开,如图所 ...

  6. [分享]C# 获取Outlook帐号和密码

    [分享]C# 获取Outlook帐号和密码 http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=108281214 转载于:https://www.cn ...

  7. sharepoint 场帐号修改密码

    stsadm -o updatefarmcredentials -userlogin 登录帐号 -password 密码 转载于:https://www.cnblogs.com/flowxp/p/81 ...

  8. QQ用户的帐号和密码安全

    近段时间,腾迅公司一直在吹牛他们如何保护QQ用户的帐号和密码安全,Nprotect键盘加密技术多么强大,由于鄙人近期要做一个密码安全保护控件,就仔细分析了QQ2009的密码保护功能框,结果发现QQ20 ...

  9. 如何修改默认的FTP帐号或密码

    如何修改默认的FTP帐号或密码 星期三, 09/15/2010 - 17:21 - wdlinux wdlinux_lamp,wdlinux_lnmp的系统安装好后,默会创建一个FTP用户 用户名是: ...

最新文章

  1. FckEditor-未能映射路径/UserFiles/image/
  2. 如何在Java 环境下使用 HTTP 协议收发 MQ 消息
  3. table的分页打印
  4. mysql求女生人数_在读女硕士110多万!为什么越来越多的女生选择考研?
  5. Java客户端操作zookeeper:删除节点代码示例
  6. 【小白学习Keras教程】四、Keras基于数字数据集建立基础的CNN模型
  7. ubuntu16.04修改xfce下的gedit的背景颜色
  8. 【youcans 的 OpenCV 例程 200 篇】101. 自适应中值滤波器
  9. Adaline神经网络简单介绍和MATLAB简单实现
  10. python写一个app接收摄像头传输的视频_如何使用Python中的tcp套接字发送和接收网络摄像头流?...
  11. 算法笔记_面试题_数组/链表/跳表/各种数据结构复杂度对比
  12. 禁止微信中长按出现 复制文本和在浏览器中打开
  13. 国家开放大学2021春1135液压气动技术题目
  14. python中counter怎么用_带你走进python 计数器类Counter的用法
  15. 银河麒麟服务器操作系统V10SP1-x86_64-build20/20210518安装dzzoffice,php缺少zip_open函数问题解决
  16. 微信公众号开发——基础认识
  17. WIFI智能电源插座是怎么连上路由器的?
  18. 首都师范 博弈论 6 5 5无限次重复博弈中的策略选择
  19. 一些关于ROS的讨论 Robot Operating System – A flexible framework for writing robot software (ros.org)
  20. PC微信界面透明度修改美化自制小工具+壁纸1.1

热门文章

  1. 酒店智能门锁方案功能及其特点介绍
  2. windows 静态ip与动态ip切换脚本
  3. 全局异常处理-dao-service-controller-gateway网关工程-集中处理token-登陆模块-获取用户信息-ThreadLocal-组件-项目环境推荐-swagger-knif转发
  4. 全球及中国汽车后市场产销规模现状及投资盈利风险分析报告2021-2027年
  5. 乐鑫笔试题:等效电阻的求解
  6. 中望3D Overdrive内核技术之“容差建模”
  7. 复杂背景下卷积神经网络在森林火灾识别中的研究与应用-代码实现
  8. FFmpeg音视频核心技术精讲与实战-李超-ffmpeg开发使用笔记2
  9. 解决tomcat运行报错java.lang.UnsatisfiedLinkError: apache-tomcat-7.0.37\bin\tcnative-1.dll:Can load AMD 64
  10. 杭州高级建筑职称评审条件