Đào Tạo PHP & Mysql

Học PHP Online - PHP Framework - Tự Học PHP

Lập Trình PHP Căn Bản

Bài 7: Khái niệm cơ bản về Cookie và session trong PHP

Cookie và session là hai phương pháp sử dụng để quản lý các phiên làm việc giữa người sử dụng và hệ thống. Việc quản lý phiên làm việc này sẽ giúp bạn tạo ra sự chứng thực hiệu quả bởi việc xác nhận thông tin trước khi truy cập vào một phân vùng cố định. Ngoài ra, việc quản lý tốt phiên làm việc cũng giúp người truy cập cảm thấy dễ dàng sử dụng dịch vụ của trang web cho những lần truy cập sau. Bởi cớ chế quản lý phiên làm việc ghi nhận lại quá trình truy cập của người sử dụng khi họ thăm viếc trang web của bạn lần đầu.


1- Tổng quan về cookie:


Cookie là 1 đoạn dữ liệu được ghi vào đĩa cứng hoặc bộ nhớ của máy người sử dụng. Nó được trình duyệt gởi ngược lên lại server mỗi khi browser tải 1 trang web từ server.
Những thông tin được lưu trữ trong cookie hoàn toàn phụ thuộc vào website trên server. Mỗi website có thể lưu trữ những thông tin khác nhau trong cookie, ví dụ thời điểm lần cuối ta ghé thăm website, đánh dấu ta đã login hay chưa, v.v...
Cookie được tạo ra bởi website và gởi tới browser, do vậy 2 website khác nhau (cho dù cùng host trên 1 server) sẽ có 2 cookie khác nhau gởi tới browser. Ngoài ra, mỗi browser quản lý và lưu trữ cookie theo cách riêng của mình, cho nên 2 browser cùng truy cập vào 1 website sẽ nhận được 2 cookie khác nhau.


a -Thiết lập cookie:


Để thiết lập cookie ta sử dụng cú pháp:

Setcookie("tên cookie","giá trị", thời gian sống)

Tên cookie là tên mà chúng ta đặt cho phiên làm việc.

Giá trị là thông số của tên cookie.

Ví dụ:


Setcookie("username","admin", time() +3600)

Như ví dụ trên ta thấy với tên là username và giá trị là admin, có thời gian sống là 1 giờ tính từ thời điểm thiết lập.

Chú ý: Kịch bản cookie phải đặt trên mọi giá trị trả về bao gồm thẻ HTML và lệnh echo.

Kịch bản cookie phải đặt trên mọi giá trị trả về bao gồm thẻ HTML và lệnh echo.

b - Sử dụng cookie:

Để sử dụng lại cookie vừa thiết lập, chúng ta sử dụng cú pháp:

Cú pháp: $_COOKIE["tên cookies"]

Tên cookie là tên mà chúng ta thiết lập phía trên.

Ví dụ:


Tạo trang cookie.php với nội dung sau:


<?php

setcookie("name","Kenny Huy",time() + 3600);

?>

<html>

<head>

<title>Test page 1</title></head>

<body>

<b><a href=cookie2.php>Click here</a></b>

</body>

</html>


Tiếp tục tạo trang cookie2.php với nội dung sau:


<html>

<head><title>Result Page</title></head>

<body>

<?php

echo "Ten cua ban la <b>".$_COOKIE['name']."</b>";

?>

</body>

</html>


c- Hủy Cookie:


Để hủy 1 cookie đã được tạo ta có thể dùng 1 trong 2 cách sau:

+ Cú pháp: setcookie("Tên cookie")

Gọi hàm setcookie với chỉ duy nhất tên cookie mà thôi

+ Dùng thời gian hết hạn cookie là thời điểm trong quá khứ.

Ví dụ: setcookie("name","Kenny Huy",time()-3600);

Ví dụ:


Tiếp tục tạo trang cookie3.php với nội dung sau:


<?php

setcookie("name","Kenny Huy",time()-360);

?>

<html>

<head>

<title>Test page 1</title></head>

<body>

<b><a href=cookie2.php>Click here</a></b>

</body>

</html>


2- Tổng quan về session:


