PDA

View Full Version : Sử dụng session trong PHP



anhsam
08-28-2005, 08:45 PM
Trong hầu hết các ứng dụng mạng khi lập trình với php, việc sử dụng session là đi?u gần như bắt buộc đối với các lập trình viên. Bởi nếu không có session thì chúng ta ko thể truy cập được các biến đã có dữ liệu ở trang khác, nếu trong cùng thư mục, đi?u đó không có gì khó bởi chúng ta có thể sử dụng submit form để lấy dữ liệu. Thế nhưng khi sang thư mục khác, chúng ta chẳng có cách nào lấy lại dữ liệu của biến đó đang lưu giữ ngoài session và cookie. Tuy nhiên sử dụng cookie đôi khi có lúc bất tiện, đó là mỗi lần sử dụng biến, ta lại phải đ?c cookie ra, thêm nữa, nhi?u máy client không cho phép viết cookie xuống máy. (Thế nhưng trong việc lập trình với shopping, đôi khi cookie là đi?u đầu tiên ch?n lựa của tôi, bởi như vậy sẽ tăng tốc độ của trang khi ngư?i dùng truy cập trở lại :) Ngoại trừ việc check credit card).
Tôi lấy ví dụ khi viết đăng nhập vào các trang, khi đăng nhập thành công, ngay vị trí đăng nhập được thay thế bằng một đoạn text khác, một câu chào mừng chẳng hạn. Ví dụ:

Trang đăng nhập lúc đầu:

H? tên : Hộp text box ở đây
Mật khẩu: Hộp textbox ở đây

?ăng nhập


Sau khi đăng nhập xong, lúc này sẽ là một đoạn text thế vào, chẳng hạn:

Xin chào Tên user, chúc một buổi tối vui vẻ ...

Thoát

Bây gi? ta sẽ viết trang đăng nhập này vào trong một trang đăng nhập riêng, sau đó sẽ include vào các trang, tôi g?i trang này là login.php

Trước tiên tạo giao diện trước đã

<?php
//Kiểm tra xem đã có session chưa, nếu chưa có thì hiển thị đoạn html sau
if(!$ses_test[UserName]){
?>
<form name = "frmLogin" action = "<?=$PHP_SELF?>" method = "post">
<table>
<tr>
<td>Tên đăng nhập: </td>
<td><input type = "textbox" value = "" name = "txtUserName"></td>
</tr>
<tr>
<td>Mật khẩu: </td>
<td>><input type = "textbox" value = "" name = "txtPassword"></td>
</tr>
<tr>
<td colspan = "2">&nbsp</td>
</tr>
<tr>
<td colspan = "2"><a href = "javascript:document.frmLogin.sumit();"><strong>?ăng nhập</strong></a></td>
</tr>
</table>
</form>

Và ngay ở dưới đó, ta tạo một bảng khác để có thể viết ra một dòng chào h?i

<?php
//Nếu có rồi thì hiển thị đoạn sau
}else{
?>
<table>
<tr>
<td>Xin chào <?=$ses_testp[UserName]?>, chúc bạn ... </td>
</tr>
<tr>
<form name = "frmLogout" method = "post" style = "display:inline" action = "<?=$PHP_SELF?>">
<input type = "hidden" name = "log_out" value = "out">
</form>
<td><a href = "javascript:document.frmLogout.sumit();">Thoát</a></td>
</tr>
</table>
<?
}
?>

Ở ngay đầu trang của file login.php, ta viết đoạn mã để kiểm tra

<?php
if($HTTP_POST_VARS[txtUserName]){
//L?c trong cơ sở dữ liệu, giả sử đã có kết nối đến cơ sở dữ liệu
$sql = "select UserName, Password from test_Member where UserName = '$txtUserName' and Password = '$txtPassword'";
$rs = mysql_querry($sql) or die("Không thực hiện được truy vấn");

$row = mysql_fetch_array($sql);

$num_rows = mysql_num_rows($rs);

//Kiểm tra xem có tồn tại user với pass có tồn tại hoặc trùng khớp ko ?
if($num_rows==0){
echo "<script language = 'javascript'>
alert('Tên đăng nhập và mật khẩu không đúng. Kiểm tra lại');
window.history.back(-1);
</script>
exit();
}else{//Nếu đúng
//Nếu có session trước đó thì huỷ b? đi
//Ở đây tôi chỉ dùng môt biến session
session_start();
if($ses_test){
unset($ses_test[user_name]);
}
session_register("ses_test");
$ses_test[user_name]=$row[UserName];
}
}
?>

Ngay ở đầu trang, ta kiểm tra nếu có biến $txtUserName gửi lên từ form thì mới thực hiện đoạn php trên, sau đó, trong phần dưới ta kiểm tra

if(!$ses_test[UserName])

Nếu chưa có thì hiển thị form nhập, còn nếu có rồi thì hiển thị đoạn chào h?i.

Còn gi? đến đoạn log out

Viết sau ngay đoạn kiểm tra login

<?php
//Log out
if($HTTP_POST_VARS[log_out]=="out"){
session_start();
unset($ses_test[user_name])
session_unregister("ses_test");
session_destroy();
}

Ở đây tôi sử dụng <?=$PHP_SELF?> để có thể login và logout ngay trong trang luôn.

Hy v?ng ví dụ này sẽ giúp cho các bạn mới làm quen với PHP sẽ ko cảm thấy session là một cái gì đó rất khó sử dụng :)