gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:39:12 24 4
gpt4 key购买 nike

我正在获取数据库中的扫描计数。时间字段是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 (到 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 语句之前,搜索 SO 以获取有关清理用户输入的提示。

关于PHP Mysql 获取日期范围内的统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8323337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com