пятница, 8 ноября 2013 г.

time() или now() как зависимость от глобального окружения

Сразу скажу, что опытным программистом откровения не будет, грабли тривиальные.

Все знают, что в моделях недопустимо использовать суперглобальные массивы $_POST, $_SESSION, $_SERVER и т.д., поскольку это делает невозможным усложняет тестирование кода и его повторное использование. Но если суперглобальные массивы, всё-таки, при желании можно «хакнуть» (разумеется это уже за гранью добра и зла), то другую менее очевидную зависимость от глобального окружения — уже никак.

Я говорю о времени — такую зависимость вы добавляете в свой код, когда используете в php-модели time() ( date() без аргумента timestamp) или в MySql-запросе now() (sysdate в Oracle). «Хакнуть» время сервера, чтобы узнать как поведет себя ваш запрос завтра или вчера — задача нетривиальная.

Как это происходит.



У вас есть таблица с афишей Event и задача — вывести сегодняшние события, ручки сразу тянуться написать now():

function findToday() {
$sql = "SELECT * FROM event
WHERE event_date >= date( now() ) AND event_date < date( now() + interval 1 day)";
}




Не делайте так :)

Во-первых, как протестировать, что покажет запрос через неделю (в реальности логика конечно сложнее, чем в примере)?

Во-вторых, если завтра, понадобится календарь с показом событий за произвольную дату, то придется дублировать код.

Лучше сразу сделать так:

function findToday() {
$this->findByDate( date('Y-m-d') );
}

function findByDate($date) {
if ( !preg_match('|^(\d{4}-\d{2}-\d{2})|', $date, $p) ) {
throw new Exception('недопустимый формат даты');
}
$date = $p[1];

$sql = "SELECT * FROM event
WHERE event_date >= '$date 00:00:00' AND event_date <= '$date 23:59:59' ";
}




Теперь и протестировать можно и вызвать метод для произвольной даты.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий