สอบถามเรื่องนับนับจำนวนผู้เข้าชมตามตัวอย่างที่มีใน Web Thai Create
จาก Link https://www.thaicreate.com/community/php-counter-day-yesterday-thismonth-lastmonth-year-lastyear.html
ผมได้ลองทำตามโดยเปลี่ยนจาก DB Mysql เป็น SQL Server ได้ตามนี้
Code (PHP)
<?php error_reporting(E_ERROR | E_PARSE); ?>
<?php
//*** By Weerachai Nukitram ThaiCreate.Com ***//
//*** Connect MySQL ***//
include('connect.php');
//*** Select วันที่ในตาราง Counter ว่าปัจจุบันเก็บของวันที่เท่าไหร่ ***//
//*** ถ้าเป็นของเมื่อวานให้ทำการ Update Counter ไปยังตาราง daily และลบข้อมูล เพื่อเก็บของวันปัจจุบัน ***//
$strSQL = "SELECT TOP 1 DATE FROM counter order by id_counter desc";
$objQuery = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_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"))."'";
//*** ลบข้อมูลของเมื่อวานในตาราง counter ***//
$strSQL = " DELETE FROM counter WHERE DATE != '".date("Y-m-d")."' ";
sqlsrv_query($conn, $strSQL);
}
//*** Insert Counter ปัจจุบัน ***//
$strSQL = " INSERT INTO counter (DATE,IP) VALUES ('".date("Y-m-d")."','".$_SERVER["REMOTE_ADDR"]."') ";
sqlsrv_query($conn, $strSQL);
//******************** Get Counter ************************//
// Today //
$strSQL = " SELECT COUNT(DATE) AS CounterToday FROM counter WHERE DATE = '".date("Y-m-d")."' ";
$objQuery = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_fetch_array($objQuery);
$strToday = $objResult["CounterToday"];
// Yesterday //
$strSQL = " SELECT NUM FROM daily WHERE DATE = '".date('Y-m-d',strtotime("-1 day"))."' ";
$objQuery = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_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 = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_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 = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_fetch_array($objQuery);
$strLastMonth = $objResult["CountMonth"];
// This Year //
$strSQL = " SELECT SUM(NUM) AS CountYear FROM daily WHERE DATE_FORMAT(DATE,'%Y') = '".date('Y')."' ";
$objQuery = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_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 = sqlsrv_query($conn, $strSQL);
$objResult = sqlsrv_fetch_array($objQuery);
$strLastYear = $objResult["CountYear"];
//*** Close MySQL ***//
sqlsrv_close($conn);
?>
<table width="183" border="1" cellspacing = "0" cellpadding = "5">
<tr>
<td colspan="2"><div align="center">Statistics</div></td>
</tr>
<tr>
<td width="98">Today</td>
<td width="75"><div align="center"><?php echo number_format($strToday,0);?></div></td>
</tr>
<tr>
<td>Yesterday</td>
<td><div align="center"><?php echo number_format($strYesterday,0);?></div></td>
</tr>
<tr>
<td>This Month </td>
<td><div align="center"><?php echo number_format($strThisMonth,0);?></div></td>
</tr>
<tr>
<td>Last Month </td>
<td><div align="center"><?php echo number_format($strLastMonth,0);?></div></td>
</tr>
<tr>
<td>This Year </td>
<td><div align="center"><?php echo number_format($strThisYear,0);?></div></td>
</tr>
<tr>
<td>Last Year </td>
<td><div align="center"><?php echo number_format($strLastYear,0);?></div></td>
</tr>
</table>
ผมปรากฏคือ มันนับจำนวนวันที่เป็น Today แต่พอเปลี่ยนวัน มันลบ Today ออก แต่ตรง Yesterday ลงมา มันไม่มีข้อมูลเลย
Code (PHP)
$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"))."'";
เหมือนว่าบรรทัดข้างบนนี้นี้มันไม่ทำงาน และมันก็ไม่ขึ้น ERROR ฟ้องอะไรเลย ... เลยอยากจะถามว่าผมควรแก้ไขตรงไหนครับ
อีกอย่างที่อยากถามคือ ผมไม่เข้าใจตรง
Code (PHP)
WHERE 1 AND DATE = '".date('Y-m-d',strtotime("-1 day"))
ตรงเลข 1 คืออะไร มากจาไหน
ขอบคุณครับTag : PHP, Ms SQL Server 2016
ประวัติการแก้ไข 2021-04-08 16:01:02 2021-04-08 16:02:13 2021-04-08 16:08:29
Date :
2021-04-08 15:59:36
By :
yutthanagorn
View :
759
Reply :
2
ตอบเฉพาะเลข 1
เลข 1 ใน WHERE คือความหมายเหมือนกับ true
อย่างเช่น WHERE 1 AND ... ก็จะได้ความหมายประมาณว่า ถ้าเป็นจริงและ... ซึ่งมันไม่มีอะไรมางัดมาตรวจว่าอะไรคือจริง ดังนั้น WHERE 1 อีกนัยหนึ่งคือผ่านตลอด ไม่มีอะไร เอาไว้เฉยๆ
ปกติการเขียนแบบนี้จะเอาไว้เพื่อไม่ต้องใช้ if ตรวจสอบอะไรมากมายวุ่นวาย
ยกตัวอย่าง ถ้าหากมีหลายเงื่อนไขใน SQL มันจะต้องใช้ if ตรวจสอบประมาณนี้
Code (PHP)
$sql = 'SELECT * FROM `table`';
if (isset($_POST['name']) OR isset($_POST['age'])) {
$sql .= ' WHERE';
}
if (isset($_POST['name'])) {
$sql .= ' `name` = \'' . $_POST['name'] . '\'';
}
if (isset($_POST['name']) && isset($_POST['age'])) {
$sql .= ' AND';
}
if (isset($_POST['age'])) {
$sql .= ' `age` = \'' . $_POST['age'] . '\'';
}
// ข้างบนตัวอย่างไม่ดีเพราะไม่ได้ escape ป้องกัน sql injection อย่าเอาอย่าง แค่ยกมาให้ดูเฉยๆ
ในขณะที่ถ้าเอา WHERE 1 มาใช้จะเหลือแค่นี้
Code (PHP)
$sql = 'SELECT * FROM `table` WHERE 1';
if (isset($_POST['name'])) {
$sql .= ' AND `name` = \'' . $_POST['name'] . '\'';
}
if (isset($_POST['age'])) {
$sql .= ' AND `age` = \'' . $_POST['age'] . '\'';
}
// ข้างบนตัวอย่างไม่ดีเพราะไม่ได้ escape ป้องกัน sql injection อย่าเอาอย่าง แค่ยกมาให้ดูเฉยๆ
นี่แค่ 2 เงื่อนไข ซึ่งในความจริงบางงาน WHERE condition มีหลักสิบก็มีมาแล้ว ก็ลองคิดดูว่าจะต้อง if ยาวเหยียดขนาดไหน
อันนี้คงเข้าใจ WHERE 1 บ้างแล้ว
ประวัติการแก้ไข 2021-04-09 16:03:27
Date :
2021-04-09 16:02:10
By :
mr.v
Load balance : Server 05