Các kiểu Menu Item trong Joomla! 1.5.x

Menu Item là những mục Menu cho phép người sử dụng truy cập vào các chuyên mục của trang web. Joomla! cho phép tạo ra nhiều Menu Item giống hoặc khác nhau với các kiểu hiển thị có các chức năng đa dạng. Sau đây là cách tạo một số Menu Item cơ bản:
Trong Menu Item Manager chọn New để tạo Menu Item mới.
menu item manager
Trong Menu Item: [New] có các kiểu Menu Item sau:
  • Tạo Menu Item hiển thị nội dung - Article:
menu item article
  • Tạo Menu Item hiển thị phần liên hệ - Contact:
menu item contact
  • Tạo Menu Item cấp tin News Feeds:
menu item newsfeeds
  • Tạo Menu  User dành cho thành viên:
menu item user
  • Tạo Menu Item Liên kết Web - Web Link:
menu item weblink
  • Tạo các kiểu Menu Item khác:
menu item other
Các thiết lập cơ bản của Menu Item:
menu item details

  • ID: Đây là mã số danh định của Menu Item, được đánh số tự động.
  • Title: Tên của Menu Item, tên này sẽ xuất hiện trên Menu của trang Web.
  • Alias: Tên dành cho Joomla! quản lý, có thể tự đặt còn nếu để trống thì Joomla! sẽ tự đặt theo Title nhưng không có dấu và khoảng cách. Tên này thường dùng trong chức năng SEO/SEF.
  • Link: Địa chỉ liên kết của Menu Item này.
  • Display in: Chọn hiển thị trong Menu nào.
  • Parent Item: Chọn cấp độ cho Menu Item, Top là cao nhất còn nếu chọn tên Menu Item nào thì Menu Item này sẽ là Menu Item phụ (Sub) của Menu Item được chọn.
  • Published: Trạng thái hiển thị để sử dụng, No là không hiển thị và Yes là hiển thị.
  • Order: Sắp xếp thứ tự vị trí cho Menu Item, thứ tự này có thể thay đổi được trong Menu Item Manager.
  • Access Level: Chọn mức độ truy cập, Publish: bất cứ ai cũng truy cập được Menu Item này, Registered: Những thành viên sau khi đăng nhập mới truy cập được, Special: Chỉ có các thành viên được cấp quyền đặc biệt mới truy cập được.
  • On Click, Open in: Chọn các trạng thái mở của trình duyệt khi nhấn vào Meu Item này.
Lưu ý:
  • Trong mỗi kiểu Menu Item sẽ có các thông số cơ bản giống nhau và các thông số riêng của từng kiểu Menu Item.
  • Khi cài đặt thêm các Component cho Joomla! thì tên của chúng sẽ xuất hiện trong Menu Item: [New], muốn hiển thị các Component này thì phải tạo Menu Item cho chúng.

Xây dựng ứng dụng tạo trang upload nhiều hình ảnh


