Упростить корявую проверку даты

Retter

Новичок
Упростить корявую проверку даты

Вот такой кусочек есть не очень красивый.
PHP:
if (!empty($_POST['birthday_day']) &&
    !empty($_POST['birthday_month']) &&
    !empty($_POST['birthday_year']) &&
    is_numeric($_POST['birthday_day']) &&
    is_numeric($_POST['birthday_month']) &&
    is_numeric($_POST['birthday_year'])) {
    if (checkdate($_POST['birthday_month'],
                  $_POST['birthday_day'],
                  $_POST['birthday_year']))
        $birthday = $_POST['birthday_year'] . '-' .
                    $_POST['birthday_month'] . '-' .
                    $_POST['birthday_day'];
    else {
        set_message(WRONG_DATE);
        return false;
    }
}
Можно это как-нибудь проще/правильнее сделать?
 

asterisk

Новичок
PHP:
$error = array();
$error['birthday_year'] = $_POST['birthday_year']? 0 : 1;
$error['birthday_month'] = $_POST['birthday_month']? 0 : 1;
$error['birthday_day'] = $_POST['birthday_day']? 0 : 1;

if(in_array(1, $error))
{
 echo "ошибка";
}
 

AlexT

Новичок
написать функцию, которая проверяет переменную на empty и is_numeric, останеться только checkdate
 

WP

^_^
Retter
Красивой должна быть девушка. А код должен работать, и работать быстро. Представь что будет если в параметре передать массив.
 

Wicked

Новичок
Retter
is_numeric умеет пропускать всякие +0123.45e6.

Я бы сделал просто приведение типа переменных к int, потом checkdate, остальное как у тебя. И сделать это в виде функции compose_date($year, month, $day), которая возвращает дату или false (или кидает exception) в случае ошибки.

Кстати, твой "return false;" вообще непонятен. Если ты привел внутренности функции, то какого лешего там делает $_POST, и куда потом девается $birthdate? :) А если это не внутренности функции, то так вообще делать не надо :)
 

asterisk

Новичок
толку от всего этого шаманства с функциями checkdate?

PHP:
$error['field'] = $_POST['field']*1 ? 0 : 1;
вполне хватит для задачи топег стартера.
 

jonjonson

Охренеть
asterisk, если ты не заметил, то в итоге нужно убедиться, что дата верная.
 

Retter

Новичок
Автор оригинала: Wicked
Retter
is_numeric умеет пропускать всякие +0123.45e6.

Я бы сделал просто приведение типа переменных к int, потом checkdate, остальное как у тебя. И сделать это в виде функции compose_date($year, month, $day), которая возвращает дату или false (или кидает exception) в случае ошибки.

Кстати, твой "return false;" вообще непонятен. Если ты привел внутренности функции, то какого лешего там делает $_POST, и куда потом девается $birthdate? :) А если это не внутренности функции, то так вообще делать не надо :)
Спасибо за дельный совет. :)
Это часть внутренностей функции, большой, которая вообще всю форму проверяет. Конечно же, лучше отдельную маленькую функцию сделать.
 

jonjonson

Охренеть
Гы. Рефакторинг без классов... :)
PHP:
// --------------------------------------------------------------------------
function isDateDefined($requestInfo, $dateMeta)
{
    foreach ($dateMeta as $value) {
        if (isset($requestInfo[$value]) 
            && 0 < intval($requestInfo[$value])) {
            $requestInfo[$value] = intval($requestInfo[$value]);
        } else {
            return false;
        }
    }
    return true;
}

function isValidDate($requestInfo, $dateMeta)
{
    if (checkdate($requestInfo[$dateMeta['month']],
        $requestInfo[$dateMeta['day']],
        $requestInfo[$dateMeta['year']])) {
        return true;
    }
    return false;
}

function getDate($requestInfo, $dateMeta)
{
    $date = "{$requestInfo[$dateMeta['year']]}";
    $date .= "-{$requestInfo[$dateMeta['month']]}";
    $date .= "-{$requestInfo[$dateMeta['day']]}";
    return $date;
}
// --------------------------------------------------------------------------
$birthday_meta = array(
    'month'=> 'birthday_month', 
    'day'  => 'birthday_day',  
    'year' => 'birthday_year', 
);
if (isDateDefined($_POST, $birthday_meta) 
    && isValidDate($_POST, $birthday_meta)) {
    $date = getDate($_POST, $birthday_meta);
} else {
    $error = "Error!!!";
}
 

jonjonson

Охренеть
Beavis, так код измеряется не только количеством символов, но ещё читаемостью, повторным использованием и изменяемостью. Ты можешь теперь изменить
isDateDefined
sValidDate
getDate
не меняя логи приложения, если теперь дата записывается в одно текстовое поле birthday_date. Также можешь использовать данный код для других дат использующих три текстовых поля, но с другими названиями. :)
 

WP

^_^
Бредовая затея этот ваш рефакторинг, кода много, толку мало.
Wicked, пропускает, и что дальше? checkdate ведь не пройдет.
 

jonjonson

Охренеть
Автор оригинала: WP
Бредовая затея этот ваш рефакторинг, кода много, толку мало.
Ваш вариант? Не спора для, любопытства ради.

З.Ы. Я понимаю, что мой код смешон... Но всё же читаем. Для простых скриптов избыточен. И что главное, без постоянного использования, а это именно так, бесполезен. Но я хотел заострить внимание совсем на другом :)
 

Beavis

Banned
так немного короче)))
PHP:
date("Y-m-d", mktime(@$_POST['birthday_year'], @$_POST['birthday_month'] , @$_POST['birthday_day']));
(не воспринимать всерьёз)))
 

zerkms

TDD infected
Команда форума
Beavis
1. у mktime аргументы не такие
2. бывают даты рождения и до 1970г
 

Beavis

Banned
PHP:
<?php
	$arg = array(
		'year' => FILTER_VALIDATE_INT,
		'month' => FILTER_VALIDATE_INT,
		'day' => FILTER_VALIDATE_INT
	);
	$date = filter_input_array(INPUT_POST, $arg);
	if (checkdate($date['month'], $date['day'], $date['year'])) {
		$date = implode('-', $date);
	} else {
		$date = null;
	}
?>
можно вот так)
 

jonjonson

Охренеть
Beavis, порядок элементов массива $date какой? Это зависит от фильтра?
 
Сверху