Thứ Ba, 9 tháng 9, 2014

PHIÊN BẢN DRUPAL 7 CHÍNH THỨC RA MẮT

Hôm nay phiên bản Drupal 7 chính thức đầu tiên đã ra mắt. Đây là phiên bản Drupal ổn định nhất từ trước đến nay, với hàng loạt thay đổi mới trong nền tảng.
Drupal là hệ quản trị nội dung (CMS) mã nguồn mở dựa trên PHP, từng hai lần đạt giải CMS nguồn mở tốt nhất, một lần đạt giải CMS nguồn mở danh giá nhất của Packtpub. Drupal có cấu trúc linh hoạt, dễ mở rộng, nên còn được xem là một nền tảng để xây dựng bất kì ứng dụng web nào.

Drupal 7 mang đến một giao diện quản trị hoàn toàn mới với rất nhiều cải tiến cho người phát triển site và người quản lí nội dung. Giao diện overlay sử dụng AJAX giúp bạn có một trải nghiệm tuyệt vời nhất.

Drupal 7 cũng linh hoạt hơn với khái niệm trường tuỳ biến (Fields). Trường cho phép bạn mở rộng gần như mọi đối tượng trong Drupal bằng cách gán thêm thuộc tính cho chúng. Bạn có thể gán thuộc tính cho rất nhiều đối tượng, trong đó có bài viết, bình luận, người dùng và thậm chí gán thuộc tính cho cả tag.

Kể từ phiên bản 7, Drupal hỗ trợ nhiều CSDL khác nhau, từ MySQL cho đến PostgreSQL, SQLite, MS SQL Server, Oracle… và thậm chí có thể mở rộng để hỗ trợ các dạng NoSQL.

Phiên bản 7 cũng chú trọng trong các cải tiến về hiệu năng. Các kĩ thuật tối ưu CSS/JS, chia tải, proxy nghịch… đều được hỗ trợ rất tốt. Đây cũng là phiên bản Drupal ổn định nhất từ trước đến nay với hơn 30 nghìn bài kiểm tra đơn vị.

Bất kì thay đổi nào của hệ thống đều phải vượt qua toàn bộ các bài kiểm tra này trước khi được thông qua.Drupal đang được sử dụng trong rất nhiều lĩnh vực, từ các báo điện tử, website/Intranet của doanh nghiệp, trường học cho đến các website văn hoá, nghệ thuật, cộng đồng và các mạng xã hội.

Drupal 7 yêu cầu:

* Máy chủ Web Apache, Nginx, Lighttpd, hoặc Microsoft IIS
* MySQL 5.0.15+, PostgreSQL 8.3+, hoặc SQLite 3.x
* PHP 5.2.4+
* Bộ nhớ: 32 MB (để cài thêm một số mô-đun phổ biến, có thể cần đến 64 MB)

Để làm quen, bạn hãy vào http://www.drupalgardens.com/ để tạo một website Drupal 7 miễn phí, tuỳ chỉnh theo ý mình trong vòng 15 phút.

Sử dụng HTML Encoding trong ASP.NET MVC3

Mục tiêu của bài viết này là tôi sẽ nói về phương thức Raw của ASP.NET MVC3 nhằm định dạng các kiểu cho một ứng dụng website cụ thể nào đó.
Để biết cách tạo một ứng dụng ASP.NET MVC3, xin các bạn xem bài viết để hiểu rõ hơn, ở đây tôi sẽ không quay lại cách tạo ứng dụng ASP.NET MVC3
Bước 1: Tạo một Models có tên Product để định nghĩa các Properties như sau:
public class Products
    {       
            public int ProductId { getset; }
            public string ProductName { getset; }
            public string Description { getset; }
     }
