PHP找回密码机制流程

 更新时间:2016年11月25日 17:35  点击:1602

笔者前段接了一个项目,其中包含了一个用户注册系统,用到了密码找回功能,简单整理一下,写点心得。

首先,我们假定你已经有了一个用户注册系统。其中用户表可能如下:

create table member(
id int unsigned not null auto_incremtnt,
username………………
passwords char(32) not null,
email varchar(100) not null,
……………………………..
);

现在讨论的焦点不是数据库设计,我们主要谈密码找回。

我们可以选择的密码找回方案可能有以下几种:
1. 用户预设找回密码问题,并且提供找回密码答案。
2. 用户通过email 找回密码
..........................

第一种方案或许是个很好的解决方案,但我们这次并不选择此方案,其中的种种原因,也不在本讨论之内。我们用第二种方案作为本次的主要讨论对象。

那么我们开始吧。

第二种方案的其中好处是:
1. 注册用户必须提供正确的邮箱,否则将不能使用系统所提供的密码重设功能。
2. 必须由该用户通过邮箱确认。
这可能对企业来说,是件好事。企业总是费劲心思的想得到用户真实的具体信息,以便进行有针对性的邮件列表服务。这也是这次开发用户要求这样做的一个主要原因。

我们可能会在login界面提供一个链接,或者在login失败后提供一个链接。链接名当然你可以自己定义了,我定义的是:忘了密码,需要找回吗?

当用户点击找加密码时,我们会提供一个input表单。让用户输入用户名(假如是login失败后,我们可以用session填充表单内容)。用户点击提交后,我们开始我们的密码重设功能流程。

我们可能会创建这样一个文件 send_reset_pass_mail.php。这个文件主要负责产生一个通过GET方法传递的字符串,并且将其发送出去。

代码可能如下:
PHP代码:
<?php
/**
* 我们假设你已经在config.inc.php文件里配置好了你的sql信息,mail信息
*/
require_once('config.inc.php');

/**
* 你需要一下sendmail类来进行邮件发送,我们也假设你已经配置好,并且能正发送邮件
*/
require_once('sendMail.inc.php');

/**
* 首先我们执行查询,得到此用户的相关信息
* 你不要告诉我你不知道$_POST['username']是怎么得到的,假如是这样,我郁闷一下你。
* 我使用了adodb的类,并且已经在配置文件中声明过
*/
$username = trim($_POST['username']);

$sql = "select email,passwords from member where username = '".trim($_POST['username'])."'";
$userInfo = $db->FetchRow($sql);

$user_pass = $userInfo['passwords'];
$user_email = $userInfo['email'];

/**
* OK,一些需要的东西我们都有了,看来得进行下步操作了
* 现在让我们产生一个经过md5加密码过的字符串,先不要问为什么,等会再告诉你
*/

$x = md5($username.' '.$passwords);
//现在我们可以发送邮件给用户了。当然,我们还得需要另一个密码重设程序 resetUserPass.php
$String = base64_encode($username.".".$x);

方法一:

<?php
$GoTo="index.php";// 假如这里的目标链接取自数据库就实现了动态转向
header(sprintf("Location: %s", $GoTo));
?>

方法二:

<?php echo "<script>window.location ="$PHP_SELF";</script>";?>


方法三:

<?php echo "<META HTTP-EQUIV="Refresh" CONTENT="0;URL=index.php">";?>

