用戶登陸與退出功能應用在不少地方,而在有些項目中,咱們須要使用Ajax方式進行登陸,登陸成功後只刷新頁面局部,從而提高了用戶體驗度。本文將使用PHP和jQuery來實現登陸和退出功能。javascript
準備數據庫
php
本例咱們使用Mysql數據庫,建立一張user表,表結構以下:css
1
2
3
4
5
6
7
8
9
|
CREATE
TABLE
`
user
` (
`id`
int
(11)
NOT
NULL
auto_increment,
`username`
varchar
(30)
NOT
NULL
COMMENT
'用戶名'
,
`
password
`
varchar
(32)
NOT
NULL
COMMENT
'密碼'
,
`login_time`
int
(10)
default
NULL
COMMENT
'登陸時間'
,
`login_ip`
varchar
(32)
default
NULL
COMMENT
'登陸IP'
,
`login_counts`
int
(10)
NOT
NULL
default
'0'
COMMENT
'登陸次數'
,
PRIMARY
KEY
(`id`)
) ENGINE=MyISAM
DEFAULT
CHARSET=utf8;
|
而後往user表中插入一條用戶信息數據:html
1
2
|
INSERT
INTO
`
user
` (`id`, `username`, `
password
`, `login_time`, `login_ip`, `login_counts`)
VALUES
(1,
'demo'
,
'fe01ce2a7fbac8fafaed7c982a04e229'
,
''
,
''
, 0);
|
index.php
java
用戶在輸入用戶名和密碼後,提示用戶登陸成功,並顯示相關登陸信息,若是點擊「退出」,則退出到用戶登陸界面。
進入index.php,若是用戶已登陸則顯示登陸信息,若是未登陸則顯示登陸框要求用戶登陸。mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<div id=
"login"
>
<h3>用戶登陸</h3>
<?php
if
(isset(
$_SESSION
[
'user'
])){
?>
<div id=
"result"
>
<p><strong><?php
echo
$_SESSION
[
'user'
];?></strong>,恭喜您登陸成功!</p>
<p>您這是第<span><?php
echo
$_SESSION
[
'login_counts'
];?></span>次登陸本站。</p>
<p>上次登錄本站的時間是:<span><?php
echo
date
(
'Y-m-d H:i:s'
,
$_SESSION
[
'login_time'
]);?>
</span></p><p><a href=
'#'
id=
'logout'
>【退出】</a></p>
</div>
<?php }
else
{?>
<div id=
"login_form"
>
<p><label>用戶名:</label> <input type=
"text"
class
=
"input"
name=
"user"
id=
"user"
/></p>
<p><label>密 碼:</label> <input type=
"password"
class
=
"input"
name=
"pass"
id=
"pass"
/>
</p>
<div
class
=
"sub"
>
<input type=
"submit"
class
=
"btn"
value=
"登 錄"
/>
</div>
</div>
<?php }?>
</div>
|
注意在index.php文件頭應該加上語句:session_start; 同時在head部分引入jquery庫,以及包含global.js,您還能夠爲登陸框寫個漂亮的CSS樣式,固然本例已經略微寫了個簡單的樣式,請查看源碼。jquery
1
2
|
<script type=
"text/javascript"
src=
"js/jquery.js"
></script>
<script type=
"text/javascript"
src=
"js/global.js"
></script>
|
global.js
ajax
global.js文件包括了將要實現的jquery代碼。首先要作的就是讓輸入框得到焦點,像百度和google那樣一打開,鼠標光標就在輸入框內。使用代碼以下:sql
1
2
3
|
$(
function
(){
$(
"#user"
).focus();
});
|
接着要作的就是,當輸入框得到和失去焦點時,分別呈現不一樣的樣式,好比本例中使用不一樣的邊框顏色,代碼以下:數據庫
1
2
3
4
5
6
|
$(
"input:text,textarea,input:password"
).focus(
function
() {
$(
this
).addClass(
"cur_select"
);
});
$(
"input:text,textarea,input:password"
).blur(
function
() {
$(
this
).removeClass(
"cur_select"
);
});
|
用戶登陸:用戶點擊登陸按鈕後,首先要驗證用戶的輸入不能爲空,而後向後臺login.php發送一個Ajax請求。當後臺驗證登陸成功後,返回登陸用戶信息:如用戶登陸次數和上次登陸時間等;若是登陸失敗,則返回登陸失敗信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
$(
".btn"
).live(
'click'
,
function
(){
var
user = $(
"#user"
).val();
var
pass = $(
"#pass"
).val();
if
(user==
""
){
$(
'<div id="msg" />'
).html(
"用戶名不能爲空!"
).appendTo(
'.sub'
).fadeOut(2000);
$(
"#user"
).focus();
return
false
;
}
if
(pass==
""
){
$(
'<div id="msg" />'
).html(
"密碼不能爲空!"
).appendTo(
'.sub'
).fadeOut(2000);
$(
"#pass"
).focus();
return
false
;
}
$.ajax({
type:
"POST"
,
url:
"login.php?action=login"
,
dataType:
"json"
,
data: {
"user"
:user,
"pass"
:pass},
beforeSend:
function
(){
$(
'<div id="msg" />'
).addClass(
"loading"
).html(
"正在登陸..."
).css(
"color"
,
"#999"
)
.appendTo(
'.sub'
);
},
success:
function
(json){
if
(json.success==1){
$(
"#login_form"
).remove();
var
div =
"<div id='result'><p><strong>"
+json.user+
"</strong>,恭喜您登陸成功!</p>
<p>您這是第<span>"
+json.login_counts+
"</span>次登陸本站。</p>
<p>上次登陸本站的時間是:<span>"
+json.login_time+
"</span></p><p>
<a href='#' id='logout'>【退出】</a></p></div>"
;
$(
"#login"
).append(div);
}
else
{
$(
"#msg"
).remove();
$(
'<div id="errmsg" />'
).html(json.msg).css(
"color"
,
"#999"
).appendTo(
'.sub'
)
.fadeOut(2000);
return
false
;
}
}
});
});
|
我在進行Ajax請求時,數據傳輸格式使用的是json,返回的數據也是json數據,使用JS將json數據解析,獲得登陸後的用戶信息,而後經過append追加到#login元素下,完成登陸操做。
用戶退出:當點擊「退出」時,向login.php發送一個Ajax請求,後臺註銷全部Session,頁面從新回到登陸界面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$(
"#logout"
).live(
'click'
,
function
(){
$.post(
"login.php?action=logout"
,
function
(msg){
if
(msg==1){
$(
"#result"
).remove();
var
div =
"<div id='login_form'><p><label>用戶名:</label>
<input type='text' class='input' name='user' id='user' /></p>
<p><label>密 碼:</label> <input type='password' class='input' name='pass'
id='pass' /></p>
<div class='sub'><input type='submit' class='btn' value='登 錄' /></div>
</div>"
;
$(
"#login"
).append(div);
}
});
});
|
login.php
根據前臺提交的請求,登陸時,獲取用戶輸入的用戶名和密碼,並與數據庫中對應的用戶名和密碼進行比對,若是比對成功,則將新的更新該用戶登陸信息,並組裝json數據傳給前臺。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
session_start();
require_once
(
'connect.php'
);
$action
=
$_GET
[
'action'
];
if
(
$action
==
'login'
) {
//登陸
$user
=
stripslashes
(trim(
$_POST
[
'user'
]));
$pass
=
stripslashes
(trim(
$_POST
[
'pass'
]));
if
(emptyempty (
$user
)) {
echo
'用戶名不能爲空'
;
exit
;
}
if
(emptyempty (
$pass
)) {
echo
'密碼不能爲空'
;
exit
;
}
$md5pass
= md5(
$pass
);
//密碼使用md5加密
$query
= mysql_query(
"select * from user where username='$user'"
);
$us
=
is_array
(
$row
= mysql_fetch_array(
$query
));
$ps
=
$us
?
$md5pass
==
$row
[
'password'
] : FALSE;
if
(
$ps
) {
$counts
=
$row
[
'login_counts'
] + 1;
$_SESSION
[
'user'
] =
$row
[
'username'
];
$_SESSION
[
'login_time'
] =
$row
[
'login_time'
];
$_SESSION
[
'login_counts'
] =
$counts
;
$ip
= get_client_ip();
//獲取登陸IP
$logintime
=
mktime
();
$rs
= mysql_query("update user set login_time=
'$logintime'
,login_ip=
'$ip'
,
login_counts=
'$counts'
");
if
(
$rs
) {
$arr
[
'success'
] = 1;
$arr
[
'msg'
] =
'登陸成功!'
;
$arr
[
'user'
] =
$_SESSION
[
'user'
];
$arr
[
'login_time'
] =
date
(
'Y-m-d H:i:s'
,
$_SESSION
[
'login_time'
]);
$arr
[
'login_counts'
] =
$_SESSION
[
'login_counts'
];
}
else
{
$arr
[
'success'
] = 0;
$arr
[
'msg'
] =
'登陸失敗'
;
}
}
else
{
$arr
[
'success'
] = 0;
$arr
[
'msg'
] =
'用戶名或密碼錯誤!'
;
}
echo
json_encode(
$arr
);
//輸出json數據
}
elseif
(
$action
==
'logout'
) {
//退出
unset(
$_SESSION
);
session_destroy();
echo
'1'
;
}
|
當前臺請求退出時,只需註銷session就能夠,並返回1給前臺JS處理。注意上述代碼中get_client_ip()是獲取客戶端IP的函數,限於篇幅未能列出,你們能夠下載源代碼查看。
好了,一套完成的用戶登陸和退出程序完成,不足之處在所不免,歡迎你們批評指正。