Bước 2: Vào trong HomeController, tôi khởi tạo dữ liệu cho Models Product. Đây là nơi chứa nguồn dữ liệu cho Product
public ActionResult Index()
        {
            IEnumerable<Products> product = new List<Products>() {
                new Products(){ProductId=1,ProductName="Laptop",Description="Chi tiet ve may tinh <b>Laptop</b>"},
                new Products(){ProductId=2,ProductName="PC",Description="Chi tiet ve may tinh PC"},
                new Products(){ProductId=3,ProductName="IPad",Description="Chi tiet ve may tinh <b>Tablet</b>"}               
            }.ToList(); 
            ViewBag.Message = "Welcome to ASP.NET MVC!"
            return View(product);
        }
Ở đây, các bạn nhìn thấy trường Description có các định dạng <b></b> ở 3 Record của Product.
Chúng ta ngầm hiểu, khi hiển thị dữ liệu thì những định dạng <b></b> này sẽ in đậm.
Bước 3: Vào View/Home/Index.cshtml để viết mã lệnh nhằm hiển thị lên Browser như sau
@model IEnumerable<HTMLEncoding.Models.Products>
@{
    ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<ul id="nav">
@foreach (var item in Model )
       {
        <li style="float:left;width:10%;list-style:none;">@item.ProductId</li>
        <li style="float:left;width:30%;list-style:none;">@item.ProductName</li>
        <li style="float:left;width:60%;list-style:none;">@item.Description</li>
        <li style="clear:both;list-style:none;"></li>
    }
</ul>
Bước 4: Nhấn F5 để kiểm tra ứng dụng website, thì các bạn sẽ thấy phần Description không định dạng được, xem hình bên dưới
Trương Minh Tuấn
Bước 5: Vào View/Home/Index.cshtml sửa phần @item.Description thành @Html.Raw(item.Description)
Bước 6: Nhấn F5 một lần nữa để kiểm tra, xem hình bên dưới
Trương Minh Tuấn

THỦ THUẬT PHP PHẦN 3

THỦ THUẬT HỌC PHP 

Bảo vệ chống lại các lỗ hổng XSS

Các lỗ hổng XSS chiếm một tỷ lệ lớn trong tất cả các lỗ hổng về trang web được ghi chép lại trong năm 2007 (xem Tài nguyên). Một lỗ hổng XSS xuất hiện khi một người sử dụng có khả năng bơm mã HTML vào các trang web của bạn. Mã HTML có thể mang theo mã JavaScript bên trong các thẻ kịch bản (script tags), bằng cách đó cho phép JavaScript chạy bất cứ khi nào một trang được rút ra. Biểu mẫu trong Liệt kê 9 có thể đại diện cho một diễn đàn, trang mạng biên tập tự do (wiki), mạng xã hội, hoặc bất kỳ trang web nào khác thông dụng để gõ nhập văn bản.
Liệt kê 9. Biểu mẫu để nhập vào văn bản
<html>
<head>
<title>Your chance to input XSS</title>
</head>
<body>
<form id="myFrom" action="showResults.php" method="post">
<div><textarea name="myText" rows="4" cols="30"></textarea><br />
<input type="submit" value="Delete" name="submit" /></div>
</form>
</body>
</html>
Liệt kê 10 chứng tỏ cách biểu mẫu này in ra được các kết quả, cho phép tấn công bằng XSS.
Liệt kê 10. showResults.php
<html>
<head>
<title>Results demonstrating XSS</title>
</head>
<body>
<?php
echo("<p>You typed this:</p>");
echo("<p>");
echo($_POST['myText']);
echo("</p>");
?>
</body>
</html>
Liệt kê 11 đưa ra một thí dụ cơ sở trong đó các cửa sổ mới bật ra mở đến trang chủ của Google. Nếu ứng dụng web của bạn không bảo vệ chống lại các tấn công bằng XSS, thì giới hạn thiệt hại duy nhất chỉ còn là sức tưởng tượng của kẻ thâm nhập mà thôi. Ví dụ, một ai đó có thể thêm vào một liên kết mà bắt chước kiểu dáng của trang web đó để lừa đảo (phishing) (xem Tài nguyên).
Liệt kê 11. Mẫu văn bản đầu vào độc hại
<script type="text/javascript">myRef = window.open('http://www.google.com','mywin',
'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');</script>
Để tự bảo vệ bạn chống lại các tấn công XSS, hãy lọc đầu vào của bạn thông qua hàm htmlentities() bất cứ khi nào giá trị của một biến được in đến đầu ra. Hãy nhớ làm theo thói quen đầu tiên về kiểm tra hợp lệ dữ liệu đầu vào bằng các giá trị trong danh sách trắng trong ứng dụng web của bạn đối với tên, địa chỉ email, số điện thoại, và thông tin về hoá đơn thanh toán.
Một phiên bản an toàn hơn nhiều của trang để hiển thị văn bản đầu vào như dưới đây.
Liệt kê 12. Một biểu mẫu an toàn hơn
<html>
<head>
<title>Results demonstrating XSS</title>
</head>
<body>
<?php
echo("<p>You typed this:</p>");
echo("<p>");
echo(htmlentities($_POST['myText']));
echo("</p>");
?>
</body>
</html>

Thứ Tư, 2 tháng 10, 2013

Tối ưu hóa PHP



Tối ưu hóa code php,hướng dẫn tối ưu hóa code php nếu với số lượng lớn người sử dụng cùng lúc,mã nguồn được viết hợp lí, có thể cải thiện các chương trình của bạn được tăng một cách đáng kể.

Trong những năm gần đây, PHP đã trở thành một trong những ngôn ngữ phổ dụng nhất trong lập trình ứng dụng web. Ưu điểm của PHP là mã nguồn mở, miễn phí và không yêu cầu cấu hình hệ thống máy chủ cao. Tuy nhiên, PHP có một số điểm yếu, một trong số đó là tốc độ. Dù vậy, nếu mã nguồn được viết hợp lí, sử dụng PHP bạn hoàn toàn có thể tạo được ứng dụng chạy với tốc độ vượt trội.

Các thủ thuật tăng tốc

Để có thể giải thích rõ ràng, chúng ta bắt đầu bằng một ví dụ:

require_once 'my_functions.php';
function format_str($str) {
$str = str_replace('0', '1', $str);
return $str;
}
$my_array = array();
// Mã nguồn để đưa dữ liệu vào $my_array ở đây
for ($i = 0; $i < count($my_array); $i++) {
if (ereg('^[0-9]+, $my_array[$i]) && (strlen($my_array[$i]) > 1)) {
$my_array[$i] = format_str($my_array[$i]);
print $my_array[$i].”<br />”;
}
}

Vấn đề đầu tiên là việc sử dụng require_once làm chương trình chậm đi, khi đó PHP sẽ phải kiểm tra xem file đã được nạp trước đó chưa. Tất nhiên, trong nhiều trường hợp, điều này là không tránh khỏi. Nhưng nếu không thực sự cần thiết, bạn nên sử dụng require hoặc include thay vì require_once/include_once.

...
require 'my_functions.php'
...

Với đoạn mã trên, ở mỗi vòng lặp, PHP sẽ phải chạy count($my_array) và so sánh kết quả với $i. Tuy nhiên, vì dữ liệu của $my_array là không đổi, chạy count với mỗi lần lặp là không cần thiết. Vòng lặp trên có thể được viết lại nhanh hơn như sau:

...
$c = count($my_array);
for ($i = 0; $i < $c; $i++) {
...
Hoặc gọn hơn, có thể viết:
...
for ($i = 0, $c = count($my_array); $i < $c; $i++) {
...

Như vậy, count($my_array) sẽ chỉ phải chạy một lần duy nhất, ngay cả khi mảng có vài nghìn phần tử.

Một vấn đề nữa với đoạn mã trên là việc sử dụng print, trong trường hợp này bạn nên sử dụng echo vì echo nhanh hơn khoảng 20% so với print. Lí do đơn giản là vì print làm nhiều việc hơn echo. Một là print thêm vào cuối chuỗi tham số một dấu xuống dòng (\n), hai là nó cũng trả về kết quả (luôn là 1). Khi dùng echo, bạn còn có thể đưa cả 2 chuỗi vào làm tham số, như vậy PHP sẽ không phải làm thao tác nối 2 chuỗi lại với nhau và chỉ đưa từng chuỗi ra màn hình một.

Đoạn mã trên còn sử dụng dấu nháy kép bao quanh <br />. Nếu sử dụng nháy đơn, PHP sẽ không phải tìm biến PHP cũng như các giá trị đặc biệt khác trong chuỗi (ví dụ như \n, \r, \t) và vì vậy mặc nhiên sẽ nhanh hơn.
Dòng mã in dữ liệu ra màn hình vì vậy có thể viết thành:

...
echo $my_array[$i], '<br />';
...

Ngoài ra, đoạn mã trên sử dụng ereg để kiểm tra xem chuỗi chỉ bao gồm một hoặc nhiều chữ số. Bạn không nên dùng ereg mặc dù ereg có vẻ dễ sử dụng hơn với nhiều người. Thay vào đó nên sử dụng preg_match, lí do là vì preg_match có tác dụng y hệt kèm theo ưu điểm vượt trội về tốc độ. Kể từ PHP 5.3.0, ereg không còn được khuyến khích sử dụng, dùng ereg sẽ gây ra khuyến cáo E_DEPRECATED. Dòng trên có thể viết lại thành:

...
if (preg_match('!^[0-9]+$!', $my_array[$i]) && (strlen($my_array[$i]) > 1)) {
...

Thay vì sử dụng strlen như ở trên, bạn cũng có thể sử dụng isset($my_array[$i]{1}). isset là một cấu trúc ngôn ngữ, không phải là hàm như strlen vì vậy sử dụng isset sẽ nhanh hơn strlen. Tất nhiên bạn hoàn toàn có thể thêm kiểm tra độ dài vào ngay trong preg_match – tuy nhiên, đây chỉ là một ví dụ để giúp bạn đọc hiểu được vấn đề.

...
if (preg_match('!^[0-9]+$!', $my_array[$i]) && isset($my_array[$i]{1})) {
...

Đoạn mã trên cũng sử dụng str_replace để thay thế toàn bộ 0 thành 1 trong chuỗi. Nếu mục đích chỉ đơn giản có vậy, bạn nên sử dụng strtr thay vì str_replace vì strtr có thể thực thi nhanh hơn 4 lần. Tương tự, str_replace cũng nhanh hơn preg_replace và preg_replace cũng nhanh hơn ereg_replace rất nhiều. Tùy vào hoàn cảnh, đôi lúc bạn không thể đơn thuần sử dụng strtr mà phải sử dụng str_replace hay thậm chí preg_replace, nhưng dù trong trường hợp nào bạn cũng không nên sử dụng ereg_replace vì mọi việc đều có thể làm được với preg_replace.

...
$str = strtr($str, '0', '1');
...

Tham số $str cho hàm format_str hoàn toàn có thể là tham chiếu (reference), sử dụng tham chiếu trong trường hợp này sẽ nhanh hơn vì PHP sẽ không phải copy tham số để đưa vào hàm.

...
function format_str(&$str) {
$str = strtr($str, '0', '1');
}
...

Tuy vậy, bạn cũng nên cẩn thận khi dùng cách này vì nếu như trong trường hợp bạn vô ý đổi giá trị tham số bên trong hàm, bạn hoàn toàn có thể gây ra một lỗi rất khó tìm.

Hàm format_str rất đơn giản, bạn hoàn toàn có thể loại bỏ hàm này và viết trực tiếp luôn vào trong vòng lặp giúp PHP không phải gọi hàm tự tạo, do vậy tăng tốc được chương trình:

...
$my_array[$i] = strtr($my_array[$i], '0', '1');
...

Hết sức cẩn thận khi dùng bởi lẽ cách trên cũng đồng nghĩa với việc bạn đánh đổi cấu trúc chương trình của bạn lấy tốc độ.

Thay vì gửi dữ liệu về máy tính người dùng nhiều lần, bạn cũng có thể tạo bộ đệm (buffer) và chỉ gửi dữ liệu một lần duy nhất. Làm như vậy sẽ giúp giảm thiểu băng thông sử dụng và cũng sẽ làm cho dữ liệu đến được người dùng nhanh hơn. Bạn có thể sử dụng buffer bằng cách thêm ob_start(); vào đầu chương trình.

Chương trình hoàn thiện vì vậy cuối cùng sẽ trở thành:

ob_start();
require 'my_functions.php';
$my_array = array();
// Mã nguồn để đưa dữ liệu vào $my_array ở đây
for ($i = 0, $c = count($my_array); $i < $c; $i++) {
if (preg_match('!^[0-9]+$!', $my_array[$i]) && isset($my_array[$i]{1})) {
$my_array[$i] = strtr($my_array[$i], '0', '1');
echo $my_array[$i], '<br />';
}
}

Các phương pháp khác

Để tăng tốc độ của chương trình, nhất thiết phải biết tốc độ thực thi chương trình, quan trọng hơn là phải biết chương trình chậm ở chỗ nào. Làm thế nào để có được thông tin này?

Bạn có thể sử dụng cách đơn giản nhất là tính thời điểm bắt đầu chương trình bằng time(), và thời điểm kết thúc cũng bằng hàm này. Nhưng như vậy bạn chỉ có thể biết được từng file trong chương trình của bạn chạy mất bao lâu mà không thể biết được đến mức hàm hay dòng mã nguồn.

Cách tốt hơn và cũng đơn giản hơn là sử dụng xdebug (http://www.xdebug.org). Với xdebug bạn có thể biết được đến từng hàm – mỗi hàm được gọi bao nhiêu lần, tốc độ thực thi của mỗi hàm, mỗi file cũng như của toàn bộ chương trình là bao nhiêu, và còn nhiều thông tin bổ ích khác.

Ngoài ra, một cách đơn giản và thường được sử dụng để tăng hiệu năng xử lí của chương trình PHP mà không phải sửa mã nguồn là sử dụng extension tăng tốc cho PHP. Phần lớn các extension này hoạt động bằng cách biên dịch mã nguồn PHP và lưu vào bộ nhớ để có thể được lấy ra sử dụng ngay thay vì phải biên dịch lại mỗi khi chương trình được sử dụng. Một số extension miễn phí phổ dụng:

- Alternative PHP Cache (http://php.net/manual/en/book.apc.php)
- eAccelerator (http://eaccelerator.net/)
- XCache (http://xcache.lighttpd.net/)

Kết luận
Với một đoạn mã ngắn như ví dụ trong bài viết này bạn khó có thể nhận thấy được khác biệt về tốc độ trừ khi tính tốc độ chạy bằng “xdebug”. Tuy nhiên, với một chương trình PHP hoàn chỉnh hoặc với một số lượng lớn người sử dụng cùng lúc, áp dụng các phương pháp nêu trong bài này có thể giúp chương trình của bạn tăng tốc đáng kể.

Lập trình Web bằng PHP là gì?



Nên bắt đầu từ đâu?
PHP không khó, lập trình web không khó, cái khó là không biết phải học những kiến thức bổ trợ nào, học tới đâu, học bao nhiêu cho đủ? Chữ đủ ở đây được hiểu là đủ dùng, không thiếu và cũng đừng “thừa”.
Để trả lời câu hỏi đó, chúng ta sẽ lấy việc “Lập trình web bằng PHP” làm trung tâm, các kiến thức bổ trợ khác như CSS, HTML, JS, SQL, v.v… sẽ được đề cập khi cần thiết.
Lập trình là gì?
Lập trình web là gì?
Lập trình web bằng PHP là gì?

Như ở một comment trong phần bài tập, tôi có nói, diễn giải theo một cách dễ hình nhung nhất thì lập trình tức là bạn đang cố gắng diễn đạt một mong muốn nào đó của bạn theo cách mà máy tính hiểu được, thông qua một ngôn ngữ trung gian.
Bạn có thể lập trình để làm nhiều việc, phục vụ cho nhiều mục đích khác nhau. Lập trình web được hiểu là lập trình phục vụ thường trực cho các công việc liên quan đến web. Nhưng không có nghĩa rằng các “ngôn ngữ lập trình web” (như PHP, ASP, JSP…) chỉ làm được những gì liên quan đến web. Vì một “ngôn ngữ lập trình web” trước hết phải là một ngôn ngữ lập trình.

Tôi lấy ví dụ, các bạn có thể dùng Pascal/C++ để lập trình tính toán cộng trừ nhân chia, giai thừa, tính lim, log, cộng trừ mảng, tạo ma trận, quản lý sinh viên, xử lý dữ liệu dạng tệp / dạng văn bản… Thế thì bạn cũng có thể dùng PHP để làm toàn bộ những việc đó (dù rằng mỗi ngôn ngữ sẽ có điểm mạnh yếu riêng, và trong một giới hạn nào đó, một vài điểm rất nhỏ ở ngôn ngữ này có thể không / khó thực hiện được ở ngôn ngữ kia).



Trong ít nhất là 2 bài tới, bạn phải thay đổi ngay suy nghĩ rằng “PHP là ngôn ngữ lập trình web nên để học PHP nhất thiết phải có webserver, hosting; nhất thiết phải có trình duyệt, nhất thiết phải rành, hoặc phải biết chút ít về HTML…”
Không. PHP là PHP, nó là một ngôn ngữ lập trình, và chúng ta sẽ học những bài đầu tiên của ngôn ngữ lập trình này mà không cần quan tâm tới bất cứ kiến thức bổ trợ nào như HTML, CSS, JavaScript hay MySQL. Chúng ta cũng không cần trình duyệt hay máy chủ. Tất cả những gì cần có là một phần mềm soạn thảo văn bản (notepad cũng đủ xài) và trình thông dịch lệnh PHP.

Nếu đã từng học qua / đọc qua các tài liệu giáo khoa liên quan đến lập trình, các bạn sẽ biết khái niệm về trình thông dịch và trình biên dịch. Tôi đề nghị các bạn xoá bỏ 2 khái niệm này và đồng nhất chúng thành “diễn dịch” cho dễ hiểu và dễ trình bày. Tôi sẽ cố gắng che lấp đi tất cả những gì có thể làm các bạn khó hiểu hay nản chí, và việc này đôi khi đòi hỏi một số định nghĩa “không đúng đắn” lắm, nhưng tôi cam kết sẽ quay lại nói lại cho rõ, cho đúng vào một thời điểm thích hợp, khi mà điều đó thực sự cần thiết cho các bạn. Vậy nên, từ bây giờ chúng ta sẽ gọi chung PHP là trình thông dịch.

Trình thông dịch, trước hết là một phần mềm. Tức là một file cụ thể trên đĩa cứng trong máy tính, có đuôi là .EXE. Để có trình thông dịch PHP, các bạn phải đi “đao lột” ở đâu đó về một file PHP.EXE (tất nhiên, đôi khi file PHP.EXE này đòi hỏi phải có nhiều file khác đi kèm thì mới hoạt động đúng đắn được). Sau khi có file PHP.EXE này rồi, bạn chỉ cần “chạy” nó, sử dụng nó, nhập dữ liệu cho nó, truyền tham số cho nó… thế là đủ để học lập trình PHP… phe phé!



Ví dụ, bạn có thư mục PHP ở ổ đĩa C, và trong C:\PHP có file PHP.EXE, thì bạn chỉ cần khởi động dòng lệnh MSDOS (bằng cách vào Window / Run, gõ lệnh CMD và nhấn Enter). Sau đó, tại con nháy C:\>, hãy gõ lệnh C:\>PHP\PHP.EXE để chạy phần mềm PHP.

Phần mềm PHP này cho phép bạn khởi chạy kèm theo một vài tham số. Và tham số đơn giản nhất là đường dẫn tới file mã nguồn PHP. Ví dụ, khi bạn gõ “C:\>PHP\PHP.EXE C:\PHP\MaNguon\Bai1.php” thì phần mềm PHP.EXE sẽ được thực thi, nó tìm tới file Bai1.PHP (tại thư mục MaNguon, trong thư mục PHP ở ổ đĩa C) để đọc nội dung, thực hiện các câu lệnh trong file Bai1.PHP và trả về kết quả.

Tất nhiên, ở đây chúng ta đang gọi thực thi PHP.EXE từ dòng lệnh – cửa sổ MS DOS nên kết quả trả về cũng sẽ là những dữ liệu hiển thị trong cửa sổ MS DOS. Không có trình duyệt, không có HTML hay CSS gì ở đây hết! Các bạn xem thêm hình minh hoạ ở dưới đây.

Chủ Nhật, 11 tháng 8, 2013

Viết ứng dụng tạo giỏ hàng trong php

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

Trong bài này, chúng ta sẽ nói về cách thức xây dựng tính năng thống kê số người đang viếng thăm website của bạn. Vì là chức năng nhỏ, nên tôi không đi nhiều về những tính năng lớn như bao nhiêu khách, bao nhiêu thành viên,...Chỉ đơn thuần là quá trình hiển thị hiện tại có bao nhiều người đang thăm viếng website của bạn.

Trước hết, chúng ta khởi tạo cở sở dữ liệu như sau. (xem lại bài : ngôn ngữ SQL và MYSQL cơ bản)
1mysql> create table useronline(tgtmp INT(15) DEFAULT "0" NOT NULL ,
2ip VARCHAR(50) NOT NULL ,
3local VARCHAR(100) NOT NULL,
4PRIMARY KEY(tgtmp),
5KEY ip(ip),
6KEY 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ọ.
1<?php
2$tg=time();
3$tgout=900;
4$tgnew=$tg $tgout;
5?>
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  kết hợp PHP và MYSQL trong ứng dụng)
1<?php
2$conn=mysql_connect("localhost","root","root"or die("can't connect");
3mysql_select_db("online",$conn);
4?>
Sau đó ta tiến hành ghi nhận thông tin người dùng vào CSDL.
1<?php
2$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
3$query=mysql_query($sql);
4?>
$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.
1<?php
2$sql="delete from useronline where tgtmp < $tgnew";
3$query=mysql_query($sql);
4?>
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.
1<?php
2$sql="SELECT DISTINCT ip FROM useronline WHERE local='$PHP_SELF'";
3$query=mysql_query($sql);
4$user = mysql_num_rows($query);
5?>
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
01<?php
02$tg=time();
03$tgout=900;
04$tgnew=$tg $tgout;
05$conn=mysql_connect("localhost","root","root"or die("can't connect");
06mysql_select_db("online",$conn);
07$sql="insert into useronline(tgtmp,ip,local) values('$tg','$REMOTE_ADDR','$PHP_SELF')";
08$query=mysql_query($sql);
09$sql="delete from useronline where tgtmp < $tgnew";
10$query=mysql_query($sql);
11$sql="SELECT DISTINCT ip FROM useronline WHERE local='$PHP_SELF'";
12$query=mysql_query($sql);
13$user = mysql_num_rows($query);
14echo "user online :$user";
15?>