繁体   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