ホームページ  >  記事  >  バックエンド開発  >  PHPでメンバ検索機能を実装する簡単な方法

PHPでメンバ検索機能を実装する簡単な方法

墨辰丷
墨辰丷オリジナル
2018-06-01 12:00:143643ブラウズ

この記事では、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

ユーザーがメールアドレスを入力して送信をクリックすると、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を受け取り、次にemailに基づいてデータテーブルt_userに電子メールが存在するかどうかを確認し、存在する場合は、その電子メールを取得します。ユーザーの情報を取得し、sendmail.php と通信します。トークン値は、 のトークンの組み合わせと同じ方法で構築され、URL によって渡されたトークンと現在の時刻と電子メールの送信時刻の差が比較されます。 24 時間を超えると、「リンクの有効期限が切れています!」というメッセージが表示されます。それ以外の場合は、リンクが有効であることを意味し、パスワード リセット ページにリダイレクトされます。最後に、ユーザーは自分で新しいパスワードを設定できます。

概要: 登録済みの電子メール認証とこの記事の電子メールを使用してパスワードを取得する 私たちは、Web サイト開発における電子メール送信の用途とその重要性を理解しています。もちろん、関連する 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 ソケット通信の簡単な実装

php Excelファイルをネイティブにエクスポートする2つの方法の詳細な説明

php 2次元配列の時間ソートの実装

以上がPHPでメンバ検索機能を実装する簡単な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。