Một cách khác quản lý người sử dụng là session. Session được hiểu là khoảng thời gian người sử dụng giao tiếp với 1 ứng dụng. Một session được bắt đầu khi người sử dụng truy cập vào ứng dụng lần đầu tiên, và kết thúc khi người sử dụng thoát khỏi ứng dụng. Mỗi session sẽ có được cấp một định danh (ID) khác nhau và nội dung được lưu trong thư mục thiết lập trong file php.ini (tham số session.save_path).

a- Thiết lập session:

Để thiết lập 1 session ta sử dụng cú pháp: session_start()

Đoạn code này phải được nằm trên các kịch bản HTML. Hoặc những lệnh echo, printf.

Để thiết lập 1 giá trị session, ngoài việc cho phép bắt đầu thực thi session. Chúng ta còn phải đăng ký 1 giá trị session. Để tiện cho việc gán giá trị cho session đó.

Ta có cú pháp sau: session_register("Name")


Ví dụ:


<?php

Session_start();

Session_register("username");

?>


b- Sử dụng giá trị của session:


Giống với cookie. Để sử dụng giá trị của session ta sử dụng mã lệnh sau:

Cú pháp: $_SESSION["name"]

$_SESSION["name"]

Với Name là tên mà chúng ta sử dụng hàm session_register("name") để khai báo.


Ví dụ:


Tạo trang session.php với nội dung sau:


<?php

session_start();

session_register("name");

$_SESSION["name"] = "Kenny Huy";

?>

<html>

<head>

<title>Test page 1</title></head>

<body>

<b><a href=session2.php>Click here</a></b>

</body>

</html>


Tạo trang session2.php với nội dung sau:


<?

session_start();

?>

<html>

<head><title>Result Page</title></head>

<body>

<?php

echo "Ten cua ban la <b>".$_SESSION["name"]."</b>";

?>

</body>

</html>


c- Hủy bỏ session:


Để hủy bỏ giá trị của session ta có những cách sau:

session_destroy() // Cho phép hủy bỏ toàn bộ giá trị của session

session_unset()// Cho phép hủy bỏ session .

Ví dụ:


Tạo trang session3.php với nội dung sau:


<?php

session_start();

session_destroy();

?>

<html>

<head>

<title>Test page 1</title></head>

<body>

<b><a href=session2.php>Click here</a></b>

</body>

</html>


3- Tổng Kết:


Sau bài học này chúng ta đã nắm được cách điều khiển phiên làm việc giữa cookie và session. Sử dụng chúng trong từng trường hợp cụ thể. Từ đó có thể áp dụng để viết những ứng dụng nhỏ như kiểm soát người đăng nhập, làm giỏ hàng online,…..


Bài tập áp dụng:


Xây dựng website sử dụng tính năng session thỏa mãn những yêu cầu sau:

1- Tạo trang đăng nhập với username/password là : admin/vietchuyen. Nếu user đăng nhập thành công thì sẽ xuất ra dòng welcome, admin.

2- Tạo trang đăng xuất thoát khỏi phần quản trị


(Bùi Quốc Huy)
66264
Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé.

Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này

Phản hồi của bạn Tiếng Anh Telex VNI VIQR





doan khanh (11:50 21/04/2010)

co ban la rat chi la de nhung cung that chi la kho

Reply

lê phương (13:03 14/05/2010)

mình xem xong ko hiểu lắm,bạn có thể viết code cho 2 bài tập trên để mọi người tham khảo.

Reply

Pham Thai (14:07 28/05/2010)

Tạo trang login.php với nội dung sau

<?php
session_start();
session_register("name");
$_SESSION["name"] = "Pham Thai";
?>

<html>
<body>
<form action="CheckLogin.php" method="post">
Username : <input type="text" name="username" size="15"><br>
Password : <input type="text" name="password" size="15"><br>
<input type="submit" value="Login">
</form>
</body>
</html>

và trang CheckLogin.php với nội dung sau :

<?
session_start();
?>

<?php
$username = $_POST['username'];
$password = $_POST['password'];

