使用codeigniter,如使用通配符查询

时间:2015-03-04 18:12:26

标签: php codeigniter sql-like

我正在尝试在Codeigniter上使用like查询。该函数将我的百分号%转义为\%

我的查询是:

SELECT *
        FROM (`invoices_rent`)
        WHERE `clerk_name` =  'BEAUTY'
        AND  `date`  LIKE '\%/\%/\%' 

$this->db->like('date', $date, 'none');

我该怎么做才能防止百分号被转义?

我正在尝试使用可以接收数字或通配符的日期创建过滤器。所以我想要的是以一种我可以获得用户想要的月,年或日期的方式加入这些数据。所以我会转到查询“%/ 02/2015”或“%/%/ 2015”来返回我需要的数据范围。但是我遇到了关于函数转义的问题。 我想我需要创建整个查询,而不是使用这个CodeIgniter函数来创建它。遵循实际的模型功能。

$date = "%/03/2015";

public function getallinvoices($type = false, $date = false, $clerk = false)
{
    if($type == "m")
        $table = "invoice_month";
    else
        $table = "invoices_rent";

    if($date != false)
        $this->db->like('date', $date, 'none');

    if($clerk != false && $clerk != "all")
        $this->db->where('clerk_name', $clerk);

    $query = $this->db->get($table);

    $this->output->enable_profiler(TRUE);
    print_r($query);

    return $query->result_array();
}

我希望查询返回如下:

SELECT *
FROM (`invoices_rent`)
WHERE `clerk_name` =  'BEAUTY'
AND  `date`  LIKE '%/03/2015'

1 个答案:

答案 0 :(得分:2)

我不确定你到底想要做什么。
添加第3个参数none不会在值周围添加通配符(%)(在您的情况下,它可能会escape

来自 docs

  

如果您不想使用通配符(%),则可以将选项' none'传递给可选的第三个参数。   

$ this-> db-> like(' title',' match',' none');
  //生成:WHERE标题LIKE'匹配'

因此,如果您想使用通配符,只需删除第三个参数。


(仅供参考)
假设表,

`invoices_rent`

id    rent    invoice_number    clerk_name     date
1     150        INV001           BEAUTY     2015-03-04
2     250        INV002           BEAUTY01   2015-02-05
3     350        INV003           BEAUTY     2015-03-04

查询,

$date = '2015-03-04';
$this->db->like('date', $date);
$this->db->where('clerk_name');
$query = $this->db->get('invoices_rent');

return $query->result();

/**
* Result will give id: 1 & 3 as output
*/


修改

根据您更新的问题,基本上您想要2015年3月的所有行。您正在尝试的内容绝对不是查询日期范围时的正确方法。您可以做的就是获得月初(例如2014-03-01)和月末(2014-03-31)并使用between clause,这将为您提供所有行月3月 以下是您的查询。

$month_start = date('Y-m-01', 'March');   # Month's start
$month_end = date('Y-m-t', 'March');      # Month's end

$this->db->where('date >=', $month_start);
$this->db->where('date <=', $month_end);
$this->db->where('clerk_name');
$query = $this->db->get('invoices_rent');

return $query->result();

/**
* Result will give id: 1 & 3 as output
*/