Php 检查用户是否将正确的输入发送到日期\u从\u格式函数创建\u

Php 检查用户是否将正确的输入发送到日期\u从\u格式函数创建\u,php,laravel,Php,Laravel,我有一个表,它有多个列,其中一个是DateTime类型。还有一个搜索框,用户可以在其中插入任何他想要的内容,并且表将根据他插入的值进行过滤。因为我不知道他要根据哪一列进行筛选,所以在从数据库获取数据时,我将他作为筛选器插入的值添加到所有列中。例如: +------------+--------+ | Date | Amount | +------------+--------+ | 01/01/2019 | 1 | +------------+--------+ 如果他按

我有一个表,它有多个列,其中一个是
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\u create\u from\u format
函数,我会得到一个错误:
调用布尔值上的成员函数format()

在PHP手册中,这个函数的返回值是:
返回一个新的DateTime实例,或者失败时返回FALSE。
而实际上不是。失败时,它返回异常,而不是
FALSE


如果要作为参数传递的值不会导致失败,如何在调用
date\u create\u from\u format
之前进行检查?

date\u create\u from\u 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\u create\u from\u 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);
}

date\u create\u from\u 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\u create\u from\u 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);
}

看起来$data_model['filter']是布尔型的,但它需要字符串。确保它是一个带有var_dump($data_model['filter'])的字符串。如果它引发异常,只需使用
try/catch
?可能与@MagnusEriksson重复它不会解决我的问题。如果这会引发异常,那么我如何搜索一次用户键入
1
0
或任何其他将导致功能失败的内容?除非我抓住了所有这些情况,但一定有更好的方法。看起来$data_model['filter']是布尔型的,但它需要字符串。确保它是一个带有var_dump($data_model['filter'])的字符串。如果它引发异常,只需使用
try/catch
?可能与@MagnusEriksson重复它不会解决我的问题。如果这会引发异常,那么我如何搜索一次用户键入
1
0
或任何其他将导致功能失败的内容?除非我抓住了所有这些情况,但一定有更好的方法。尝试了这个,没有效果。删除
->format('Y-m-d')
@niksrb后仍然会发生同样的事情。我添加了一个示例解决方案,你能试试看并告诉我它是否有效吗?尝试了这个,没有效果。删除
->format('Y-m-d')
@niksrb后仍然会发生同样的事情。我添加了一个示例解决方案,你能试试看,告诉我它是否有效吗?