PHP : สร้าง Counter แบบละเอียด

สร้าง Counter แบบละเอียด โดยเก็บข้อมูลและแสดงแบบละเอียดเช่น Today, Yesterday,This Month, Last Month, This Year, Last Year (วันนี้ เมื่อวาน,เดือนนี้,เดือนก่อนนี้,ปีนี้,ปีก่อนนี้)

PHP Statistics

โดยใช้หมายเลข IP Address ในการนับจำนวนผู้เข้าชมอย่างแท้จริง สำหรับตัวอย่าง Script นี้ใช้การเก็บข้อมูลลงใน MySQL Database ประก่อบด้วย 2 ตารางหลัก ๆ คือ

Table Name
1. counter สำหรับตารางนี้เก็บข้อมูลรายวัน คือเก็บข้อมูลวันปัจจุบัน ว่ามีเข้ามาในเว็บไซต์กี่ IP และเมื่อขึ้นวันใหม่ข้อมูลจะถูก SUM และ Move ไว้ไปไว้ตาราง daily
2. daily สำหรับราตารางนี้จะเก็บข้อมูลในแต่ล่ะวันว่ามีกี่หมายเลข IP Address ที่เข้ามาชมเว็บไซต์ เป็นข้อมูลที่ถูก SUM ไว้ในแต่ล่ะวัน

MySQL Table

[code lang=”sql”]
CREATE TABLE counter (
DATE date NOT NULL,
IP varchar(30) NOT NULL,
PRIMARY KEY (DATE,IP)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
[/code]
[code lang=”sql”]
CREATE TABLE daily (
DATE date NOT NULL,
NUM varchar(3) NOT NULL,
PRIMARY KEY (DATE)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
[/code]

Concept การทำงาน
Concept ของ Script ตัวนี้ไม่ยาก คือในแต่ล่ะวันเมื่อ User ทำการเปิดหน้าเว็บ Page ขึ้นมา ก็จะถูก Insert ข้อมูลวันที่และ IP Address ลงในตาราง counter โดยในแต่ล่ะวันก็จะ Insert ข้อมูลทั้งหมด โดยหมายเลข IP Address จะไม่ซ้ำกัน ซึ่งจะได้ข้อมูล UNIQUE IP ที่ไม่ซ้ำกัน ของ

วันนั้น ๆ ลงในตาราง counter และ เมื่อมีการเปลี่ยนวันใหม่ ข้อมูลที่ถูก Insert ลงในตาราง counter ก็จะถูก SUM และ Move ไปไว้ในตาราง daily ซึ่งจะเก็บข้อมูลทุก ๆ วัน โดยโปรแกรมจะทำงานแบบนี้ซ้ำไปเรื่อย ๆ ไม่มีวันสิ้นสุด

สำหรับการ Query ตัว Statistics มาแสดงนั้นจะใช้ความสามารถของ function ของ MySQL ในการคำนวณ Query จากตาราง daily เพื่อนำข้อมูลมาแสดง

สำหรับ Code เต็ม ๆ ครับ

[code lang=”html”]
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
<?
//*** By Weerachai Nukitram ThaiCreate.Com ***//

//*** Connect MySQL ***//
mysql_connect("localhost","root","root");
mysql_select_db("counter");

//*** Select วันที่ในตาราง Counter ว่าปัจจุบันเก็บของวันที่เท่าไหร่ ***//
//*** ถ้าเป็นของเมื่อวานให้ทำการ Update Counter ไปยังตาราง daily และลบข้อมูล เพื่อเก็บของวันปัจจุบัน ***//
$strSQL = " SELECT DATE FROM counter LIMIT 0,1";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
if($objResult["DATE"] != date("Y-m-d"))
{
//*** บันทึกข้อมูลของเมื่อวานไปยังตาราง daily ***//
$strSQL = " INSERT INTO daily (DATE,NUM) SELECT ‘".date(‘Y-m-d’,strtotime("-1 day"))."’,COUNT(*) AS intYesterday FROM counter WHERE 1 AND DATE = ‘".date(‘Y-m-d’,strtotime("-1 day"))."’";
mysql_query($strSQL);

//*** ลบข้อมูลของเมื่อวานในตาราง counter ***//
$strSQL = " DELETE FROM counter WHERE DATE != ‘".date("Y-m-d")."’ ";
mysql_query($strSQL);
}

//*** Insert Counter ปัจจุบัน ***//
$strSQL = " INSERT INTO counter (DATE,IP) VALUES (‘".date("Y-m-d")."’,’".$_SERVER["REMOTE_ADDR"]."’) ";
mysql_query($strSQL);

//******************** Get Counter ************************//

// Today //
$strSQL = " SELECT COUNT(DATE) AS CounterToday FROM counter WHERE DATE = ‘".date("Y-m-d")."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strToday = $objResult["CounterToday"];

// Yesterday //
$strSQL = " SELECT NUM FROM daily WHERE DATE = ‘".date(‘Y-m-d’,strtotime("-1 day"))."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strYesterday = $objResult["NUM"];

// This Month //
$strSQL = " SELECT SUM(NUM) AS CountMonth FROM daily WHERE DATE_FORMAT(DATE,’%Y-%m’) = ‘".date(‘Y-m’)."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strThisMonth = $objResult["CountMonth"];

// Last Month //
$strSQL = " SELECT SUM(NUM) AS CountMonth FROM daily WHERE DATE_FORMAT(DATE,’%Y-%m’) = ‘".date(‘Y-m’,strtotime("-1 month"))."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strLastMonth = $objResult["CountMonth"];

// This Year //
$strSQL = " SELECT SUM(NUM) AS CountYear FROM daily WHERE DATE_FORMAT(DATE,’%Y’) = ‘".date(‘Y’)."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strThisYear = $objResult["CountYear"];

// Last Year //
$strSQL = " SELECT SUM(NUM) AS CountYear FROM daily WHERE DATE_FORMAT(DATE,’%Y’) = ‘".date(‘Y’,strtotime("-1 year"))."’ ";
$objQuery = mysql_query($strSQL);
$objResult = mysql_fetch_array($objQuery);
$strLastYear = $objResult["CountYear"];

//*** Close MySQL ***//
mysql_close();
?>

<table width="183" border="1">
<tr>
<td colspan="2"><div align="center">Statistics</div></td>
</tr>
<tr>
<td width="98">Today</td>
<td width="75"><div align="center"><?=number_format($strToday,0);?></div></td>
</tr>
<tr>
<td>Yesterday</td>
<td><div align="center"><?=number_format($strYesterday,0);?></div></td>
</tr>
<tr>
<td>This Month </td>
<td><div align="center"><?=number_format($strThisMonth,0);?></div></td>
</tr>
<tr>
<td>Last Month </td>
<td><div align="center"><?=number_format($strLastMonth,0);?></div></td>
</tr>
<tr>
<td>This Year </td>
<td><div align="center"><?=number_format($strThisYear,0);?></div></td>
</tr>
<tr>
<td>Last Year </td>
<td><div align="center"><?=number_format($strLastYear,0);?></div></td>
</tr>
</table>
</body>
<html>
[/code]

Screenshot
PHP Statistics

คัดลอกมาจาก : http://www.thaicreate.com