CodeIgniter搜索结果是意外的;哪个()和or_like()坏了?

时间:2013-04-25 21:02:39

标签: mysql database codeigniter search

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

  • 2013-04-25的MySQL表格列为date类型/格式。

  • CodeIgniter 2.1.3

  • 我的搜索条件字符串为date

"test"

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

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

在我的模型中,当我希望我的搜索结果(search =“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()

意外输出:

$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年4月2日这个项目在今天是2013年4月25日?(这就像它部分工作一样,因为它仍然忽略2013-04-02 // <-- why this one??? today is 4/25 2013-05-07 2013-05-21 的项目。)

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

修改

我试过撤消订单:

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())));

结果是一样的。

2 个答案:

答案 0 :(得分:1)

首先,为什么不将MySQL函数用于日期/时间:

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

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

但是,正如评论中所述,根据andor,您的查询可能无法按照您的意愿生成。要测试输出查询的外观,请使用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);

答案 1 :(得分:1)

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

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

使用:

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

or_where 而不是或_like