отстой. http://sandbox.onlinephpfunctions.com/code/366d381e892e01be6eb95f341b0539af115bd2f3 --- Добавлено --- PHP: # если юзер не вводил дату р. $user_info['birthday'] = null; //Пусто $birthday = $userEdit -> formatBirtday( $user_info['birthday'] ); PHP Notice: Undefined index: 2 in ...... on line 8 PHP: printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' ); даже если Дата Р. вбита, по дистрикту типу у тебя так же будет ошибка PHP Notice: Undefined index: 2 in ...... on line 8 потому что ключ с типом integer
тут понял, разницы нет то-ли коротко написать то-ли через list, пишем короткую запись. в натуре ошибка с таким типом, не пойму а что не так, на экран она не выводится но через режим разработчика видна эта ошибка.
я так полагаю в коде PHP: printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' ); где в переменных массива нет ключа. PHP: $birthday['2'] $birthday['1'] $birthday['0'] Из-за этого ошибка, пробовал уже проверить $birthday по разному чет все ровно ругается, то ли прячет блок то ли отображает и при этом показывает ошибку.
Сделал таким образом, может есть лучше решение ? Спойлер: решение PHP: <div class="birthday"><!-- начало блока дня рождения --> <select name="user_day"> <option>День</option> <?php foreach( range(1, 31) as $day ) if( !empty($birthday['2'] ) ){ printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : ''); }else{ printf( "<option>$day</option>" ); } ?> </select> <select name="user_month"> <option>Месяц</option> <?php $months = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря' ]; foreach($months as $key => $month) if( !empty($birthday['1'] ) ){ printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : ''); }else{ printf( "<option>$month</option>"); } ?> </select> <select name="user_year"> <option>Год</option> <?php foreach( range( 1950, 2019 ) as $year ) if( !empty($birthday['0'] ) ){ printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : ''); }else{ printf( "<option>$year</option>"); } ?> </select> </div> <!-- конец блока дня рождения --> МаусЗверь вердикт, говнокода моего? Можно ли его улучшить?
PHP: foreach( range(1, 31) as $day ) Месяцы с 30 и 31 днём, февраль и високосный год. PHP: $months = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря' ]; i18n, локаль PHP: foreach( range( 1950, 2019 ) as $year ) В 2019 закончилась жизнь?
я не знаю как сделать правильно, что бы дата отображалась правильно, если високосные дни есть в зависимости от этого вывести правильно количество дней. Буде новый год добавлю на один год выше. PHP: foreach( range( 1950, 2020) as $year )
Смотри функции по работе с датой. Самому не стыдно от хардкода? --- Добавлено --- В каждой шутке есть доля правда. Делай выводы, сам же этот материал публикуешь Картинки...
я то думал мне) да что тут поделаешь) как говорится работает это уже хорошо) но функцией можно поделиться которая високосные дни тоже учитывает, спасибо.
PHP: public function formatBirtday( string $string = null ): \DateTime { return new \DateTime( null, new \DateTimeZone( 'Europe/Moscow' ) ); } PHP: cal_days_in_month( CAL_GREGORIAN, $time -> format( 'm' ), $time -> format( 'Y' ) );
в какой связке ? ты же хочешь узнать кол-во дней с учетом февраля https://www.php.net/manual/ru/function.cal-days-in-month.php --- Добавлено --- у тебя вопрос поставлен так, как будто сейчас скопируешь код и якобы будет работать
про функцию я прочитал что она делаешь) но я не понял зачем ты метод разделил, а он оказывается не разделено, просто 2 код он делает то что я просил вчера чтобы показали кол дней узнать)
вообще не понял о чем ты от куда переменная $time? Я сделал так: PHP: var_dump(cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) ) ); проверил действительно возвращает кол дней в месяце. но только не пойму а что оно мне даст, если по логике мне нужно в форму запулить от и до какого количества дней.
Не совсем по поводу вопроса, косвенный вопрос. 1. Почему бы в бд полю, даты дня рождения, по умолчанию сразу не поставить null 2. И потом проверять значение этого поля isset(), а не городить огород такой вот: if(!empty($user_birthday)&&!is_null($user_birthday))
PHP: public function formatBirtday( string $string = null ): \DateTime { return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) ); } --- Добавлено --- 1. по умолчанию у меня и так стоит null 2. а чеж не проверить на null? 3. сейчас код изменил на маус зверя чуть выше этого коммент посмотри, только что отправил.
isset() и проверят на значение и не соответствия null, а это зачем тогда в вашем коде выше public function formatBirtday( $user_birthday ): array { if ( !empty( $user_birthday ) && !is_null( $user_birthday ) ) { return list( $d , $m , $y ) = explode( "-", $user_birthday ); } return []; }
1. по умолчанию у меня и так стоит null 2. а чеж не проверить на null? 3. сейчас код изменил на маус зверя чуть выше этого коммент посмотри, только что отправил. пока не зачем сейчас работаю с этим же методом но другой логикой что маус показал: PHP: public function formatBirtday( string $string = null ): \DateTime { return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) ); } в данном случае я не могу сформировать список дней в форме ввода, а то-есть вывеси тот день который выбрал пользователь при редактировании.
это работает для меня --- Добавлено --- решение такое: PHP: foreach( range( date('Y'), 1950 ) as $year ) --- Добавлено --- @MouseZver PHP: var_dump( cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) ) ); получил количество дней для месяца что это мне дает, объясни? как я его могу применить в куске. PHP: foreach( range( 1, 31 ) as $day ) printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : ''); ну получил кол. дней и дальше что с ним можно сделать?
Понял для чего функция епта. PHP: $test = cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) ); foreach( range( 1, $test ) as $day ) printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : '');