我有其中有多个列,其中一人是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
被称为如果是要作为参数传递的价值是不会导致失败过吗?
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);
}