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