0
  • 今天的日期是 2013 年 4 月 25 日。是的,服务器上的时间是正确的,并且var_dump正在mdate('%Y-%m-%d', strtotime(now()))返回2013-04-25

  • MySQL 表列datedate类型/格式。

  • 代码点火器 2.1.3

  • 我的搜索条件字符串是"test".

 

$criteria = array(
    'field1' => 'test',
    'field2' => 'test',
    'field3' => 'test'
);

我的数据库中包含“test”一词的四个项目的日期如下:

date
2013-04-02
2013-04-05
2013-05-07
2013-05-21

在我的模型中,当我希望我的搜索结果(搜索 =“测试”)无论日期如何都返回所有内容时,这就是它的样子......

$this->db->start_cache();       
$this->db->or_like($criteria);

$this->db->order_by('date', 'desc');

$this->db->stop_cache();        
$query['results'] = $this->db->get('table', $limit, $offset)->result_array();       
$this->db->flush_cache();       
return $query;

按预期输出:

2013-05-21
2013-05-07
2013-04-05
2013-04-02

以上工作正常,所有四个项目均已退回。


但是,当使用它并且只where()添加 a 以将结果改进到今天甚至更大时......

$this->db->start_cache();   
$this->db->or_like($criteria); // <-- remove this line and it works

$this->db->where('date >=', mdate('%Y-%m-%d', strtotime(now()))); // <-- only new line

$this->db->order_by('date', 'asc');

$this->db->stop_cache();    
$query['results'] = $this->db->get('table', $limit, $offset)->result_array();   
$this->db->flush_cache();   
return $query;

意外输出:

2013-04-02 // <-- why this one??? today is 4/25
2013-05-07
2013-05-21

它应该只显示今天和未来的结果。 那么为什么今天是 2013 年 4 月 25 日的项目日期是 2013 年 4 月 2 日? (这就像它部分工作,因为它仍然忽略带有 . 的项目2013-04-05。)

  • 为什么会这样?
  • 如何解决这个问题?

编辑

我试过颠倒顺序:

$this->db->where('date >=', mdate('%Y-%m-%d', strtotime(now())));
$this->db->or_like($criteria);

和链接:

$this->db->or_like($criteria)->where('date >=', mdate('%Y-%m-%d', strtotime(now())));

和这个:

$this->db->or_like($criteria);
$this->db->where('DATE(date) >= DATE(NOW())');

结果是一样的。

4

2 回答 2

1

首先,你为什么不使用 MySQL 的日期/时间函数:

$this->db->where('DATE(date) >= DATE(NOW())');

(您可能不需要 DATE(日期),而只需要日期)

但是,正如评论中所述,您的查询可能不会按照您的意愿生成,就and和而言or。要测试输出查询的样子,请使用echo $this->db->last_query();. 您始终可以使用自定义字符串编写 Active Records 查询的 where 部分,就像我上面的示例一样,这应该可以解决和/或问题。

所有这些都应该可以帮助您解决问题。

编辑

在聊天会话之后,这是最终的解决方案:

$where = "DATE(date) >= DATE(NOW()) 
          AND 
          (event LIKE '%$your_string%' 
          OR location LIKE '%$your_string%' 
          OR description LIKE '%$your_string%')";
$this->db->where($where);
于 2013-04-25T21:44:07.927 回答
1

我在 ellislab 论坛https://ellislab.com/forums/viewthread/185983/上找到了答案, 而不是使用

$this->db->like('location', $your_string);

利用:

$this->db->where('location LIKE', '%'.$your_string.'%');

or_where而不是or_like

于 2015-02-09T23:45:05.483 回答