Ở những bài trước, chúng ta đã có dịp nghiên cứu từng ứng dụng nhỏ bởi việc kết hợp PHP và Mysql. Trong bài này, chúng ta sẽ tiếp tục tìm hiểu phương pháp xây dựng một trang upload nhiều hình ảnh như thế nào. Và lưu chúng vào cơ sở dữ liệu ra sao trong lập trình php.
Mô hình này là rất cần thiết đối với các hệ thống. Bởi qua đó người sử dụng có thể thao tác và upload những hình ảnh đi kèm với hệ thống của họ như tin tức, sản phẩm,…
Đầu tiên, ta tiến hành xây dựng cơ sở dữ liệu với bảng images như sau (xem lại Bài 9: cơ bản về ngôn ngữ sql và mysql).
CREATE TABLE  `images` (
 `img_id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `img_url` VARCHAR( 255 ) NOT NULL ,
 `img_name` VARCHAR( 150 ) NOT NULL
);
Như vậy, tôi có bảng images với 3 cột thuộc tính là img_id dùng để lưu khóa của từng hình, img_url dùng để lưu đường dẫn vào hệ thống, img_name dùng để lưu tên hình ảnh.
Ứng dụng của chúng ta cũng rất cần sự tùy biến và dễ sử dụng. Sao cho người dùng có thể hoàn toàn thao tác.
Ví dụ: nếu có 2 hình, họ chỉ muốn tạo ra 2 chế độ chọn file thì sẽ chỉ khai báo là 2.
Và ngược lại nếu là n hình, họ sẽ tạo được n file lựa chọn. Để làm được điều này, trước tiên ta cần tạo 1 form nhỏ cho phép người dùng nhập vào số lượng file mà họ muốn thao tác. Vậy tôi khởi tạo file có tên upload.php với mã lệnh form như sau:
<form action="upload.php" method="post">
Enter your Image: <input type="text" name="txtnum" value="<?php echo $_POST['txtnum']; ?>" size="10" />
<input type="submit" name="ok_num" value="Accept" />
</form>
Sau khi người dùng nhấn nút accept thì cũng là lúc chúng ta tạo ra số field upload theo yêu cầu của họ. Vậy, ta có code xử lý bên dưới như sau: (xem lại bài 4: xử lý giá trị trên form).
<?php
if(isset($_POST['ok_num']))
{
            $num=$_POST['txtnum'];
            echo "<hr />";
            echo "Ban dang chon $num file upload<br />";
            echo "<form action='doupload.php?file=$num' method='post' enctype='multipart/form-data'>";
            for($i=1; $i <= $num; $i++)
            {
                 echo "<input type='file' name='img[]' /><br />";
            }
            echo "<input type='submit' name='ok_upload' value='Upload' />";
            echo "</form>";
}
?>
Đoạn code này sử dụng vòng lặp for với điều kiện là biến $i sẽ nhỏ hơn số file mà họ nhập vào. Đồng thời, để việc upload thành công tại form ta cũng cần thêm đoạn code :
enctype='multipart/form-data'.
Số lượng field sẽ lặp theo yêu cầu của người dùng. Do vậy. tại name của thể input, ta sẽ sử dụng mảng để lưu thông tin. Sử dụng name='img[]', có nghĩa là mỗi lần lặp và mỗi lần người dùng chọn file thì mảng img sẽ thêm 1 khóa tương ứng. (xem lại bài 6: tổng quan về mảng về các hàm hỗ trợ)
Và cuối cùng là nút submit thực thi công việc upload và gọi tới trang doupload.php?file=$num (chỉ rõ số file cụ thể do người dùng nhập tại trang doupload).
1-8-2011_11-46-19_AM
Vậy toàn bộ code của trang upload này sẽ như sau:
<form action="upload.php" method="post">
Enter your Image: <input type="text" name="txtnum" value="<?php echo $_POST['txtnum']; ?>" size="10" />
<input type="submit" name="ok_num" value="Accept" />
</form>
<?php
if(isset($_POST['ok_num']))
{
            $num=$_POST['txtnum'];
            echo "<hr />";
            echo "Ban dang chon $num file upload<br />";
            echo "<form action='doupload.php?file=$num' method='post' enctype='multipart/form-data'>";
            for($i=1; $i <= $num; $i++)
            {
                 echo "<input type='file' name='img[]' /><br />";
            }
            echo "<input type='submit' name='ok_upload' value='Upload' />";
            echo "</form>";
}
?>
Tại trang thực hiện nhiệm vụ doupload.php ta cần kiểm tra xem, người dùng có nhấn nút upload từ trang bên kia hay không ?. Nếu có ta sẽ xử lý công đoạn upload ấy, nếu không ta cần thông báo lỗi cho người dùng và yêu cầu họ chọn file.
<?php
if(isset($_POST['ok_upload']))
{
      //thực thi upload
}
else
{
      echo "Vui long chon hinh truoc khi truy cap vao trang nay";
}
?>
Như vậy, khi người dùng nhấn upload, ta sẽ lấy được tham số là biến $num từ liên kết $_GET[‘file'] mà ta đã thiết lập trên phần form action của file upload ở trang trước.
Biến $num này dùng để thực thi việc upload và tuần tự lấy các thông tin của file.
Để upload file từ máy lên hệ thống ta cần sử dụng hàm:
move_uploaded_file(tên_file_tạm,đường dẫn tới hệ thống).
Có thể diễn giải nôm na công việc của hàm này như sau: Ngay sau khi người dùng nhấn upload, hệ thống sẽ tạo ra 5 tham số ứng với từng file. Cụ thể là tên tạm (tmp_name), tên gốc (name), kích thước (size), định dạng mime (type) và lỗi (error) nếu có.
Và khác với kiểu nhập liệu thông thường, khi chúng ta sử dụng <input type=file name=ten> thì lúc này sẽ phát sinh một biến môi trường mới là $_FILES[‘ten'] và dĩ nhiên nó sẽ đi kèm với 5 tham số cụ thể ở trên.
Ví dụ: $_FILES[‘ten'][‘name'] //Lấy ra tên gốc của file.
Vậy ứng với cú pháp upload ở trên ta sẽ có:
move_uploaded_file($_FILES['img']['tmp_name'],"data/".$_FILES['img']['name']);
Cú pháp này sẽ tự động upload hình ảnh lên thư mục data trên hệ thống. Vậy ta cần phải tạo thư mục data ngang cấp với 2 file upload và doupload. Nếu là host thật, bạn cần CHMOD thư mục là 777 (cho phép thư mục có toàn quyền) thì mới thực thi upload file được.
Trong tình huống của chúng ta, vì là upload một lúc nhiều file, nên lúc này ta phải sử dụng tham số mảng tại trang upload ta đã khởi tạo.
Vậy ứng với biến $num ta nhận từ upload ở trên ta sẽ triển khai code đơn giản như sau:
<?php
for($i=0; $i< $num; $i++)
{
 move_uploaded_file($_FILES['img']['tmp_name'][$i],"data/".$_FILES['img']['name'][$i]);
 $url="data/".$_FILES['img']['name'][$i];
 $name=$_FILES['img']['name'][$i];
}
?>

Với biến $i là số lượng tăng lên theo vòng lặp. Vì mảng luôn bắt đầu bởi khóa là 0 nên ta cần phải thiết lập khởi tạo biến $i với giá trị là 0. Biến $url và $name là đường dẫn hình ảnh và tên gốc của tấm hình được sử dụng để lưu vào CSDL.
Kế tới, ta cần lưu thông tin hình ảnh tương ứng vào cơ sở dữ liệu. Để làm được điều này, ta cần kết nối CSDL với cú pháp sau: (xem lại Bài 10: kết hợp php & mysql trong ứng dụng website).
<?php
$conn=mysql_connect("localhost","root","root") or die("can't connect your database");
mysql_select_db("images",$conn);
?>
Như vậy mỗi khi upload thành công một hình ảnh, ta phải thêm hình ảnh đó vào CSDL như sau:
<?php
$sql="insert into images(img_url,img_name) values('$url','$name')";
mysql_query($sql);
?>
Sau khi thêm vào CSDL ta cần hiển thị thông tin và hình ảnh vừa upload để cho người dùng biết họ đã upload thành công.
Khi đó ta sử dụng một biến $site để lưu đường dẫn gốc hiển thị trên textbox.
1-8-2011_11-50-39_AM
Vậy hoàn chỉnh code cho file doupload.php này như sau:
<?php
$site= "http://www.sotayweb.com";
if(isset($_POST['ok_upload']))
{
 $num=$_GET['file'];
 echo "<h3>Demo Images Script - SotayWeb.com</h3>";
 $conn=mysql_connect("localhost","root","root") or die("can't connect your database");
 mysql_select_db("images",$conn);
 for($i=0; $i< $num; $i++)
 {
  move_uploaded_file($_FILES['img']['tmp_name'][$i],"data/".$_FILES['img']['name'][$i]);
  $url="data/".$_FILES['img']['name'][$i];
  $name=$_FILES['img']['name'][$i];
  $sql="insert into images(img_url,img_name) values('$url','$name')";
  mysql_query($sql);
  echo "Upload Thanh cong file <b>$name</b><br />";
  echo "<img src='$url' width='120' /><br />";
  echo "Images URL: <input type='text' name='link' value='$site/$url' size='35' /><br />";
  
 }
 mysql_close($conn);
}
else
{
 echo "Vui long chon hinh truoc khi truy cap vao trang nay";
}

Xây dựng hệ thống bình chọn bằng PHP và MYSQL


chúng ta đã bàn tới các ứng dụng quản lý người sử dụng, xây dựng bộ đếm, tạo mã bảo mật để phòng chống những người có dụng ý xấu trên website. Tiếp theo, trong bài này chúng ta sẽ bàn về cách thức xây dựng hệ thống cho phép người dùng bình chọn khi họ tiến hành thăm viếng website của chúng ta. Để xây dựng hệ thống bình chọn chúng ta cần phân tích xem hệ thống này cần có bao nhiêu bảng quan hệ.
A- Phân tích và thiết kế cơ sở dữ liệu:
Trong tình huống này chúng ta cần 1 bảng câu hỏi và 1 bảng câu trả lời.
Phân tích quan hệ giữa chúng ta có:
1 Câu hỏi có nhiều câu trả lời.
1 câu trả lời chỉ dành cho 1 câu hỏi.
Vậy giữa 2 bảng này sẽ phát sinh một khóa ngoại, là khóa dùng để liên kết giữa hai bảng này.
1-8-2011_11-29-06_AM
Vậy ta có cú pháp tạo 2 bảng như sau.
Bảng câu hỏi ( question)
mysql> create table question(qid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, -> qtitle VARCHAR(255) NOT NULL, -> qdate DATE NOT NULL DEFAULT '0000-00-00', -> PRIMARY KEY(qid));
Bảng câu trả lời (anwser)
mysql> create table answer(aid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-> qid INT(10) UNSIGNED NOT NULL,
-> atitle VARCHAR(255) NOT NULL,
-> acount INT(10) NOT NULL DEFAULT '0', 
-> PRIMARY KEY(aid));
Nhập liệu bằng CSDL ta có:
mysql> Insert into question(qtitle,qdate) values("Ban thay qhonline the nao ?","
2009-10-10");
mysql> Insert into answer(qid,atitle,acount) values("1","Nhin rat dep",0);
mysql> Insert into answer(qid,atitle,acount) values("1","Nhin Dep",0);
mysql> Insert into answer(qid,atitle,acount) values("1","Nhin Cung duoc",0);
mysql> Insert into answer(qid,atitle,acount) values("1","Nhin qua xau",0);
B- Xây dựng trang bình chọn poll.php
Kết nối cơ sở dữ liệu:
<?php
$conn=mysql_connect("localhost","root","root") or die("can not connect database");
mysql_select_db("poll_exam",$conn);
?>
Lựa chọn câu hỏi có trong cơ sở dữ liệu để liệt kê ra trên website, sau đó ta lại tiếp tục liệt kê các câu trả lời của câu hỏi đó bằng cách sử dụng dấu chọn lựa (radio). Như vậy chúng ta sẽ phải chạy cùng lúc 2 câu truy vấn lồng nhau trong suốt quá trình truy xuất.
<?php
$sql="select * from question order by qid desc";
$query=mysql_query($sql);
if(mysql_num_rows($query) > 0)
{
 $row=mysql_fetch_array($query);
 $qid=$row[qid];
 echo "<form action="poll.php?questionid=$qid" method="post" >";
 echo "<h2>$row[qtitle]</h2>";
 $sql2="select * from answer where qid='".$qid."' order by aid";
 $query2=mysql_query($sql2);
 if(mysql_num_rows($query2) > 0)
 {
  while($row2=mysql_fetch_array($query2)){
  echo "<input type=radio name=answer value=$row2[aid]>$row2[atitle]<br />";
  }
 }
 echo "<input type=submit name=ok value="Binh Chon">";
 echo "<a href=result.php?questionid=$qid>Xem Ket Qua</a>";
 echo "</form>";
}
?>
Và màn hình sẽ xuất ra như hình bên dưới
1-8-2011_11-35-51_AM
Và khi người dùng nhất nút Bình chọn, chúng ta sẽ gọi lại chính trang đó để xử lý dữ liệu mà người dùng vừa lựa chọn.
Vậy ta phải sử dụng lệnh isset() để kiểm tra xem người dùng có nhấn nút bình chọn không, tiếp đến ta lấy ra id mà người dùng vừa tiến hành chọn ở form bên dưới.
Cuối cùng ta cập nhật dữ liệu bằng cách lấy số trong cơ sở dữ liệu cộng tiếp cho 1 đơn vị nữa. Và đưa người dùng sang trang kết quả.
Vì trong đoạn code này có lệnh header nên chúng ta phải đặt quá trình xử lý này ở trên form. Nếu không sẽ bị lỗi dữ liệu khi gởi.
<?php
if(isset($_POST['ok']))
{
 $id=$_POST['answer'];
 $qid=$_GET['questionid'];
 $sql3="update answer set acount=acount + 1 where aid='".$id."'";
 mysql_query($sql3);
 header("location: result.php?questionid=$qid");
 exit();
}
?>
Vậy toàn bộ code của trang poll.php này như sau.
<?php
$conn=mysql_connect("localhost","root","root") or die("can not connect database");
mysql_select_db("poll_exam",$conn);
if(isset($_POST['ok']))
{
 $id=$_POST['answer'];
 $qid=$_GET['questionid'];
 $sql3="update answer set acount=acount + 1 where aid='".$id."'";
 mysql_query($sql3);
 header("location: result.php?questionid=$qid");
 exit();
}
$sql="select * from question order by qid desc";
$query=mysql_query($sql);
if(mysql_num_rows($query) > 0)
{
 $row=mysql_fetch_array($query);
 $qid=$row[qid];
 echo "<form action="poll.php?questionid=$qid" method="post" >";
 echo "<h2>$row[qtitle]</h2>";
 $sql2="select * from answer where qid='".$qid."' order by aid";
 $query2=mysql_query($sql2);
 if(mysql_num_rows($query2) > 0)
 {
  while($row2=mysql_fetch_array($query2)){
  echo "<input type=radio name=answer value=$row2[aid]>$row2[atitle]<br />";
  }
 }
 echo "<input type=submit name=ok value="Binh Chon">";
 echo "<a href=result.php?questionid=$qid>Xem Ket Qua</a>";
 echo "</form>";
}
?>
C- Xây dựng trang kết quả bình chọn result.php
Ở trang này, ta sẽ lấy giá trị question id của người bình chọn từ trang poll.php và tính toán xem tỷ lệ phần trăm của các câu hỏi ấy như thế nào.
Đầu tiên, ta lấy giá trị từ poll.php?questionid=1. vậy 1 là giá trị ta sẽ có được từ $_GET['questionid']. Tiếp đến ta lại dùng giá trị vừa lấy được này để liệt kê thông tin câu hỏi và tính toán giá trị.
Để tính toán giá trị, ta cần biết tổng số bình chọn trong toàn bộ các câu trả lời hiện nay là bao nhiêu. Bằng câu lệnh SUM ta có thể làm được điều đó.
$sql2="select qid, SUM(acount) as total from answer group by qid having qid='".$qid."'";
Câu lệnh này cho phép ta lấy ra tổng số bình chọn trong cơ sở dữ liệu của câu hỏi mà ta truyền vào. Để SUM được acount ta cần phải GROUP(gom nhóm) chúng ta lại theo mã câu hỏi mà chúng ta cần tìm. having là mệnh đề theo sau có ý nghĩa tương đương với where, nó thường được sử dụng theo GROUP.
Như vậy để lấy ra tổng số phiếu bình chọn ta chỉ việc thực thi câu truy vấn này, và lấy tên cột tạm là total.

<?php
$sql2="select qid, SUM(acount) as total from answer group by qid having qid='".$qid."'";
$query2=mysql_query($sql2);
$row2=mysql_fetch_array($query2);
$total=$row2[total];
?>
kế tới, ta lại tính toán số phiếu của từng câu hỏi trong cơ sở dữ liệu, dựa vào tổng số câu hỏi này.
Ví dụ: Tổng số câu hỏi là 10
câu 1 là 3
câu 2 là 4
câu 3 là 2
câu 4 là 1
vậy suy ra phần trăm trên tổng số 10 của 4 câu này được tính bằng cách lấy. số liệu của từng câu chia cho tổng số câu hỏi và nhân cho 100. (3/10)*100 = 30%
Để làm tròn kết quả ta sử dụng hàm round(). Giúp dữ liệu đưa về sự đồng bộ và rõ ràng nhất.
Vậy code xử lý của chúng ta như sau:
<?php
$sql3="select * from answer where qid='".$qid."' order by aid";
$query3=mysql_query($sql3);
if(mysql_num_rows($query3) > 0)
{
 while($row3=mysql_fetch_array($query3)){
 $percent=round(($row3[acount]/$total)*100,2);
 echo "<h4 style="color:red; font:12px verdana; ">$row3[atitle] : $row3[acount] ($percent %)</h4>";
 }
}
?>
Kết quả khi xuất ra sẽ có hình như sau:
1-8-2011_11-40-44_AM
Vậy toàn bộ mã nguồn của trang result.php này như sau:
mysql> create table answer(aid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-> qid INT(10) UNSIGNED NOT NULL,
-> atitle VARCHAR(255) NOT NULL,
-> acount INT(10) NOT NULL DEFAULT '0', 
-> PRIMARY KEY(aid));


Viết ứng dụng đếm số người online bằng php

Trước hết, chúng ta khởi tạo cở sở dữ liệu như sau
mysql> create table useronline(tgtmp INT(15) DEFAULT "0" NOT NULL , ip VARCHAR(50) NOT NULL , local VARCHAR(100) NOT NULL, PRIMARY KEY(tgtmp), KEY ip(ip), KEY local(local));
tgtmp là thời gian mà họ truy cập được tính khi họ truy vào trang web đó.
IP là dãy số lưu thông tin IP của họ khi viếng thăm website của chúng ta.
local là nơi lưu đường dẫn mà họ đang truy cập.
Khi người dùng truy cập vào trang web, chúng ta sẽ tiến hành insert thông tin của họ vào cơ sở dữ liệu với các tham số cơ bản nhưng trong database.
tgtmp được tính ra bằng hàm time(). Hàm này sẽ lấy ra thời gian hiện tại của người truy cập. Tiếp tục ta lại tính thời gian mới của họ, được tính bằng việc quy ước thời gian quy định. Cụ thể ở đây tôi cho là 900 giây tương đương với 15 phút truy cập của họ.
<?php $tg=time(); $tgout=900; $tgnew=$tg - $tgout; ?>
như vậy nếu thời gian lưu trong database mà nhỏ hơn thời gian new này thì chúng ta có thể hiểu rằng vị khách ấy đã rời khỏi website của chúng ta. Cụ thể hơn.
Ví dụ: tôi viếng thăm website đó là 7h.
như vậy hệ thống sẽ ghi thông tin lúc đó là 7h.
Nếu sau 1 thời gian tôi không làm gì, hoặc tôi không truy cập website đó nữa thì hệ thống sẽ không ghi nhận thông tin mới. Như thế nếu bây giờ 8h và trừ đi 15 phút tôi quy ước, rõ ràng là thời gian mới hiện tại là 7h45, Thời gian này vẫn lớn hơn thời điểm lưu thông tin 7h (7h45 > 7h). Do vậy, nếu chúng thỏa điều kiện đó thì chúng ta chỉ việc xóa đi các record trong cơ sở dữ liệu là xong.
Vậy ta có code kết nối CSDL như sau:(xem lại Bài 10: kết hợp PHP và MYSQL trong ứng dụng)
<?php $conn=mysql_connect("localhost","root","root") or die("can't connect"); mysql_select_db("online",$conn); ?>
Sau đó ta tiến hành ghi nhận thông tin người dùng vào CSDL.
<?php
$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
$query=mysql_query($sql);
?>
$REMOTE_ADDR là biến môi trường dùng để lấy ra IP của người truy cập.
$PHP_SELF là biến môi trường dùng để lấy ra đường dẫn mà người dùng đang truy cập.
Tiếp đến ta tiến hành xóa record khi thời gian thực lớn hơn thời gian trong cơ sở dữ liệu.
<?php $sql="delete from useronline where tgtmp < $tgnew"; $query=mysql_query($sql); ?>
Tiếp tục là công việc hiển thị thông tin ra bên ngoài bằng cách liệt kệ các record có trong database.
<?php
$sql="SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'";
$query=mysql_query($sql);
$user = mysql_num_rows($query);
?>
DISTINCT là cú pháp cho phép liệt kệ các dòng record mà không cho phép chúng có dữ liệu trùng lặp như cú pháp select bình thường.
Vậy chúng ta sẽ liệt kê tất cả những ip của những ai đang truy cập trên trang useronline.php.
Phần việc cuối cùng còn lại là chúng ta sẽ xuất thông tin ấy ra trình duyệt. Và sau đây là toàn bộ nội dung code của trang useronline.php
<?php
$tg=time();
$tgout=900;
$tgnew=$tg - $tgout;
$conn=mysql_connect("localhost","root","root") or die("can't connect");
mysql_select_db("online",$conn);
$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
$query=mysql_query($sql);
$sql="delete from useronline where tgtmp < $tgnew";
$query=mysql_query($sql);
$sql="SELECT DISTINCT ip FROM useronline WHERE file='$PHP_SELF'";
$query=mysql_query($sql);
$user = mysql_num_rows($query);
echo "user online :$user";
?>

Viết ứng dụng tạo mã xác nhận bằng PHP


Trước tiên, chúng ta tiến hành tạo form HTML đơn giản để thực thi thao tác nhập liệu như sau:
<form action="form.php" method=post> <table> <tr> <td align="left"> <label for="captcha">Captcha</label> </td> <td> <input type="text" name="txtCaptcha" maxlength="10" size="32" /> </td> <td> <img src="/random_image.php" /> </td> </tr> <tr> <td>&nbsp;</td> <td> <input type=submit name=ok value="Check" /> </td> </tr> </table> </form>
Chúng ta chú ý phần hình ảnh, tại đây tôi truyền đường dẫn chính là liên kết tới trang random_image.php. Trang này sẽ thực thi công việc tạo ra những bức hình có dãy số ngẫu nhiên để phần nhập liệu của người sử dụng tham chiếu tới.
Tiếp theo, chúng ta khởi tạo file random_image.php để lấy ra dãy số ngẫu nhiên và phát sinh chúng ngay trên tấm hình cho người truy cập nhập liệu.
Để làm được điều đó. Chúng ta sẽ khởi tạo session và lưu dãy số nhập liệu đó vào session của mình, sau đó so khớp với trang form bên kia.(xem lại Bài 7: Khái niệm cơ bản về cookie và session trong PHP)
1-7-2011_1-18-36_PM
Đầu tiên chúng ta sử dụng hàm md5 và ran để mã hóa các ký tự bao gồm số và chữ cái. Khi sử dụng hàm md5() ký tự phát sinh sẽ lên tới 32 ký tự. Và chúng ta chỉ lấy duy nhất 5 ký tự từ chuỗi mã hóa đó bằng hàm substr. Tiếp tục ta lưu đoạn mã hóa này trong session cụ thể $_SESSION['security_code'], để tại trang form ta sẽ sử dụng so sánh với phần nhập liệu của người sử dụng.
Vậy nên đoạn code dưới sẽ giải quyết các tình huống này.

<?php $md5_hash = md5(rand(0,999)); $security_code = substr($md5_hash, 15, 5); $_SESSION["security_code"] = $security_code; ?>
Kế đến ta khởi tạo tấm hình với chiều rộng và chiều cao mà ta thiết lập thông qua hàm ImageCreate() . Và tiếp tục khai báo 2 màu chính là trắng và đen bằng hàm ImageColorAllocate($image, red, green, blue ). Hàm này sẽ tạo ra một màu sắc từ hệ màu RGB trên tấm hình mà chúng ta vừa khởi tạo.
Tiếp tục ta đổ background của tấm hình sẽ là màu đen và chữ xuất hiện trên tấm hình sẽ là màu trắng bằng hàm ImageFill() và hàm ImageString(). Hàm ImageString có một số đối số cơ bản như sau: ImageString($image, 5, 30, 6, $security_code, $white); Trong đó:
+ $image là hình mà chúng ta khởi tạo.
+ 5: là font-size mà chúng ta quy ước cho ký tự xuất hiện trên hình.
+ 30: là khoảng cách bên trái của tấm hình.
+ 6 : là khoảng cách từ trên của tấm hình.
+ $security_code: là đoạn code sau khi chúng ta cắt ra ở trên.
+ $white: là màu sắc mà chúng ta đã sử dụng hàm ImageColorAllocate() ở trên để khởi tạo ra màu trắng.
<?php $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); ?>
Kế tới chúng ta sẽ sử dụng lệnh header để trả nội dung này trở về dữ liệu dạng hình. Và tiến hành khởi tạo định dạng cho file hình mà chúng ta vừa tạo là JPG đồng thời giải phóng hình tạm được sử dụng để khợi tạo ra tấm hình này bằng đoạn code sau:
<?php header("Content-Type: image/jpeg"); ImageJpeg($image); ImageDestroy($image); ?>
Để dễ quản lý chúng ta sẽ đặt tất cả đoạn code trên vào trong 1 hàm để dễ sử dụng và quản lý chúng tốt hơn. Vậy toàn bộ đoạn code trong trang random_image.php này như sau.

<?php session_start(); 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); } create_image() ; exit(); ?>
Tiếp tục, trong trang form chúng ta phải khởi tạo session để chúng nhận được các giá trị mà ta đã khởi tạo và sử dụng ở trang random_image, kế tới ta kiểm tra xem người dùng có nhấn submit chưa. Nếu có ta sẽ tiếp tục kiểm tra xem người dùng nhập vào textbox có đúng là dãy số hiển thị trên hình ảnh hay không. Và xuất ra thông báo tương ứng với nội dung của người nhập liệu. (xem lại Bài 4: Xử lý giá trị form trong PHP)
Sau đây là toàn bộ code của trang form.php.

<?php session_start(); if(isset($_POST['ok'])) { if($_POST['txtCaptcha'] == NULL) { echo "Please enter your code"; } else { if($_POST['txtCaptcha'] == $_SESSION['security_code']) { echo "ma lenh hop le"; } else { echo "Ma lenh khong hop le"; } } } ?> <form action="form.php" method=post> <table> <tr> <td align="left"> <label for="captcha">Captcha</label> </td> <td> <input type="text" name="txtCaptcha" maxlength="10" size="32" /> </td> <td> <img src="/random_image.php" /> </td> </tr> <tr> <td>&nbsp;</td> <td> <input type=submit name=ok value="Check" /> </td> </tr> </table> </form>

viết ứng dụng sửa xóa thành viên bằng PHP và MYSQL



<?php sessison_start(); if(isset($_SESSION['userid']) && $_SESSION['level'] == 2) { // tại đây thực thi các hoạt động khi đăng nhập thành công. } else { header("location: login.php"); exit(); } ?>
A- Xây dựng trang sửa thành viên:
Vì là trang chỉnh sửa thành viên, nên nội dung của chúng có phần sẽ giống với phần thêm thành viên, chỉ khác là các ô nhập liệu giờ đây đã có dữ liệu. Dữ liệu này chúng ta tiến hành lấy từ cơ sở dữ liệu thông qua biến truyền mà ở trang quản lý đã gửi edit_user.php?userid=$row[id]
1-7-2011_1-10-48_PM
Như vậy để lấy được giá trị từ liên kết này chúng ta sẽ sử dụng biến $_GET['userid']. Sau khi đã có được giá trị này, việc còn lại của bạn là lấy thông tin của id này từ cơ sở dữ liệu và đưa vào form để người dùng có thể chỉnh sửa.
Vậy ta có.

<?php $sql="select * from user where id='".$id."'"; $query=mysql_query($sql); $row=mysql_fetch_array($query); ?> <form action="edit_user.php?userid=<?=$id?>" method=post> Level: <select name=level> <option value=1 <? if($row[level] == 1) echo "selected"; ?>) >Member</option> <option value=2 <? if($row[level] == 2) echo "selected"; ?>>Administrator</option> </select><br /> Username: <input type=text name=user size=20 value="<?=$row[username]?>" /><br /> Password: <input type=password name=pass size=20 /> <br /> Re-password: <input type=password name=repass size=20 /><br /> <input type=submit name=ok value="Edit User" /> </form>
Theo như đoạn code ở trên phần value chúng ta muốn đưa giá trị vào thì buộc phải sử dụng cú pháp gọn <?=$ten?> hoặc cũng có thể sử dụng bằng cách <? echo $ten; ?>.. Ở đây chúng ta chỉ đưa ra giá trị trên text box username, còn lại mật khẩu do có thể bị mã hóa nên không nên hiển thị ra. Phần level do lưu trong cơ sở dữ liệu là những con số 1,2 nên khi đưa ra chúng ta phải so sánh, nếu trong bảng lưu là 1 thì ở chỗ có giá trị bằng 1 sẽ thêm chữ selected. Để mặc định lựa chọn khi người dùng nhấn vào nút chỉnh sửa.
Tiếp tới người dùng sẽ nhấn nút edit. Việc còn lại của chúng ta là kiểm tra dữ liệu khi họ tiến hành chỉnh sửa dữ liệu. Điểm khác biệt ở đây là chúng ta phải cân nhắc khi viết trang chỉnh sửa. Bởi không phải ai vào chỉnh sửa cũng đều sửa cả thông tin username, password, level. Có khi họ chỉ sửa mỗi level hoặc có khi họ chỉ sửa mỗi password.
Vì thế ta phải xét các trường hợp để giải quyết.
Trướng hợp 1: Người dùng chỉ chỉnh sửa username, level mà không chỉnh sửa password. Khi đó username, level bắt buộc đều đã có dữ liệu nên ta không cần kiểm tra chúng rỗng hay không. Nhưng với password chúng ta không thể bắt người lập trình nhập liệu. Và họ hoàn toàn có thể để rỗng.
Trường hợp 2: Người dùng chỉnh sửa username, level ,password. Khi đó ta xem password có dữ liệu và ta tiến hành cập nhật.
Để giải quyết bài toán trên thỏa 2 trường hợp ta sẽ xét phương pháp sau:
Ta kiểm tra password và repassword có giống nhau hay không ?. Nếu chúng khác nhau nghĩa là người dùng nhập liệu nhưng nhập sai. Vậy phải cảnh báo lỗi cho họ biết là họ đã nhập sai. Còn ngược lại nếu password và repassword giống nhau thì sẽ nảy sinh 2 trường hợp con.
+ Một là password và repassword đều có dữ liệu
+ Hai là password và repassword không có dữ liệu.
Khi đó ở trường hợp con 1 chúng ta sẽ khởi tạo biến $p và ghi nhận thông tin họ nhập liệu. Và ở trường hợp 2 chúng ta không ghi nhận thông tin người nhập liệu vì họ không có ý định chỉnh sửa mật khẩu. Có thể viết đoạn code đơn giản như sau:
<?php if($_POST['pass'] != $_POST['repass']) { echo "Password and re-password is not correct"; } else { if($_POST['pass'] != NULL) { $p=$_POST['pass']; } } ?>
Tiếp tới chúng ta sẽ phân loại dữ liệu cập nhật. Khi có username,password, level thì ta cập nhật tất cả thông tin của họ bằng cú pháp SQL. (xem lại bài 9: ngôn ngữ SQL và MYSQL cơ bản). Ngược lại khi không tồn tại password thì ta chỉ cập nhật username và level.
Một điều nữa chúng ta cần quan tâm đó là đối với lệnh update và delete, ta phải truyền 1 id cụ thể để tránh việc chúng xóa hoặc sửa dữ liệu toàn bộ trong bảng user. Với id tôi truyền nhận từ bên ngoài ta sẽ có.

<?php if($u && $p && $l ) { $sql="update user set username='".$u."', password='".$p."', level='".$l."' where id='".$id."'"; mysql_query($sql); header("location:mana_user.php"); exit(); } else { if($u && $l) { $sql="update user set username='".$u."', level='".$l."' where id='".$id."'"; mysql_query($sql); header("location:mana_user.php"); exit(); } } ?>
Sau khi sửa thành công một thành viên chúng ta sẽ đưa người dùng trở về với trang quản lý (xem bài 13 để biết cách xây dựng trang quản lý thành viên như thế nào)
Nội dung của toàn bộ code ở trên như sau:

<?php $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $id=$_GET['userid']; if(isset($_POST['ok'])) { if($_POST['user'] == NULL) { echo "Please enter your username"; } else { $u=$_POST['user']; } if($_POST['pass'] != $_POST['repass']) { echo "Password and re-password is not correct"; } else { if($_POST['pass'] != NULL) { $p=$_POST['pass']; } } $l = $_POST['level']; if($u && $p && $l ) { $sql="update user set username='".$u."', password='".$p."', level='".$l."' where id='".$id."'"; mysql_query($sql); header("location:mana_user.php"); exit(); } else { if($u && $l) { $sql="update user set username='".$u."', level='".$l."' where id='".$id."'"; mysql_query($sql); header("location:mana_user.php"); exit(); } } } $sql="select * from user where id='".$id."'"; $query=mysql_query($sql); $row=mysql_fetch_array($query); ?> <form action="edit_user.php?userid=<?=$id?>" method=post> Level: <select name=level> <option value=1 <? if($row[level] == 1) echo "selected"; ?>) >Member</option> <option value=2 <? if($row[level] == 2) echo "selected"; ?>>Administrator</option> </select><br /> Username: <input type=text name=user size=20 value="<?=$row[username]?>" /><br /> Password: <input type=password name=pass size=20 /> <br /> Re-password: <input type=password name=repass size=20 /><br /> <input type=submit name=ok value="Edit User" /> </form>

Viết ứng dụng quản lý thành viên bằng PHP và MYSQL


Sau khi đăng nhập vào trang admin người dùng sẽ được đẩy sang trang quản lý admin, tại đây chỉ những ai đã đăng nhập đúng với username và password trong cơ sở dữ liệu và có quyền hạn level là 2 thì mới có thể truy xuất vào trang này. Vì vậy chúng ta cần thao táckiểm tra session để quản lý phiên làm việc của người sử dụng. Đặt đoạn code sau ở những trang bạn muốn kiểm tra quyền truy cập của người sử dụng.
<?php sessison_start(); if(isset($_SESSION['userid']) && $_SESSION['level'] == 2) { // tại đây thực thi các hoạt động khi đăng nhập thành công. } else { header("location: login.php"); exit(); } ?>
Như vậy, chúng ta sẽ đặt đoạn code này ở trang quản lý user. Cụ thể tôi đặt trang này có tên file là manage_user.php. Vì dữ liệu sẽ lặp lại toàn bộ user và ứng với từng user sẽ là 1 dòng dữ liệu được lặp lại. Chúng ta sẽ xây dựng 1 bảng gồm có STT là số thứ tự của từng user được đếm trên mỗi user khi lặp, username là tên truy cập của họ, level là cấp bậc của user (1 là member và 2 là admin), edit là cột chứa các link chỉnh sửa user, del là cột xóa các user.
<table align=center width=400 border=1>
<tr> <td>STT</td> <td>Username</td> <td>Level</td> <td>Edit</td> <td>Del</td> </tr>
Tiếp theo, chúng ta sẽ kết nối CSDL để tiến hành lặp các user.
<?php $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user order by id DESC"; $query=mysql_query($sql); if(mysql_num_rows($query) == "") { echo "<tr><td colspan=5 align=center>Chua co username nao</td></tr>"; } ?>
Đoạn code ở trên tiến hành lựa chọn tất cả user có trong database. Đồng thời kiểm tra xem trong database có tồn tại user nào không. Nếu không sẽ xuất ra thông báo "chưa có username nào". Ngược lại khi có tồn tại user chúng ta sẽ xử lý tiếp như sau:

<?php $stt=0; while($row=mysql_fetch_array($query)) { $stt++; echo "<tr>"; echo "<td>$stt</td>"; echo "<td>$row[username]</td>"; if($row[level] == "1") { echo "<td>Member</td>"; } else { echo "<td>Admin</td>"; } echo "<td><a href=edit_user.php?userid=$row[id]>Edit</a></td>"; echo "<td><a href=del_user.php?userid=$row[id]>Del</a></td>"; echo "</tr>"; ?>
Ở đây ta dùng biến $stt để làm bộ đếm cho số lượng user. Như vậy, cứ mỗi lần lặp 1 user thì bộ đếm này sẽ tự động tăng lên 1 đơn vị. Sau đó, chúng ta đưa dữ liệu vào mảng và truyền các giá trị trên vào các cột dữ liệu trong bảng.
1-7-2011_1-02-48_PM
Tới đây ta đã kết thúc thao tác quản lý các user đang tồn tại trong cơ sở dữ liệu. Sau đây là toàn bộ code trong ứng dụng này.

<?php sesison_start(); if(isset($_SESSION['userid']) && $_SESSION['level'] == 2) { ?> <table align=center width=400 border=1> <tr> <td>STT</td> <td>Username</td> <td>Level</td> <td>Edit</td> <td>Del</td> </tr> <? $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user order by id DESC"; $query=mysql_query($sql); if(mysql_num_rows($query) == "") { echo "<tr><td colspan=5 align=center>Chua co username nao</td></tr>"; } else { $stt=0; while($row=mysql_fetch_array($query)) { $stt++; echo "<tr>"; echo "<td>$stt</td>"; echo "<td>$row[username]</td>"; if($row[level] == "1") { echo "<td>Member</td>"; } else { echo "<td>Admin</td>"; } echo "<td><a href=edit_user.php?userid=$row[id]>Edit</a></td>"; echo "<td><a href=del_user.php?userid=$row[id]>Del</a></td>"; echo "</tr>"; } } ?> </table>

Viết ứng dụng thêm thành viên bằng PHP và MYSQL


Sau khi đăng nhập vào trang admin người dùng sẽ được đẩy sang trang quản lý admin, tại đây chỉ những ai đã đăng nhập đúng với username và password trong cơ sở dữ liệu và có quyền hạn level là 2 thì mới có thể truy xuất vào trang này. Vì vậy chúng ta cần thao táckiểm tra session để quản lý phiên làm việc của người sử dụng. Đặt đoạn code sau ở những trang bạn muốn kiểm tra quyền truy cập của người sử dụng.
<?php session_start(); if(isset($_SESSION['userid']) && $_SESSION['level'] == 2) { // tại đây thực thi các hoạt động khi đăng nhập thành công. } else { header("location: login.php"); exit(); } ?>
Như vậy tại trang add_user.php chúng ta cũng đặt đoạn code trên và viết thêm 1 form thực thi công việc thêm thành viên.
1-7-2011_12-44-31_PM
Tương tự như những bài trước, chúng ta cũng lần lượt kiểm tra từng đối tượng. Trước hết cần xem thử người dùng đã nhấn nút Add New user chưa, sau đó lại kiểm tra xem người dùng đã nhập đầy đủ thông tin chưa. Cuối cùng là so sánh giữa password và re-password có giống nhau hay không. Tiếp theo chúng ta gán biến $l sẽ bằng với giá trị mà khi người dụng chọn level cho user đó. (xem lại Bài 4: Xử lý giá trị form trong PHP)
<?php
if(isset($_POST['adduser'])) { if($_POST['username'] == "") { echo "Vui long nhap username<br />"; } else { $u=$_POST['username']; } if($_POST['password'] != $_POST['re-password']) { echo "Password va re-password khong chinh xac<br />"; } else { if($_POST['password'] == "" ) { echo "Vui long nhap password<br />"; } else { $p=$_POST['password']; } } $l=$_POST['level']; }
?>
Kế đến chúng ta lại tiếp tục kiểm tra xem có tồn tại biến $u, $p và $l hay không (chỉ khi người dùng nhập liệu thì mới tồn tại cùng lúc 3 biến này). sau khi đã kiểm tra sự tồn tại của 3 biến này chúng ta tiếp tục dùng PHP kết nối cơ sở dữ liệu để kiểm tra xem username mà người dùng vừa chọn có trùng với username khác trong cơ sở dữ liệu chưa. nếu trùng thì phải xuất thông báo lỗi yêu cầu họ chọn username khác còn nếu không thì ta lại tiến hành thêm thành viên mới này vào CSDL.
<?php
if($u & $p & $l) { $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user where username='".$u."'"; $query=mysql_query($sql); if(mysql_num_rows($query) != "" ) { echo "Username nay da ton tai roi<br />"; } else { $sql2="insert into user(username,password,level) values('".$u."','".$p."','".$l."')"; $query2=mysql_query($sql2); echo "Da them thanh vien moi thanh cong"; } } ?>
Tới đây ta đã kết thúc thao tác thêm một thành viên mới vào cơ sở dữ liệu. Sau đây là toàn bộ code trong ứng dụng này.
<?php
session_start(); if(isset($_SESSION['userid']) && $_SESSION['level'] == 2) { if(isset($_POST['adduser'])) { if($_POST['username'] == "") { echo "Vui long nhap username<br />"; } else { $u=$_POST['username']; } if($_POST['password'] != $_POST['re-password']) { echo "Password va re-password khong chinh xac<br />"; } else { if($_POST['password'] == "" ) { echo "Vui long nhap password<br />"; } else { $p=$_POST['password']; } } $l=$_POST['level']; if($u & $p & $l) { $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user where username='".$u."'"; $query=mysql_query($sql); if(mysql_num_rows($query) != "" ) { echo "Username nay da ton tai roi<br />"; } else { $sql2="insert into user(username,password,level) values('".$u."','".$p."','".$l."')"; $query2=mysql_query($sql2); echo "Da them thanh vien moi thanh cong"; } } } } ?> <form action=add_user.php method=POST> Level: <select name=level> <option value=1>Member</option> <option value=2>Admin </option> </select><br /> Username: <input type=text name=username size=25><br /> Password: <input type=password name=password size=25> <br /> Re-Password: <input type=password name=re-password size=25><br /> <input type=submit name="adduser" value="Add New User"> </form> <?php } else { header("location: login.php"); exit(); } ?>

Viết ứng dụng đăng nhập bằng PHP và MYSQL


Ở những bài trước chúng ta đã học qua các kiến thức trọng yếu về PHP. Tuy nhiên, để có thể xây dựng một website hoàn chỉnh bằng những kiến thức đó thì quả thật không đơn giản. Bởi vì các kiến thức qua sách vở và tài liệu dù sao cũng chỉ là những kiến thức tổng quát và thiếu tính khách quan thực tiến. Nên khi người học lập trình bước vào giai đoạn viết ứng dụng thì thường rất lúng túng. Đó cũng là lý do tôi viết bài này để hưỡng dẫn các bạn dần làm quen với cách tiếp cận một ứng dụng PHP&MYSQL như thế nào.
Trước hết chúng ta phải thiết kế và xây dựng mô hình cơ sở dữ liệu ứng với từng lệnh bên dưới (xem lại bài ngôn ngữ SQL và MYSQL Căn Bản) sau đó mới tiến hành triển khai lập trình.
mysql -hlocalhost -uroot -proot mysql>create database project; mysql>use project; mysql>create table user( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password CHAR(50) NOT NULL, level CHAR(1) NOT NULL, PRIMARY KEY(id)); mysql>insert into user(username,password,level) values ("admin","12345","2") ("abc","12345","1");
Vậy là chúng ta đã có cơ sở dữ liệu như mô hình trên. Tiếp đến chúng ta thiết kế Form HTML để có màn hình đăng nhập khi người dùng truy cập.
Demo Login Example
<form action=login.php method=post> Username: <input type=text name=username size=25 /><br /> Password: <input type=password name=password size=25 /><br /> <input type=submit name=ok value="Dang Nhap" /> </form>
Tiếp đến chúng ta tiến hành kiểm tra dữ liệu từ form
<?php if(isset($_POST['ok'])) { if($_POST['username'] == NULL) { echo "Please enter your username<br />"; } else { $u=$_POST['username']; } if($_POST['password'] == NULL) { echo "Please enter your password<br />"; } else { $p=$_POST['password']; } } ?>
Đoạn code ở trên sẽ kiểm tra xem người dùng có tiến hành nhấn nút đăng nhập hay không. Và nếu có thì chúng ta sẽ xét tiếp tình trạng người dùng có để trống các ô username và password hay không. Nếu có chúng ta sẽ thông báo lỗi ở bên trên form, để người sử dụng tiến hành nhập liệu.
Kế đến chúng ta kiểm tra xem có tồn tại hai biến $u và $p (chỉ khi người dùng đăng nhập thành công thì mới có thể tạo ra 2 biến đó). Tiếp đến chúng ta tiến hành kết nối cơ sở dữ liệu (xem lại bài kết hợp PHP & MYSQL trong ứng dụng web).
<?php $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); ?>
Và tiến hành kiểm tra xem username và password người sử dụng vừa nhập có trùng khớp với thông tin có trong cơ sở dữ liệu hay không ?. Nếu không thì chúng ta sẽ báo lỗi ngay. Ngược lại sẽ tiến hành lấy dữ liệu từ bảng và gán vào session. Để có thể quản lý phiên làm việc một cách hiệu quả trên mọi trang của khu vực admin (xem lại bài khái niệm cơ bản về cookie và session).
<?php if($u && $p) { $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user where username='".$u."' and password='".$p."'"; $query=mysql_query($sql); if(mysql_num_rows($query) == 0) { echo "Username or password is not correct, please try again"; } else { $row=mysql_fetch_array($query); session_start(); session_register("userid"); session_register("level"); $_SESSION['userid'] = $row[id]; $_SESSION['level'] = $row[level]; } } ?>
Như vậy code hoàn chỉnh cho ứng dụng này là như sau:
<?php if(isset($_POST['ok'])) { if($_POST['username'] == NULL) { echo "Please enter your username<br />"; } else { $u=$_POST['username']; } if($_POST['password'] == NULL) { echo "Please enter your password<br />"; } else { $p=$_POST['password']; } if($u && $p) { $conn=mysql_connect("localhost","root","root") or die("can't connect this database"); mysql_select_db("project",$conn); $sql="select * from user where username='".$u."' and password='".$p."'"; $query=mysql_query($sql); if(mysql_num_rows($query) == 0) { echo "Username or password is not correct, please try again"; } else { $row=mysql_fetch_array($query); session_start(); session_register("userid"); session_register("level"); $_SESSION['userid'] = $row[id]; $_SESSION['level'] = $row[level]; } } } ?> <form action=login.php method=post> Username: <input type=text name=username size=25 /><br /> Password: <input type=password name=password size=25 /><br /> <input type=submit name=ok value="Dang Nhap" /> </form>