Дата проверки - PullRequest
       0

Дата проверки

1 голос
/ 02 апреля 2020

Я создаю проверку сообщения в моем контроллере.

У меня проблема с датой.

Я создал в приложениях / библиотеках страницу MY_Form_validation. php страница в котором я написал это:

public function valid_date($date, $format = 'Y-m-d') {
    $d = DateTime::createFromFormat($date, $format);
    return $d && $d->format($format) === $date;
}

Затем я создал form_validation_lang. php с

<?php

$lang['form_validation_valid_date'] = 'The field {field} is not a valid date';

В то время как в моем контроллере у меня есть:

//load the libraries

$this->form_validation->set_rules('birthdate', 'birthdate', 'trim|required|valid_date');

 if($this->form_validation->run() == FALSE){
            $errors = $this->form_validation->error_array();
            var_dump($errors);
            $this->response($errors, 500); 
            return;
        }


  $person = array(
//..
'birthdate' => $this->post('birthdate'),
//...
);

Это печатает меня, что:

'birthdate' => 'string'

О моей БД в начале моего поля было Data, и я получил эту ошибку. Чем я изменил на Datetime, но ошибка та же.

Теперь это:

birthdate дата NOT NULL,

Теперь, например, Я пытаюсь опубликовать дату, например «1960-04-20», и получаю сообщение об ошибке:

«дата рождения»: «Дата рождения в поле не является допустимой»

Я хочу написать в БД только дату, а не время, может ли это быть проблемой ?? Как я могу сделать, чтобы проверить дату?

Спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Замените вашу функцию следующим:

public function valid_date($date, $format = 'Y-m-d') { 
    $d = new DateTime($date); 
    return $d && $d->format($format) === $date;
}

Демо

Или следующим:

public function valid_date($date, $format = 'Y-m-d') { 
    $d = DateTime::createFromFormat($format,$date);   // <-- replace arguments
    return $d && $d->format($format) === $date;
}

Демо

DateTime :: createFromFormat () документация

Вам необходимо привести эту строку после успешной проверки, в тип данных DATE и только затем отправьте его в БД. Или вы можете написать "to_date($stringvar,$format)" в вашем запросе SQL.

Похоже, CodeIgniter не любит переменные по умолчанию в опциях проверки. Я имею в виду, вы не можете объявить $format = 'Y-m-d' в качестве аргумента. Таким образом, это будет работать, если вы не будете использовать его:

public function valid_date_dmY($str)
{    
        $d = DateTime::createFromFormat('d.m.Y',$str);    
        return $d && $d->format('d.m.Y') === $str; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...