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