Всем доброй ночи, сейчас стараюсь вывести дату при редактировании ее но тут проблемы. 1. есть бд и поле в бд 'birthday' = 2000-12-30 2. теперь при вставке в поле мне нужно разделить дату в нужный мне вид делаю так: PHP: $arr = explode("-",$user_info['birthday']); теперь я могу получить ключ от каждого куска даты. PHP: print_r( $arr['0']); print_r( $arr['1']); print_r( $arr['2']); все работает хорошо данные подставляются. Но теперь придем к вопросу, уберем дату в бд поставим null: 1. убрали в бд 'birthday' = "" 2. пробуем вывести PHP: print_r( $arr['0']); print_r( $arr['1']); print_r( $arr['2']); ошибка у нас notice undefined ofset 0 так как ключей у нас таких нет. Вопрос: Можно ли каким то образом вывести день рождения в нужно нам формате, при этом чтобы для пустого значения birthday не формировалась эта ошибка. Какой функцией можно это проверить? я предложу такой способ проверки: PHP: if( $arr === [] ) { `echo 'вывод даты'; } но если нет значения по умолчанию оно null как мне в поля ввода ввести его по умолчанию, какое значение обычно хранят для дня рождения? Спасибо.
бро, $arr это ведь не конечная цель, правда? есть более прямые пути чтобы что-то делать с датой. например strtotime() и потом date() в нужном тебе формате. а на случай если поле было пустое, делай if() или тернарный оператор.
--- Добавлено --- date(), strtotime мне не пойдет так как мне поле из базы нужно разделить на три поля) а если и пойдет то код будет большой) вот в эти поля я хочу подставить значение по умолчанию допустим, если значения есть то типа работает так как я хочу, как быть?)
Тест: есть в переменной находится значения null $user_info['birthday'] = null; PHP: $d = new DateTime( $user_info['birthday'] ); $g = $d->format("Y"); // $m = $d->format("m"); // $de = $d->format("d"); // дебаг показывает текущую дату что на компе Ну и понятно если там находится дата то все хорошо выводит то что нужно. --- Добавлено --- код что ли, в данных если что ошибка? Спойлер: говнокод PHP: <?php # разделяем день рождения на три дня. $arr = explode("-",$user_info['birthday']); ?> <div class="birthday"><!-- начало блока дня рождения --> <select name="user_day"> <option>День</option> <?php for($day = 1; $day <= 31; $day++){ ?> <option value="<?=$day?>" <?php if($arr['2'] == $day) echo "selected";?>><?=$day;?></option> <?php } ?> </select> <select name="user_month"> <option>Месяц</option> <?php $month = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря']; foreach($month as $key => $value) { ?> <option value="<?=$key?>" <?php if($arr['1'] == $key) echo "selected";?>><?=$value;?></option> <?php } ?> </select> <select name="user_year"> <option>Год</option> <?php for($year = 1954; $year <= 2019; $year++){ ?> <option value="<?=$year?>" <?php if($arr['0'] == $year) echo "selected";?>><?php echo $year; ?></option> <?php } ?> </select> </div> <!-- конец блока дня рождения --> Может кто работает с датой по другому, и посоветует мне, именно для редактирования данных)
пустая строка - это не строгий false, а не пустая - не строгий true т е можно сделать так: PHP: if ( $user_info['birthday'] ) { // дата есть } else { // даты нет }
конечно можно сделать, но и html увеличится, хочется компактности) у юзеров изначально их дата равна null вот им нужно зайти в настройки поправить дату а тут notice undefined ofset) --- Добавлено --- вроде легкая задача а парюсь целый вечер) ну как вечер 2 часа)
тут все очевидно, что, куда передаешь и почему такие результаты, документация есть. Все. --- Добавлено --- песочница: http://sandbox.onlinephpfunctions.com/
Спойлер: Нашел такой код, более компактней PHP: <?php # разделяем день рождения на три дня. list( $y , $m , $d ) = explode( "-", $user_info['birthday'] ); ?> <div class="birthday"><!-- начало блока дня рождения --> <select name="user_day"> <?php foreach( range(1, 31) as $day ) printf( "<option%s>$day</option>", $day == $d ? 'selected' : '' ); ?> </select> <select name="user_month"> <?php $months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; foreach( $months as $key => $month ) printf( "<option%s>$month</option>", $key + 1 == $m ? 'selected' : '' ); ?> </select> <select name="user_year"> <?php foreach( range( date('Y'), date('Y') - 105 ) as $year ) printf( "<option%s>$year</option>", $year == $y ? 'selected' : '' ); ?> </select> </div> но так же проблема с этим null notice ofset Может мне по умолчанию какую либо дату делать а не null?
нет, лучше помучаться, но сэкономить пару букв. ну вот есть функция прямо для тебя: date_parse ( string $date ) : array https://www.php.net/manual/ru/function.date-parse
Логику понял попробуем сделать в моделе, вечерком. Эта функция вроде работает, но притик, в значении. null. если даты нет что эта функция будет разбивать? :d
Решение: Так народ покопался в инете посмотрел ваши примеры и сделал для себя пока чо самый оптимальный вариант если что не нравится поправьте Спойлер: в модели создал метод PHP: public function checkBirtday( $user_birthday ) { if ( ! empty ( $user_birthday ) ) { return list( $d , $m , $y ) = explode( "-", $user_birthday ); } return null; } таким образом я получаю разделенную дату в нужном виде и возвращаю ее контроллеру, а от контроллера в шаблоне делаю сверку. Спойлер: Шаблон PHP: <div class="birthday"><!-- начало блока дня рождения --> <select name="user_day"> <option value="0">День</option> <?php foreach( range(1, 31) as $day ) printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' ); ?> </select> <select name="user_month"> <option value="0">Месяц</option> <?php $months = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря' ]; foreach($months as $key => $month) printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : ''); ?> </select> <select name="user_year"> <option value="0">Год</option> <?php foreach( range( 1950, 2019 ) as $year ) printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : '' ); ?> </select> </div> <!-- конец блока дня рождения --> Если значение нет в бд, то в поле день рождения подставляется описание (день, месяц, год). Ваше мнение?
Сделать проверку на null, check это true или false. привидение к нужному формату даты, сделать отдельным методом. Установить локаль в ru или юзать i18n.
Проверку на null сделаю, вот по поводу приведения к нужному формату разве у меня выше метод этого не делает? А я как бы думал что я разбиваю дату на три поля или на массив одним словом от 0 до 2, может неправильно реализона?
checkDate() это название для метода проверки, а не изменения данных. А у тебя метод с таким названием делает две задачи, хотя имя метода говорит о том что он проверяет дату, а значит что возвращает true или false. Это путаница --- Добавлено --- И ещё у тебя range(1,31), ну блин, високосный год, февраль, 30 и 31 день. Сделай для ввода даты input type=date-local --- Добавлено --- А на бэке крути как хочешь строку которая пришла
Я с датой много не сталкивался, для поля день рождения подойдет этот тип? Хорошо переделаю, только после работы. Спасибо!
попытка 2 в модели делаю метод: PHP: /* * Метод формирует дату рождения в нужный формат * при этом он на проверяет дату на пустоту и на null * param $user_birthday - дата из бд * return возвращаем пустой или заполненный массив с датой */ public function formatBirtday( $user_birthday ): array { if ( !empty( $user_birthday ) && !is_null( $user_birthday ) ) { return list( $d , $m , $y ) = explode( "-", $user_birthday ); } return []; } в контроллере обращаюсь к этому методу, показываю не весь блок: Спойлер: контроллер PHP: /** * Action для страницы "Редактирование профиля пользователя" */ public function editProfileAction() { $user = new UserAuth; $userEdit = new UserAccount; $uid = $user -> checkLogged();# проверяем существования uid пользователя в сессии # получаем информацию о пользователе (login, email, имя, фамилию, год рождения город и т.д.) $user_info = $user -> getUserById( $uid ); # получаем дату в нужном формате, $user_info['birthday'] - это значение из бд $birthday = $userEdit -> formatBirtday( $user_info['birthday'] ); if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { {...} } # подключаем вид require_once(ROOT . '/app/views/account/editProfile.php'); return true; } ну и дальше делаю в виде вывод: Спойлер: вид PHP: <?php var_dump($birthday); ?> <div class="birthday"><!-- начало блока дня рождения --> <select name="user_day"> <option>День</option> <?php foreach( range(1, 31) as $day ) printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' ); ?> </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) printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : ''); ?> </select> <select name="user_year"> <option>Год</option> <?php foreach( range( 1950, 2019 ) as $year ) printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : '' ); ?> </select> </div> <!-- конец блока дня рождения --> Тестирования мне показали: PHP: <?php var_dump($birthday); ?> при пустом значении даты вывод такой если дата уже была заполнена то вывод такой Ваше мнение?