Сразу скажу, что опытным программистом откровения не будет, грабли тривиальные.
Все знают, что в моделях недопустимо использовать суперглобальные массивы $_POST, $_SESSION, $_SERVER и т.д., поскольку этоделает невозможным усложняет тестирование кода и его повторное использование. Но если суперглобальные массивы, всё-таки, при желании можно «хакнуть» (разумеется это уже за гранью добра и зла), то другую менее очевидную зависимость от глобального окружения — уже никак.
Я говорю о времени — такую зависимость вы добавляете в свой код, когда используете в php-модели time() ( date() без аргумента timestamp) или в MySql-запросе now() (sysdate в Oracle). «Хакнуть» время сервера, чтобы узнать как поведет себя ваш запрос завтра или вчера — задача нетривиальная.
Как это происходит.
У вас есть таблица с афишей Event и задача — вывести сегодняшние события, ручки сразу тянуться написать now():
Не делайте так :)
Во-первых, как протестировать, что покажет запрос через неделю (в реальности логика конечно сложнее, чем в примере)?
Во-вторых, если завтра, понадобится календарь с показом событий за произвольную дату, то придется дублировать код.
Лучше сразу сделать так:
UPDATE:
Теперь и протестировать можно и вызвать метод для произвольной даты.
UPD. 15 анонимных минусов, люди! 14 человек добавили статью в избранное, объясните всем что ни так в статье? Или поставить минус — это вроде секса?
Все знают, что в моделях недопустимо использовать суперглобальные массивы $_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)";
}
Не делайте так :)
Во-первых, как протестировать, что покажет запрос через неделю (в реальности логика конечно сложнее, чем в примере)?
Во-вторых, если завтра, понадобится календарь с показом событий за произвольную дату, то придется дублировать код.
Лучше сразу сделать так:
UPDATE:
function findToday() {
$this->findByDate( new DateTime() );
}
function findByDate( DateTime $dateTime ) {
$dateStart = $dateTime->format('Y-m-d H:00:00');
$dateEnd = $dateTime->format('Y-m-d 23:59:59');
$sql = "SELECT * FROM event
WHERE event_date >= '$dateStart' AND event_date <= '$dateEnd' ";
}
Теперь и протестировать можно и вызвать метод для произвольной даты.
UPD. 15 анонимных минусов, люди! 14 человек добавили статью в избранное, объясните всем что ни так в статье? Или поставить минус — это вроде секса?