>  기사  >  백엔드 개발  >  회원 검색 기능을 구현하는 PHP 간단한 방법

회원 검색 기능을 구현하는 PHP 간단한 방법

墨辰丷
墨辰丷원래의
2018-06-01 12:00:143667검색

이 글은 주로 PHP에서 회원 비밀번호 검색 기능을 간단하게 구현하는 방법을 소개합니다. 관심 있는 친구들이 참고하시면 도움이 될 것입니다.

아이디어 설정

1. 사용자는 등록 시 이메일을 제공해야 합니다. 목적은 이 이메일을 사용하여 비밀번호를 검색하는 것입니다.

2. 사용자가 비밀번호나 사용자 이름을 잊어버린 경우 로그인 페이지에서 "비밀번호 검색" 하이퍼링크를 클릭하고 양식을 열고 등록에 사용한 이메일 주소를 입력한 후 제출하세요.

3. 시스템은 사서함을 통해 데이터베이스에서 사용자 정보를 찾아 사용자의 비밀번호를 임시 비밀번호(예: 12345678)로 업데이트합니다.

4. 시스템은 Jmail 기능을 사용하여 사용자의 정보를 사용자의 사서함으로 보냅니다(콘텐츠에는 사용자 이름, 임시 비밀번호 및 적시에 임시 비밀번호를 변경하라는 메시지가 포함됩니다).

5. 사용자는 임시 비밀번호로 로그인할 수 있습니다.

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

사용자가 이메일 주소를 입력하고 submit을 클릭하면 jQuery는 먼저 이메일 형식이 맞는지 검증하고, 맞다면, Ajax 요청을 백그라운드 sendmail.php로 보내고, sendmail.php는 사서함이 있는지 확인하고 이메일을 보내는 역할을 담당하며 해당 처리 결과를 첫 페이지에 반환합니다. jQuery 코드를 참조하세요.

코드. 는 다음과 같습니다

$(function(){ 
$("#sub_btn").click(function(){ 
var email = $("#email").val(); 
var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/; //匹配Email 
if(email==&#39;&#39; || !preg.test(email)){ 
$("#chkmsg").html("请填写正确的邮箱!"); 
}else{ 
$("#sub_btn").attr("disabled","disabled").val(&#39;提交中..&#39;).css("cursor","default"); 
$.post("sendmail.php",{mail:email},function(msg){ 
if(msg=="noreg"){ 
$("#chkmsg").html("该邮箱尚未注册!"); 
$("#sub_btn").removeAttr("disabled").val(&#39;提 交&#39;).css("cursor","pointer"); 
}else{ 
$(".demo").html("<h3>"+msg+"</h3>"); 
} 
}); 
} 
}); 
})

위에 사용된 jQuery 코드는 매우 편리하고 간결합니다. 프론트 엔드 인터랙티브 작업이 완료되었습니다. 특정 jQuery 기반이 있으면 위 코드가 한눈에 명확하고 필요하지 않습니다. 많은 설명.

물론, 페이지에서 jQuery 라이브러리 파일을 로드하는 것을 잊지 마세요. 어떤 학생들은 왜 인터넷에서 다운로드한 데모를 사용할 수 없는지 묻는 경우가 80%는 jquery의 로딩 경로 때문입니다. 또는 다른 파일이 잘못되어 필요한 파일이 로드되지 않습니다.

PHP

sendmail.php는 시스템 사용자 테이블에 이메일이 존재하는지 확인해야 합니다. 그렇다면 사용자 정보를 읽고 md5를 사용하여 사용자 ID, 사용자 이름 및 비밀번호를 암호화하여 특수 문자열을 생성합니다. 비밀번호 확인 코드를 검색한 후 URL을 구성하세요. 동시에 URL 링크의 적시성을 제어하기 위해 사용자가 비밀번호 검색 작업을 제출할 때 작업 시간을 기록하고 마지막으로 이메일 전송 클래스를 호출하여 이메일을 사용자의 사서함으로 보냅니다. class smtp.class.php가 패키징되었으니 다운로드해 주세요.

코드는 다음과 같습니다

include_once("connect.php");//连接数据库 

$email = stripslashes(trim($_POST[&#39;mail&#39;])); 

$sql = "select id,username,password from `t_user` where `email`=&#39;$email&#39;"; 
$query = mysql_query($sql); 
$num = mysql_num_rows($query); 
if($num==0){//该邮箱尚未注册! 
echo &#39;noreg&#39;; 
exit; 
}else{ 
$row = mysql_fetch_array($query); 
$getpasstime = time(); 
$uid = $row[&#39;id&#39;]; 
$token = md5($uid.$row[&#39;username&#39;].$row[&#39;password&#39;]);//组合验证码 
$url = "/demo/resetpass/reset.php?email=".$email." 
&token=".$token;//构造URL 
$time = date(&#39;Y-m-d H:i&#39;); 
$result = sendmail($time,$email,$url); 
if($result==1){//邮件发送成功 
$msg = &#39;系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!&#39;; 
//更新数据发送时间 
mysql_query("update `t_user` set `getpasstime`=&#39;$getpasstime&#39; where id=&#39;$uid &#39;"); 
}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.jb51.net - 找回密码"; 
$emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的链接重置密码 
(按钮24小时内有效)。<br/><a href=&#39;".$url."&#39;target=&#39;_blank&#39;>".$url."</a>"; 
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 

return $rs; 
}

이제 메일함은 helloweba로부터 비밀번호 검색 이메일을 받게 됩니다. 이메일 내용에 URL 링크가 있습니다. 이메일을 확인하세요.

코드는 다음과 같습니다

include_once("connect.php");//连接数据库 

$token = stripslashes(trim($_GET[&#39;token&#39;])); 
$email = stripslashes(trim($_GET[&#39;email&#39;])); 
$sql = "select * from `t_user` where email=&#39;$email&#39;"; 

$query = mysql_query($sql); 
$row = mysql_fetch_array($query); 
if($row){ 
$mt = md5($row[&#39;id&#39;].$row[&#39;username&#39;].$row[&#39;password&#39;]); 
if($mt==$token){ 
if(time()-$row[&#39;getpasstime&#39;]>24*60*60){ 
$msg = &#39;该链接已过期!&#39;; 
}else{ 
//重置密码... 
$msg = &#39;请重新设置密码,显示重置密码表单,<br/>这里只是演示,略过。&#39;; 
} 
}else{ 
$msg = &#39;无效的链接&#39;; 
} 
}else{ 
$msg = &#39;错误的链接!&#39;; 
} 
echo $msg;

Reset.php는 먼저 email 및 token 매개변수를 승인한 다음 이메일을 기반으로 데이터 테이블 t_user에 이메일이 존재하는지 확인합니다. 의 토큰 조합과 동일하게 토큰 값을 구성한 후, 현재 시간과 이메일이 전송된 시간의 차이가 있는지 비교합니다. 24시간이 지나면 "링크가 만료되었습니다!"라는 메시지가 표시됩니다. 그렇지 않으면 링크가 유효하며 비밀번호 재설정 페이지로 리디렉션된다는 의미입니다. 마지막으로 사용자가 직접 새 비밀번호를 설정할 수 있습니다.

요약: 등록된 이메일 확인과 이 기사의 이메일을 통해 비밀번호를 검색하세요. 우리는 웹사이트 개발에서 이메일 전송의 응용과 그 중요성을 알고 있습니다. 물론 관련 SMS 인터페이스가 필요한 SMS 확인 응용 프로그램도 현재 인기가 있습니다. . 연결하면 됩니다.

마지막으로 데이터 테이블 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 클래스 파일

코드는 다음과 같습니다

<?php

class Smtp{

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */
var $sock;

/* Constractor */

function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
$this->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.jb51.net): $from<" . $from . ">rn";

$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: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">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 <" . $rcpt_to . ">n");
} else {
$this->log_write("Error: Cannot send email to <" . $rcpt_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:<" . $from . ">")) {
return $this->smtp_error("sending MAIL FROM command");
}

if (!$this->smtp_putcmd("RCPT", "TO:<" . $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 <CR><LF>.<CR><LF> [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 클래스는 이 사이트에서 찾아보실 수 있습니다

요약: 위 내용은 이 글의 전체 내용입니다. 모든 분들께 도움이 되길 바랍니다. 공부하다.

관련 권장 사항:

php 소켓 통신의 간단한 구현

phpExcel 파일을 기본적으로 내보내는 두 가지 방법에 대한 자세한 설명

php 2차원 배열 시간 정렬 구현

위 내용은 회원 검색 기능을 구현하는 PHP 간단한 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.