2011-11-30 49 views
0

我正在獲取數據庫中的掃描計數。時間字段是一個MySQL時間戳(2011-10-20 14:15:12)。我有一個功能,可以讓我設置一個30天,60天等時間框架......這是工作數週。然後我只注意到它破裂了。PHP Mysql獲取日期範圍的統計信息

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時,它不再有效。任何幫助表示讚賞。

+0

從該代碼示例看起來您的代碼中有語法錯誤。你在else之前有一個額外的單引號。 – liquorvicar

+0

如何調用getScans()?你在30天的時間內使用30(看起來合理,只是雙重檢查)。 – zrvan

+0

上週有什麼變化?服務器更新?數據加載?有什麼事情必須引發失敗? – ManseUK

回答

1

問題是這樣的:curdate()+1產生20111131(2011-11-30至天)沒有什麼,我相信,你能指望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)); 

,或者更好的,所以建議在消毒用戶輸入其添加到SQL語句之前進行搜索。

+0

DATE_ADD(CURDATE(),INTERVAL +1 DAY)現在似乎工作。是的,這只是查詢的一個例子。在運行該查詢之前,變量被清理並按下。 – stueynet

0

不需要下面的單引號,並打破了函數的其餘部分。

.$timeframe - 1'; 
+0

謝謝,但這只是我的問題中的一個錯字。 – stueynet

+0

好的,我修好了。這裏是我的新代碼: – stueynet

0

curdate和timeframe的格式可能不是您所期望的,因此計算不起作用。請在您的phpmyadmin或同等文檔中寫入查詢,並確定是否首先出現語法錯誤,然後輸出如您期望的那樣

回顯出這些值並查看PHP中的差異。然後在你的查詢中使用這些。

正確的結果?

希望這有助於

0

嗯,我寧願用PHP做「所有的邏輯」,然後運行一個非常基本的MySql查詢。在過去的這個的日期很容易例如,你可以得到一個時間戳(S YMD H::1):

$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);