检查用户是否将正确的输入发送到date_create_from_format函数

时间:2019-02-05 10:37:03

标签: php laravel

我有一个包含多个列的表,其中之一是DateTime类型的。还有一个搜索框,用户可以在其中插入他想要的任何内容,并且该表将被其插入的值过滤。由于我不知道他要过滤哪一列,因此在从数据库中获取数据时,我会将他作为过滤器插入的值添加到所有列中。因此,例如:

+------------+--------+
|    Date    | Amount |
+------------+--------+
| 01/01/2019 |      1 |
+------------+--------+

如果他按日期搜索,则我在代码中处理得很好,并且一切正常:

$date = date_create_from_format('m/d/Y', $data_model['filter'])->format('Y-m-d');
if($date) {
    $query->orWhere('date', 'like', $date);
}

但是,如果他想按数量进行搜索并在搜索框中输入“ 1”,那么一旦该值进入date_create_from_format函数,我就会收到错误消息:Call to a member function format() on boolean

在PHP手册中,该函数的返回值是:Returns a new DateTime instance or FALSE on failure.,实际上不是。失败时,它将返回异常而不是FALSE

如何在调用date_create_from_format之前检查是否将要作为参数传递的值不会导致其失败?

1 个答案:

答案 0 :(得分:2)

date_create_from_format实际上返回了false。因此,如果我们逐步执行代码,则会发生这种情况:

我们假设$data_model['filter'] = 1

$date = date_create_from_format('m/d/Y', $data_model['filter'])->format('Y-m-d');
$date = date_create_from_format('m/d/Y', '1')->format('Y-m-d');   // $data_model['filter'] = 1
$date = FALSE->format('Y-m-d');                                   // date_create_from_format returns false
// An exception is thrown because you can't call a method on a boolean

所以正确的解决方案是首先存储来自date_create_from_format的结果,并检查其是否为FALSE。如果没有,您可以致电->format('Y-m-d')

一种可能的解决方案是:

$date = date_create_from_format('m/d/Y', $data_model['filter']);
if ($date !== false) {
    $date = $date->format('Y-m-d');
    $query->orWhere('date', 'like', $date);
}