一、前言

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

本文将使用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 '' 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 '',
`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='组织和用户关系表';

最新文章

  1. JavaScript之单例实战
  2. 《小白的CFD之旅》招募写手
  3. 敏捷开发--scrum
  4. DOJO官方API翻译或解读-dojo/_base/lang --hitch()
  5. python 之 推导式
  6. java中的Robot
  7. Linux安装Flash player
  8. Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能
  9. 响应式十日谈第一日:使用 rem 设置文字大小
  10. GCD 倒计时
  11. Python 进程与线程小随笔
  12. 4月11日java多线程4
  13. npm后台启动nuxt服务之 kill
  14. Azure CosmosDB (10) Azure Cosmos DB体系结构
  15. 向redis中添加删除list列表
  16. EF大数据批量处理 EntityFrameWork下增加扩展方法
  17. java框架之Hibernate(1)-简介及初使用
  18. java中的字符、字符串及数字之间的转换(转)
  19. Python几种数据结构内置方法的时间复杂度
  20. php-fpm 的 pm.start_servers 参数调整

热门文章

  1. ComboBox中如何嵌套TreeView控件
  2. hbase中文内容编码转换
  3. 洛谷 P4878 [USACO05DEC]layout布局
  4. BZOJ4012 HNOI2015开店(树链剖分+主席树)
  5. 【刷题】UOJ #374 【ZJOI2018】历史
  6. android 面试准备基础题
  7. android 组件使用()
  8. 洛谷 P4345 [SHOI2015]超能粒子炮&#183;改 解题报告
  9. 找到第一个只出现一次的字符并返回它的位置(Python)
  10. c/c++ 整形转字符串