我有一个包含多个列的表,其中之一是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
之前检查是否将要作为参数传递的值不会导致其失败?
答案 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);
}