Проблема в следующем: 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));
или, что еще лучше, поищите в SO советы по дезинфекции пользовательского ввода перед добавлением его в оператор SQL.