簡體   English   中英

PHP Mysql獲取日期范圍的統計信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM