PHP Mysql获取日期范围的统计信息

时间:2011-11-30 09:00:52

标签: php mysql statistics

我在数据库中获得扫描计数。时间字段是一个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时,它不再有效。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

问题是这样的:curdate( )+1产生20111131(到2011-11-30日)不是我认为你期望的,2011-12-01,对于后来的curdate()也是如此1}}打电话。它可能工作正常,因为本月早些时候调用导致正确的日期,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语句之前,搜索SO以获取有关清理用户输入的提示。

答案 1 :(得分:0)

下面的单引号是不需要的,并打破了功能的其余部分。

.$timeframe - 1';

答案 2 :(得分:0)

curdate和timeframe的格式可能不是您所期望的,因此计算无效。在你的phpmyadmin或同等程序中编写查询,如果首先出现语法错误并且输出结果与预期一致,则计算出来

回显值并查看PHP中的差异。然后在查询中使用这些。

正确的结果?

希望这会有所帮助

答案 3 :(得分:0)

我宁愿用PHP做“所有逻辑”,然后只运行一个非常基本的MySql查询。例如,您可以轻松获得过去日期的时间戳(Y-m-d 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);