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后仍然会发生同样的事情。我添加了一个示例解决方案,你能试试看,告诉我它是否有效吗?