[英]PHP Mysql get stats for a date range
我正在數據庫中進行掃描計數。 時間字段是mysql時間戳(2011-10-20 14:15:12)。 我有一個功能,可讓我設置30天,60天等時間范圍,這已經工作了幾周了。 然后我才發現它壞了。
function getScans($timeframe = 0)
{
if ($timeframe != 0) {
$query = 'SELECT COUNT( * )
FROM stats
WHERE time <= curdate( )+1
AND time >= curdate( )-' . ($timeframe - 1);
} else {
$query = 'SELECT COUNT( * )
FROM stats';
}
$result = mysql_query($query);
$row = mysql_fetch_array($result);
return $row[0];
}
我知道你們以前都聽說過,但這在上周已完全起作用。 我今天回去,發現當$ timeframe不是0時,它不再起作用。 任何幫助表示贊賞。
問題是這樣的: curdate( )+1
產生20111131
(到20111131
日),而不是我所希望的2011-12-01
,以后的curdate()
調用也是如此。 它可能運行良好,因為在當月早些時候調用產生了正確的日期,並且MySQL接受了格式設置,但是現在它無法警告“不可能”的日期。 下個月關閉,事情開始發生。
該查詢應重寫為:
SELECT
COUNT(*)
FROM `stats`
WHERE `stats`.`time` <= DATE_ADD(NOW(), INTERVAL 1 DAY)
AND `stats`.`time` >= DATE_SUB(NOW(), INTERVAL $timeframe DAY)
您可以執行以下操作:
function getScans($timeframe = 0)
{
if ($timeframe != 0) {
$query = 'SELECT COUNT( * )
FROM stats
WHERE time <= DATE_ADD(NOW(), INTERVAL 1 DAY)
AND time >= DATE_SUB(NOW(), INTERVAL ' . ($timeframe - 1) . ' DAY)';
} else {
$query = 'SELECT COUNT( * )
FROM stats';
}
$result = mysql_query($query);
$row = mysql_fetch_array($result);
return $row[0];
}
但是,如果$timeframe
可由用戶等提供,那不是最安全的方法。 相反,您應該考慮使用類似以下內容的方法:
$query = sprintf ('SELECT
COUNT(*)
FROM `stats`
WHERE `stats`.`time` <= DATE_ADD(NOW(), INTERVAL 1 DAY)
AND `stats`.`time` >= DATE_SUB(NOW(), INTERVAL %d DAY)',
mysql_real_escape_string ($timeframe, $connection_handle));
或者更好的方法是,在SO上搜索有關清理用戶輸入的提示,然后再將其添加到SQL語句中。
下面的單引號不是必需的,它破壞了該功能的其余部分。
.$timeframe - 1';
時鍾和時間范圍的格式可能與您預期的不符,因此計算無法正常進行。 用phpmyadmin或同等語言編寫查詢,然后首先確定是否存在語法錯誤,然后輸出是否如您所願
回顯值並查看PHP中的差異。 然后在查詢中使用它們。
正確的結果?
希望這可以幫助
嗯,我寧願使用PHP執行“所有邏輯”,然后只運行一個非常基本的MySql查詢。 例如,您可以使用以下方法輕松獲取過去日期的時間戳記(Ymd H:i:s):
$dayago = date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")-1,date("Y")));
$weekago = date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")-7,date("Y")));
$monthago = date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")-30,date("Y")));
將來的日期也一樣,因此示例如下:
$tomorrow = date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")+1,date("Y")));
因此,我將使用PHP進行所有邏輯處理,以獲取2個日期,然后運行Mysql查詢。 就像是:
$count = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM stats WHERE date>='$weekago' AND date<='$tomorrow'"),0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.