За последние 24 часа нас посетили 22858 программистов и 1260 роботов. Сейчас ищут 656 программистов ...

Правильно разбить.

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 21 авг 2019.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем доброй ночи, сейчас стараюсь вывести дату при редактировании ее но тут проблемы.
    1. есть бд и поле в бд 'birthday' = 2000-12-30
    2. теперь при вставке в поле мне нужно разделить дату в нужный мне вид делаю так:
    PHP:
    1. $arr = explode("-",$user_info['birthday']);
    теперь я могу получить ключ от каждого куска даты.
    PHP:
    1. print_r( $arr['0']);
    2. print_r( $arr['1']);
    3. print_r( $arr['2']);
    все работает хорошо данные подставляются.

    Но теперь придем к вопросу, уберем дату в бд поставим null:
    1. убрали в бд 'birthday' = ""
    2. пробуем вывести
    PHP:
    1. print_r( $arr['0']);
    2. print_r( $arr['1']);
    3. print_r( $arr['2']);
    ошибка у нас notice undefined ofset 0
    так как ключей у нас таких нет.

    Вопрос:
    Можно ли каким то образом вывести день рождения в нужно нам формате, при этом чтобы для пустого значения birthday не формировалась эта ошибка. Какой функцией можно это проверить?
    я предложу такой способ проверки:
    PHP:
    1. if( $arr === [] )
    2. {
    3. `echo 'вывод даты';
    4. }
    но если нет значения по умолчанию оно null как мне в поля ввода ввести его по умолчанию, какое значение обычно хранят для дня рождения?

    Спасибо.
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    var_dump (); ?
    --- Добавлено ---
    https://www.php.net/manual/ru/datetime.construct.php
     
  3. vvas

    vvas Новичок

    С нами с:
    9 апр 2018
    Сообщения:
    50
    Симпатии:
    10
    бро, $arr это ведь не конечная цель, правда? есть более прямые пути чтобы что-то делать с датой. например strtotime() и потом date() в нужном тебе формате. а на случай если поле было пустое, делай if() или тернарный оператор.
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    upload_2019-8-21_22-23-47.png
    --- Добавлено ---
    date(), strtotime мне не пойдет так как мне поле из базы нужно разделить на три поля) а если и пойдет то код будет большой)
    upload_2019-8-21_22-26-13.png
    вот в эти поля я хочу подставить значение по умолчанию допустим, если значения есть то типа работает так как я хочу, как быть?)
     
    #4 _ne_scaju_, 21 авг 2019
    Последнее редактирование: 21 авг 2019
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    где данные ?
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Тест:
    есть в переменной находится значения null
    $user_info['birthday'] = null;
    PHP:
    1. $d = new DateTime( $user_info['birthday'] );
    2. $g = $d->format("Y"); //
    3. $m = $d->format("m"); //
    4. $de = $d->format("d"); //
    дебаг показывает текущую дату что на компе :D
    Ну и понятно если там находится дата то все хорошо выводит то что нужно.
    --- Добавлено ---
    код что ли, в данных если что ошибка?
    upload_2019-8-21_22-58-23.png
    PHP:
    1.                         <?php
    2.                         # разделяем день рождения на три дня.
    3.                        $arr = explode("-",$user_info['birthday']);
    4.                         ?>
    5.  
    6.                         <div class="birthday"><!-- начало блока дня рождения -->
    7.                             <select name="user_day">
    8.                                 <option>День</option>
    9.                                 <?php for($day = 1; $day <= 31; $day++){ ?>
    10.                                     <option value="<?=$day?>" <?php if($arr['2'] == $day) echo "selected";?>><?=$day;?></option>
    11.                                 <?php } ?>
    12.                             </select>
    13.  
    14.                             <select name="user_month">
    15.                                 <option>Месяц</option>
    16.                                 <?php
    17.                                 $month = [
    18.                                     1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    19.                                     5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    20.                                     9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'];
    21.  
    22.                                     foreach($month as $key => $value)
    23.                                     { ?>
    24.                                         <option value="<?=$key?>" <?php if($arr['1'] == $key) echo "selected";?>><?=$value;?></option>
    25.                                 <?php } ?>
    26.                             </select>
    27.  
    28.                                 <select name="user_year">
    29.                                     <option>Год</option>
    30.                                     <?php
    31.                                     for($year = 1954; $year <= 2019; $year++){ ?>
    32.                                         <option value="<?=$year?>" <?php if($arr['0'] == $year) echo "selected";?>><?php echo $year; ?></option>
    33.                                     <?php } ?>
    34.                                 </select>
    35.                             </div> <!-- конец блока дня рождения -->
    Может кто работает с датой по другому, и посоветует мне, именно для редактирования данных)
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    пустая строка - это не строгий false, а не пустая - не строгий true
    т е можно сделать так:
    PHP:
    1. if ( $user_info['birthday'] ) {
    2.     // дата есть
    3. } else {
    4.     // даты нет
    5. }
     
    _ne_scaju_ нравится это.
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    конечно можно сделать, но и html увеличится, хочется компактности)
    у юзеров изначально их дата равна null вот им нужно зайти в настройки поправить дату а тут notice undefined ofset)
    --- Добавлено ---
    вроде легкая задача а парюсь целый вечер)
    ну как вечер 2 часа)
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    тут все очевидно, что, куда передаешь и почему такие результаты, документация есть. Все.
    --- Добавлено ---
    песочница:
    http://sandbox.onlinephpfunctions.com/
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    PHP:
    1. <?php
    2. # разделяем день рождения на три дня.
    3. list( $y , $m , $d ) = explode( "-", $user_info['birthday'] );
    4. ?>
    5.  
    6. <div class="birthday"><!-- начало блока дня рождения -->
    7.   <select name="user_day">
    8.       <?php
    9.       foreach( range(1, 31) as $day )
    10.       printf( "<option%s>$day</option>", $day == $d ? 'selected' : '' );
    11.       ?>
    12.   </select>
    13.   <select name="user_month">
    14.       <?php
    15.       $months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    16.  
    17.       foreach( $months as $key => $month )
    18.       printf( "<option%s>$month</option>", $key + 1 == $m ? 'selected' : '' );
    19.       ?>
    20.   </select>
    21.   <select name="user_year">
    22.       <?php
    23.       foreach( range( date('Y'), date('Y') - 105 ) as $year )
    24.       printf( "<option%s>$year</option>", $year == $y ? 'selected' : '' );
    25.       ?>
    26.   </select>                    
    27. </div>
    но так же проблема с этим null notice ofset
    Может мне по умолчанию какую либо дату делать а не null?
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    тыкни меня носом туда в документацию.
     
  12. vvas

    vvas Новичок

    С нами с:
    9 апр 2018
    Сообщения:
    50
    Симпатии:
    10
    нет, лучше помучаться, но сэкономить пару букв. :D

    ну вот есть функция прямо для тебя:
    date_parse ( string $date ) : array
    https://www.php.net/manual/ru/function.date-parse
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Логику понял попробуем сделать в моделе, вечерком.
    Эта функция вроде работает, но притик, в значении. null. если даты нет что эта функция будет разбивать? :d
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    ага, логика... нулл надо разбивать...
     
    _ne_scaju_ нравится это.
  16. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    PHP:
    1. echo is_null($date) ? “Укажите др” : date('Год %Y Месяц %m День %d', strtotime(date));
     
    _ne_scaju_ нравится это.
  17. vvas

    vvas Новичок

    С нами с:
    9 апр 2018
    Сообщения:
    50
    Симпатии:
    10
    тыж программист. сделай if на null
    тему в игнор
     
    _ne_scaju_ нравится это.
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Решение:
    Так народ покопался в инете посмотрел ваши примеры и сделал для себя пока чо самый оптимальный вариант если что не нравится поправьте
    PHP:
    1.     public function checkBirtday( $user_birthday )
    2.     {
    3.       if ( ! empty ( $user_birthday ) )
    4.       {
    5.         return list( $d , $m , $y ) = explode( "-", $user_birthday );
    6.       }
    7.       return null;
    8.     }
    таким образом я получаю разделенную дату в нужном виде и возвращаю ее контроллеру, а от контроллера в шаблоне делаю сверку.
    PHP:
    1.  <div class="birthday"><!-- начало блока дня рождения -->
    2.                            <select name="user_day">
    3.                              <option value="0">День</option>
    4.                              <?php
    5.                                  foreach( range(1, 31) as $day )
    6.                                  printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' );
    7.                              ?>
    8.                            </select>
    9.  
    10.                            <select name="user_month">
    11.                                <option value="0">Месяц</option>
    12.                                <?php
    13.                                    $months = [
    14.                                        1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    15.                                        5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    16.                                        9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    17.                                    ];
    18.  
    19.                                    foreach($months as $key => $month)
    20.                                    printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : '');
    21.                                ?>
    22.                            </select>
    23.  
    24.                            <select name="user_year">
    25.                                <option value="0">Год</option>
    26.                                <?php
    27.                                   foreach( range( 1950, 2019 ) as $year )
    28.                                   printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : '' );
    29.                                ?>
    30.                            </select>
    31.                         </div> <!-- конец блока дня рождения -->
    Если значение нет в бд, то в поле день рождения подставляется описание (день, месяц, год).
    Ваше мнение?
     
  19. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Сделать проверку на null, check это true или false. привидение к нужному формату даты, сделать отдельным методом. Установить локаль в ru или юзать i18n.
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Проверку на null сделаю, вот по поводу приведения к нужному формату разве у меня выше метод этого не делает?
    А я как бы думал что я разбиваю дату на три поля или на массив одним словом от 0 до 2, может неправильно реализона?
     
  21. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    checkDate() это название для метода проверки, а не изменения данных. А у тебя метод с таким названием делает две задачи, хотя имя метода говорит о том что он проверяет дату, а значит что возвращает true или false. Это путаница
    --- Добавлено ---
    И ещё у тебя range(1,31), ну блин, високосный год, февраль, 30 и 31 день. Сделай для ввода даты input type=date-local
    --- Добавлено ---
    А на бэке крути как хочешь строку которая пришла
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Я с датой много не сталкивался, для поля день рождения подойдет этот тип?
    Хорошо переделаю, только после работы. Спасибо!
     
  23. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    а день рождения это не дата?
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    это дата, я просто сказал мало работал с датой, то-есть опыта с ним маловато)
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    попытка 2
    в модели делаю метод:
    PHP:
    1.    /*
    2.     * Метод формирует дату рождения в нужный формат
    3.     * при этом он на проверяет дату на пустоту и на null
    4.     * param $user_birthday - дата из бд
    5.     * return возвращаем пустой или заполненный массив с датой
    6.     */
    7.     public function formatBirtday( $user_birthday ): array
    8.     {
    9.       if ( !empty( $user_birthday ) && !is_null( $user_birthday ) )
    10.       {
    11.          return list( $d , $m , $y ) = explode( "-", $user_birthday );
    12.       }
    13.       return [];
    14.     }
    в контроллере обращаюсь к этому методу, показываю не весь блок:
    PHP:
    1.     /**
    2.      * Action для страницы "Редактирование профиля пользователя"
    3.      */
    4.     public function editProfileAction()
    5.     {
    6.         $user = new UserAuth;
    7.         $userEdit = new UserAccount;
    8.  
    9.         $uid = $user -> checkLogged();# проверяем существования uid пользователя в сессии
    10.  
    11.         # получаем информацию о пользователе (login, email, имя, фамилию, год рождения город и т.д.)
    12.        $user_info = $user -> getUserById( $uid );
    13.  
    14.         # получаем дату в нужном формате, $user_info['birthday'] -  это значение из бд
    15.        $birthday = $userEdit -> formatBirtday( $user_info['birthday'] );
    16.  
    17.         if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    18.         {
    19.           {...}
    20.         }
    21.         # подключаем вид
    22.        require_once(ROOT . '/app/views/account/editProfile.php');
    23.         return true;
    24.     }
    ну и дальше делаю в виде вывод:
    PHP:
    1. <?php var_dump($birthday); ?>
    2.  
    3. <div class="birthday"><!-- начало блока дня рождения -->
    4.    <select name="user_day">
    5.      <option>День</option>
    6.      <?php
    7.          foreach( range(1, 31) as $day )
    8.          printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' );
    9.      ?>
    10.    </select>
    11.  
    12.    <select name="user_month">
    13.        <option>Месяц</option>
    14.        <?php
    15.            $months = [
    16.                1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    17.                5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    18.                9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    19.            ];
    20.  
    21.            foreach($months as $key => $month)
    22.            printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : '');
    23.        ?>
    24.    </select>
    25.  
    26.    <select name="user_year">
    27.        <option>Год</option>
    28.        <?php
    29.           foreach( range( 1950, 2019 ) as $year )
    30.           printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : '' );
    31.        ?>
    32.    </select>
    33. </div> <!-- конец блока дня рождения -->

    Тестирования мне показали:
    PHP:
    1. <?php var_dump($birthday); ?>
    при пустом значении даты вывод такой
    upload_2019-8-24_11-45-33.png

    если дата уже была заполнена то вывод такой
    upload_2019-8-24_11-44-38.png

    Ваше мнение?
     
    #25 _ne_scaju_, 24 авг 2019
    Последнее редактирование: 24 авг 2019