<?php
class Pager{
//生成的页码(事实上不用也行)
var $pageNumber='';

//需要分类的条目总数
var $totalItems=0;
//数据连接相关
var $conn;
var $sql;
//每页显示几个条目
var $itemsPerPage=3;

//总页数
var $totalPageNumber=0;
//当前页码!
var $currentPageNumber=1;

//一个页面显示几个页码
var $length=10;


//需要分页的url
var $url='';
function Pager($conn,$sql,$currentPageNumber,$itemsPerPage,$length,$url){
$this->currentPageNumber=$currentPageNumber;
$this->conn=$conn;
$this->sql=$sql;
$this->itemsPerPage=$itemsPerPage;
$this->length=$length;
$this->url=$url;
$this->url.=(stristr($this->url,'?')!=false)?'&':'?'; //Url里有"?"就加"&"没有就加"?"
$this->getTotalPageNumber();
}
function getTotalItems(){
//for adodb
$rs=$this->conn->Execute($this->sql);
$this->totalItems=$rs->RecordCount();
return $this->totalItems;
}
function getTotalPageNumber(){
$this->totalPageNumber=ceil($this->getTotalItems()/$this->itemsPerPage);
return $this->totalPageNumber;
}

//SQL里 LIMIT start,length 中的起始值
function getLimitStart(){
$start=($this->currentPageNumber-1)*$this->itemsPerPage;
return $start;
}
//SQL里 LIMIT start,length 中的length
function getLimitItems(){
return $this->itemsPerPage;
}
function getRsPerPage(){
$modiSQL=$this->sql." limit ".$this->getLimitStart()." ,".$this->getLimitItems();
//偶用的是adodb的说
$modiRS=$this->conn->Execute($modiSQL);
$arr=$modiRS->GetArray();
return $arr;
}

前言:

目前网络上好多网站的新闻发布系统都采用了动态服务器技术生成静态HTML的做法,这样做的好处是:一是能减轻其服务器的负担,二是因为生成了HTML静态页面,所以其网站被搜索引擎搜索到的机率更大一些。笔者的网站曾经使用PHP这一动态技术来构建新闻发布系统,其原理也就是应用了PHP生成HTML静态页面的技术,相关平台是 Windows XP Sp2 php4.32 mysql,因此,在这里,想简单地谈一下这种做法的思路。这篇文章适合于对PHP MYSQL数据库操作,SQL语句以及网页设计有点基础的朋友,假如您是一个从头开始学的朋友,那么请先打好基础吧!到这里就不用往下看了。假如您都符合上述条件的话,那么恭喜您,请接着往下看。但是,在具体动手构建之前,您还要做好以下几点预备工作。

一、 具备本地调试PHP的功能

在WINDOWS XP操作系统下,笔者建议你可以到网上下载一个PHP MYSQL APHCHE的服务器套装,如华军软件园,去那里搜索一下就可以下载到。下载完后默认安装即可,这样您就具备了在本地测试PHP的功能了,省去了很多手动配置的麻烦,怎么样,简单吧,OK,这仅仅只是第一步。

二、 构思新闻发布系统所具备的功能

首页的新闻发布往往是通过后台更新的,后台的更新无非是由添加、编辑、删除数据等基本的功能所实现的。在这里,你可以使用网页设计软件来构建你的想要的后台界面,其功能的实现当然是要用到PHP喽。这一步建议您先想好新闻发布系统要有的功能。在这里,如何用PHP添加、编辑、删除数据就不再重复,因为重点是如何在这基础上生成静态技术。

三、 PHP生成HTML的技术原理。

哈哈。费话说了那么多,终于到了该讲的地方了。其实,这一原理并不复杂,综合地来讲的话,应该是PHP中一个替换数据语法的应用。OK,讲一个简单范例吧,一步一步地分析!相信聪明的你能看得明白的咯,仔细看好每一步即可,在这里,只是引导大家如何做而已,具体的可以实践一下!

(1)在MYSQL里新建一数据库,命名为 database (可自定义),新建一表,命名为 news(因为是新闻发布嘛,取个好记的名字即可,可自定义),然后建立这几个字段名:
id (自动递增,这是要害,类型:INT)
title (顾名思义,新闻标题,类型可取 TEXT)
content (新闻内容,类型可取 TEXT)
path (HTML文件路径,类型可取 TEXT)

(2)建立 conn.php
这是连接数据库的PHP文件,你可以把连接数据的语句单独放在这一文件里,以后多个需要连接数据库的文件直接引用这个文件即可。

(3)设计添加新闻的表格 add.form 简单的源代码如下:



<form method=”post” action=”add.php”> //提交至 add.php
新闻标题:<input type=”text” name=”title” size=”20”><br>
新闻内容:<textarea name=”content” cols=”10” rows=”25”></textarea><br>
<input type=”submit” name=”提交”>
</form>




<form method=”post” action=”add.php”> //提交至 add.php
新闻标题:<input type=”text” name=”title” size=”20”><br>
新闻内容:<textarea name=”content” cols=”10” rows=”25”></textarea><br>
<input type=”submit” name=”提交”>
</form>


(4)建立一个 HTML 的模板,另存为model.htm,和 add.php可以在同一目录下。
示例源代码:
<html>
<body>
此新闻的标题:{title}
此新闻的内容:{content}
</body>
</html>
{ }大括号内的内容即是要被替换的内容,整个静态模板的设计可以根据自己的思路,但{ }内被替换的内容必须包含在内,如上面的{title},{content};咔咔~简单地说,设计好一个很好看的新闻模板后,把要被替换的如{title},{content}等标记放到需要的地方就可以了撒。

(5)详解 add.php 源码



<?php

PHP--下面这个类的功能则很强大,不但能发html格式的邮件,还可以发附件
<?php
class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i ){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i ){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i )
{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串

[!--infotagslink--]

相关文章

  • iPhone输错密码导致手机锁定怎么办 iPhone输错密码手机锁定解决方法

    如果反复输错屏幕密码,手机就会进入锁定模式,也就是永久停用状态,只能抹掉数据以解除锁定状态和清除锁屏密码...2022-09-14
  • PHP操作MSSQL存储过程修改用户密码

    存储过程在数据库的应用中我们用到的非常的多了,下面我们来看一篇关于PHP操作MSSQL存储过程修改用户密码的例子,具体的如下所示。 mssql2008 存储过程 下面可以直接...2016-11-25
  • js检验密码强度(低中高)附图

    最近一直在做通行证项目,里面的注册模块中输入密码需要显示密码强度(低中高)。今天就把做的效果给大家分享下,代码没有网上搜索的那么复杂,能够满足一般的需求。 html 代码如下: 复制代码 代码如下: <!DOCTYPE HTML> <htm...2014-06-07
  • JavaScript仿支付宝密码输入框

    那么今天我就用JavaScript代码来实现这个效果吧,那么首先介绍一下整个的思路,首先我们先将确定输入密码的位数,我的需求是5位,那么就用一个div标签包住5个input标签...2016-01-02
  • 基于JavaScript实现表单密码的隐藏和显示出来

    为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢?下面通过本文给大家介绍JavaScript实现表单密码的隐藏和显示,需要的朋友参考下...2016-03-03
  • 使用SKIP-GRANT-TABLES 解决 MYSQL ROOT密码丢失

    忘记MySQL(和PHP搭配之最佳组合) ROOT密码是在MySQL(和PHP搭配之最佳组合)使用中很常见的问题,可是有很多朋友并不会重置ROOT密码,那叫苦啊,我有深有感触,特写此文章与大家交流:1、编辑MySQL(和PHP搭配之最佳组合)配置文件...2015-10-21
  • C#判断密码强度的方法

    这篇文章主要介绍了C#判断密码强度的方法,较为详细的分析了C#判断密码强度的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 微信小程序 MD5加密登录密码详解及实例代码

    这篇文章主要介绍了微信小程序 MD5加密登录密码详解及实例代码的相关资料,这里附有实例代码,需要的朋友可以参考下...2017-01-16
  • sqlserver添加sa用户和密码的实现

    这篇文章主要介绍了sqlserver添加sa用户和密码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07
  • vue实现禁止浏览器记住密码功能的示例代码

    这篇文章主要介绍了vue实现禁止浏览器记住密码功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-04
  • Python sqlalchemy时间戳及密码管理实现代码详解

    这篇文章主要介绍了Python sqlalchemy时间戳及密码管理实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-02
  • python批量修改交换机密码的示例

    这篇文章主要介绍了python批量修改交换机密码的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下...2020-09-22
  • Lua流程控制语句if else的使用示例

    今天小编就为大家分享一篇关于Lua流程控制语句if else的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-30
  • 如何修改Xampp服务器上的mysql密码(图解)

    如果我们使用Xampp服务器自带数据库mysql,就必须先修改mysql的密码,下面小编给大家分享如何修改Xampp服务器上的mysql密码,需要的朋友参考下吧...2017-04-26
  • MAC版修改MySQL初始密码的方法

    这篇文章主要介绍了MAC版修改MySQL初始密码的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-02-08
  • vue登录页实现使用cookie记住7天密码功能的方法

    这篇文章主要介绍了vue登录页实现使用cookie记住7天密码功能的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • 可怕!10米开外就能破解安卓系统的手势密码

    英国兰开斯特大学的专家称,安卓系统的图形锁现在前所未有的容易破解。在你给手机解锁时,如果周围有人从侧面拍摄下你解锁的动作,然后用软件分析手指在屏幕上的运动轨迹,几秒钟就能提供几个可能的解锁图形供选择...2017-07-06
  • js实现开启密码大写提示

    本文主要分享了js实现开启密码大写提示的实例,代码简单易懂。需要的朋友一起来看下吧...2017-01-09
  • Centos下 修改mysql密码的方法

    这篇文章主要介绍了Centos下 修改mysql密码的方法,需要的朋友可以参考下...2017-03-14
  • Java核心技术巩固篇之控制流程与大数值及数组详解

    该文章主要补充了一些大家可能没有了解的、重要的、易忘记的知识点,其实并不是用来专门学习 Java 的文章,而是主要用来帮助大家巩固自己的内功的,有需要的朋友跟着小编往下看吧...2021-10-25