if($username == "admin"

Reply

le cong bach (04:12 29/05/2010)

bai viet nay rat hay nhung em muon cac anh cac chi viet cu the ve mot ung dung co duoc khong

Reply

newbie (14:33 11/06/2010)

Ạc . Admin ơi làm ơn sau mỗi bài cho đáp án của bài tập !

Reply

vodainam (18:50 13/06/2010)

session_start();
create_image();
exit();

function create_image()
{

$md5_hash = md5(rand(0,999));
$security_code = substr($md5_hash, 15, 5);
$_SESSION["security_code"] = $security_code;
$width = 100;
$height = 30;
$image = ImageCreate($width, $height);
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
ImageFill($image, 0, 0, $black);
ImageString($image, 5, 30, 6, $security_code, $white);
header("Content-Type: image/jpeg");
ImageJpeg($image);
ImageDestroy($image);
}
?>
Anh Huy cho em hỏi cái dòng creat_image(); (dưới sesion_statr();) mục đích để làm gì zậy anh? Thank anh!

Reply

myfriend (02:28 13/07/2010)

mình thấy bài làm của bạn Phạm Thai đó là dùng post đấy chứ nhỉ?thế dùng session ở đây làm gì vậy bạn.Mình cũng chưa hiểu nên nhờ mọi người giúp đỡ!

Reply

pro (10:30 31/07/2010)

admin ơi!
làm giúp mình các bt cuối mỗi phần đi
chứ nói sơ sơ thế này khó hiểu quá

Reply

Đinh Hoàng Kha (11:44 01/08/2010)

Bài 1 thì quá dễ rồi, em xin đưa ra kết quả bài 2 của em hoàn toàn bằng session.
Tạo 3 file.
File dangnhap.html có nội dung sau:
<html>
<form action="dangnhap2.php" method=POST>
Tên đăng nhập:<input type=text name="id" size=20>
</br>Mật khẩu:<input type=password name="pass" size=20>
<input type=Submit name=submit value="Đăng nhập">
</html>

File dangnhap2.php có nội dung sau:

<?
if ($_POST['id']=="admin"

Reply

hiepvn (11:49 05/08/2010)

Bai 1:
Tạo trang đăng nhập login.php

<?php
session_start();
session_register("name");
session_register("pass");
?>

<html>
<head>
<body>
<form action="checkLogin.php" method="post">
Username: <input type="text" name="name" size="15" /></br>
Password: <input type="text" size="15" name="pass" /></br>
</form>
</body>
</head>
</html>

Tiếp sau đó, ta tạo trang checkLogin.php kiểm tra user và pass:

<?php
session_start();
if($_SESSION['name'])=="admin"

Reply

hiepvn (11:59 05/08/2010)

Bai 2 cũng tương tự.

để tạo trang đăng xuất, mình tạo file logout.php như sau:

ở file checkLogin.php ta thêm button logout ở trong form
<a href="logout.php"><input type="text" name="logout" /></a>
và thêm session_register("logout"); vào đầu file giống như session_register("name");...

Ở file logout.php ta có:
<?php
session_start();
if ($_SESSION["logout"]) {
session_unset();
echo "<a href="login.php" >Click here to back login.php</a>";
}
?>



Mình còn gà nếu có gì sai sót mong admin và các bạn bỏ qua cho :D thanks!

Reply

Quach Phu Thanh (16:51 09/08/2010)

ban nao lam duoc bai tap ap dung cuoi moi phan thi post len cho a/e tham khao nha.Thank

Reply

Learning PHP (23:20 28/08/2010)

Có thể không cần khai báo hàm session_register("Name");
Mà sử dụng gán trực tiếp là $_SESSION['Name'] = $value;
được không ?
Liệu làm theo cách trên có ảnh hưởng gì không ?

Reply

trungthan (12:06 01/09/2010)

hjc hjc anh thai noi ro hon di trang checklogin y

Reply

longnhat (22:55 20/11/2010)

thanks .kiến thức thật bổ ích

Reply

linh (15:35 19/12/2010)

session_register("name"); mình báo lỗi là sao vậy nhỉ?

Reply

Minh Tân (08:27 27/12/2010)

mọi người ơi cho mình hỏi: ở đây mình gán giá trị trực tiếp cho session vậy có cách nào mình lấy giá trị động là tên của người đăng nhập gán vào session ko?

Reply

Trần Văn Chiến (08:56 27/01/2011)

GIúp em với. EM gặp lỗi sau. em tạo 2 file: file view.php để nhập dữ liệu do ng dùng gửi, file check.php để echo dữ liệu ra, em làm ví dụ này để hiểu về session thui, nhưng toàn gặp lỗi
" headers already sent ". Nhân tiện các anh giúp em giải quyết dứt điểm cách fix lỗi "headers already sent " này với ạ, em rất hay gặp lỗi này và đã tìm trên mạng nhưng làm theo vẫn ko đc. code 2 file của em như sau :
1. file view.php :
<html>
<head>
<title>Session Example </title>
</head>
<body>
<form name="login" action="check_login.php" method="post">
<table>
<tr>
<td>Username : </td>
<td><input type="text" name="username" size="30"> </td>
</tr>
<tr>
<td>Password :</td>
<td><Input type="password" name="password" size="30"></td>
</tr>
</table>
<input type="submit" name="submit" value="Login">
<input type="reset" name="reset" value="Reset">
</form>
</body>
</html>

2. file check.php :

<?php
session_start();
session_register("username");
session_register("password");
$_SESSION["username"] = $_POST['username'];
$_SESSION["password"] = $_POST['password'];
echo "username : ".$_SESSION['username']."<br/>";
echo "Password : ".$_SESSION['password'];
?>

Em đã làm theo cách trên phpvn.org để fix lỗi 'headers already sent" là thêm 2 hàm ob_start(); và ob_end_flush(); nhưng đều ko đc. Thanks a

Reply

Phạm Văn Quyết (23:21 21/04/2011)

trang web giúp ích cho mình rất nhiều, cảm ơn tất cảc mọi người làm lên trang web này nhá!

Reply

shirokenshin (16:35 08/05/2011)

hic,làm dc mỗi câu 1,có ai làm dc câu 2 ko

Reply

khong ten (10:25 12/05/2011)

khong dc ro rang cho lam minh ko hieu no dung de la gi nua

Reply

Pham Van Hiep (16:23 12/05/2011)

chang can khai bao ham session van cho ra ket wua ma.

Reply

alone90 (10:40 25/06/2011)

loguot.php amin xem ho em cai nhe hii: em con ga!

<?php
session_start();
$_SESSION["name"]=$_POST["name"];
session_destroy();
?>

<html>

<head>

<title>Test page 1</title></head>

<body>
<a href="trangchu.php">click here</a>
</body>

</html>

Reply

le truong (13:19 29/06/2011)

anh em ơi cho mình hỏi cai lỗi này sửa thế nào :
Deprecated: Function session_register() is deprecated in C:xampphtdocsxamppai7dangnhaplogin.php on line 4

Deprecated: Function session_register() is deprecated in C:xampphtdocsxamppai7dangnhaplogin.php on line 6

code :
<?php
session_start();
$_SESSION["name"] = "Levantruong";
session_register("name");
$_SESSION["logout"] = "lasdst";
session_register("logout");
?>
<html>
<body>
<form action="CheckLogin.php" method="post">
<table align="center" border="1">
<tr>
<td>Username :
</td>
<td><input type="text" name="username" size="15">
</td>
</tr>
<tr>
<td>Password :
</td>
<td><input type=password name="password" size="15">
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="reset" name="reset" value="Reset">
<input type="submit" value="Login">
</td>
</tr>
</table>
</form>
</body>
</html>

Reply

vuvi (23:02 09/12/2011)

Bạn bỏ 2 dòng 4 và 6 là hết ah. vẫn chạy bt
Nó ko hiểu session_register();

misa (22:19 17/07/2011)

Bạn le truong oi, bạn thử sửa code như thế nầy thì nó có báo lỗi ko nhé.
<?php
session_start();
session_register("name");
$_SESSION["name"] = "Levantruong";
session_register("logout");
$_SESSION["logout"] = "lasdst";
?>

Reply

huycuong (16:59 24/07/2011)

sao các comment nào dài minh ko nhìn thấy hết là sao?

Reply

Hoang Hung (09:21 27/07/2011)

Các bạn giúp mình sửa lỗi này với: "Cannot modify header information - headers already sent by (output started at C:AppServwwwSessionAndCokkieindex.php:2) in C:AppServwwwSessionAndCokkieindex.php on line 3"

KHiminhf tạo một Cookies dạng:setcookie("q", "anhhung",time() 3600);
thì khi chạy lên bị lỗi như trên.
Mình viết bằng công cụ NetBean.
Mong các chỉ giúp

Reply

Phạm Duy Thanh (15:37 12/08/2011)

Theo mình thì các bạn có thể hiểu nôm na thế này:
- Cookie và session về cơ bản là giống nhau NHƯNG cookie được lưu trên client (PC của người dùng) còn session được lưu trên Server (máy chủ chạy web).
- Thứ 2 vì sao người ta sử dụng session mà không sử dụng POST. Hai cách này đều có thể lưu giá trị của một biến từ trang này sang trang khác ví dụ tên user đã đăng nhập. Nhưng POST thì phải dùng input hidden để lưu -> trang nào cũng phải create hidden, còn session nó đã được lưu vào một biến cụ thể nào đó và chỉ cần khởi tạo lần đầu tiên, thì nó sẽ luôn luôn tồn tại ở tất cả các trang trong web bạn echo hoặc print bất kỳ ở vị trí nào trong bất cứ trang nào đều lấy được giá trị đó, nó chỉ được hủy khi gặp lệnh hủy session -> rất tiện dụng -> hay thường dùng để lưu giữ trạng thái đăng nhập, trạng thái mua hàng...
- Cookie cũng giữ được trạng thái như session nhưng khác ở chỗ bạn tắt trang web đó đi thì session sẽ bị hủy-> đăng nhập lại nhưng cookie thì ko (cookie tồn tại trên máy người sử dụng)-> bạn có thể dùng cookie đó để đăng nhập tự động lại nếu web bạn vào cho phép chức năng dùng cookie để đăng nhập mà bạn ko phải đánh user và pass để đăng nhập

Reply

khang (13:47 30/08/2011)

thanks

Reply

Nguyễn Sinh Kiêm (17:14 23/09/2011)

Mình đang quản trị một website mà mình ko đăng nhập vào admin để đưa tin được. cứ mỗi lần đang nhập vào thì bị out ra có ai biết chỉ với. nếu biết rõ hơn chỉ dùm cách kiểm tra biến Regiter_Global nó đang on hay off ?
Mình xin cảm ơn

Reply

ngoc nhu (21:27 27/09/2011)

cho mình hỏi là trong asp.net mình khởi tạo session trong file global.asax, còn trong php, giả sử có nhìu trang thì mình nên khởi tạo session này ở đâu.
Vì nếu khởi tạo session ở 1 trang, ví dụ là trang1.php chắng hạn, thì chả lẽ khi mình load lại trang1.php đó thì nó cũng khởi tạo lại giá trị cho biến session đó rồi, như vậy là mất giá trị đã lưu trước đó trong session sao???? Thanks

Reply

Hường (16:33 06/10/2011)

Mình bị lỗi này, ai biết chỉ giúp mình với!!!

Deprecated: Function session_register() is deprecated in C:xampphtdocsmyWebaitapcheck.php on line 3

Deprecated: Function session_register() is deprecated in C:xampphtdocsmyWebaitapcheck.php on line 4

code:
session_start();
session_register("username");
session_register("pass");
$_SESSION['username']=name;
$_SESSION['pass']=1234;

Reply

nguyễn đăng mạnh (22:42 09/10/2011)

file 1 session.php
<?php
setcookie("name","Manhthan",time() 3600);
session_start();
$_SESSION['username']="manhthan91";
$_SESSION['password']="cTmlnnbcnn2";
$u="";
$p="";
if (isset($_POST['submit'])){
if($_POST['username']==null){
echo "Bạn vui lòng nhập tên đăng nhập !<br/>";
}else{
$u=$_POST['username'];
}if($_POST['password']==null){
echo "Bạn vui lòng nhập mật khẩu<br/>";
}else{
$p=$_POST['password'];
}if ($u==$_SESSION['username']

Reply

ha manh tien (23:41 15/10/2011)

minh co y dinh la hoc o tren mang nhung hoc phi ho dua ra dat qua , neu nhu la 500k thi ok minh se hoc.sinh vien bon minh thi lam gi ma co tien nhieu .kinh moi ban admin giam gia de anh em dc hoc a.thanks

Reply

Nguyen Thi Thu Hao (09:47 25/11/2011)

em muon tham gia vao dien dan de hoc hoi them.

Reply

Ray Nguyen (13:26 26/11/2011)

Đã test xong, fix lại bài của bạn "Tran Van Chien" mong các bạn tham khảm và đóng góp ý kiến
//code trong file "trangdangnhap.php"
<html>
<head>
<center><font size = 30 color = red>Please Login</font></center>
</head>
<body>
<form name="login" action="trangxuly.php" method="post">
<table>
<tr>
<td>Username : </td>
<td><input type="text" name="username" size="30"> </td>
</tr>
<tr>
<td>Password :</td>
<td><Input type="password" name="password" size="30"></td>
</tr>
</table>
<input type="submit" name="submit" value="Login">
<input type="reset" name="reset" value="Reset">
</form>
</body>
</html>

//code trong file "trangxuly.php"
<?php
session_start();
session_register("username");
session_register("password");
$_SESSION["username"] = $_POST['username'];
$_SESSION["password"] = $_POST['password'];
if (($_SESSION["username"] == "Ray") && ($_SESSION["password"] == "123456"))
{
echo "<b><font size = 20 color = 'blue'>Welcome Ray nguyen</font></b>"."<br>";
echo "<a href = trangdangnhap.php> Back </a>"."<br>";
echo "username cua ban la : ".$_SESSION['username']."<br/>";
echo "Password cua ban la : ".$_SESSION['password'];
}
else
{
echo "<font color = 'red'> Username or Password is wrong</font>"."<br>";
echo "username: ".$_SESSION['username']." la sai"."<br/>";
echo "Password: ".$_SESSION['password']."la sai";
}
?>

//Tks bạn Chiến đã post bài làm lên để mọi người tham khảo. Thân ^^

Reply

Hồ Quang Thạnh (14:26 12/12/2011)

<?php
session_start();
session_register("username");
session_register("password");
$_SESSION["username"]=$_POST["username"];
$_SESSION["password"]=$_POST["password"];
?>
<html>
<head>
<title> Login <title>
</head>
<body>
<?php
if(!$_POST['login'])
{
?>
<b>Ban dang dang nhap vao trang quan tri</b>
<form action="<?=$_SERVER[PHP_SELF]?>" method="post">
<br> Username <input type="text" name="username">
<br> Password <input type="password" name="password">
<br> <input type="submit" name="login" Value="Login">
</form>
<?php
}
else{
$user=$_SESSION["username"];
$pass=$_SESSION["password"];
if($user=="admin" && $pass=="vietchuyen"){
$check=true;
echo "<font color=blue size=12>"."Welcome $user"."<font>";
}
else{
echo "Dang nhap khong thanh cong. Vui long kiem tra lai username va password !!!";
}
}
?>
<?php
if($check && !$_POST["logout"])
{
?>
<form action="<?=$_SERVER[PHP_SELF]?>" method="post">
<input type="submit" name="logout" value="logout">
</form>
<?php
}
else{
session_start();
session_destroy();
}
?>
</body>
</html>

Reply

Karmahuynh (19:53 31/12/2011)

Hi Kenny
Cam on bai viet cua anh.

session_destroy() // Cho phép hủy bỏ toàn bộ giá trị của session
session_unset()// Cho phép hủy bỏ session .

Huỷ toàn bộ giá trị của session khác với huỷ bỏ session như thế nào vậy anh.
Lúc nào minh nên sử dụng destroy, hay unset?

Và, lúc nào mình sử dung session, lúc nào nên xài cookie trong thuc te?

Reply

PHP MYSQL Online - Hoc PHP - Dao Tao PHP - Học PHP - CakePHP Framework - Lap Trinh PHP Can Ban - Lap Trinh PHP Nang Cao - PHP Framework - Tài liệu,Thư viện
Copyright 2007-2010 © QHOnline.Info | Powered By QHOnline Version 2.0 - XHTML Valid